java基础--笔记8

来源:互联网 发布:spark大数据分析 pdf 编辑:程序博客网 时间:2024/05/16 03:37

小结:关于继承中内存加载顺序
     父类的class文件先进方法区,子类的后进。子类创建对象时,对象中会有父类的和子类的变量。接着子类的构造函数进栈,由于隐式的super()语句,父类的构造函数也进栈,父类的成员变量初始化后,出栈了,接着子类的初始化,出栈。对象创建完成。执行主函数中语句。

extends 继承
1,提高代码复用性
2,让类与类之间产生了关系,有了这个关系,才有了多态的特性。
注意:千万不要为了获取其他类的功能,简化代码而继承,必须是类于类之间有所属关系才可以继承。

java语言中:java只支持单继承,不支持多继承。
因为多继承容易带了安全隐患:当多个父类中定义了相同功能,当功能内容不同时,子类对象不确定要运行哪一个。
但是java保留了这种机制,并且用另一种体现形式来完成表示,多实现。

如何使用一个继承体系中的功能:
想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。
通过了解共性功能,就可以知道该体系的基本功能。那么这个体系已经可以基本使用了。
那么在具体调用时,要创建最子类的对象,为什么呢?
一是因为有可能父类不能创建对象。
二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。
简单一句话:查阅父类功能,创建子类对象使用功能。

聚集: 聚合,组合。
聚合:
组合:

类中成员:
1,变量
2,函数
3,构造函数

1,变量
如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this。
子类要访问父类中的同名变量时,用super。
super的使用和this的使用几乎一致
this代表的是本类对象的引用
super代表的是父类对象的引用

2,函数
当子类出现和父类一模一样的函数时。
当子类对象调用该函数,会运行子类函数的内容。
如同父类函数被覆盖一样。
这种情况是函数的另一个特性:重写(覆盖)

覆盖:
1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
2,静态只能覆盖静态

重载:只看同名函数的参数列表
重写:子父类要一模一样

3,子父类的构造函数
在对子类对象进行初始化时,父类的构造语句也会运行。那是因为子类的构造函数默认第一行有一条隐式的语句super();
super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();

为什么子类一定要访问父类的构造函数?
因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。

注意:super一定要定义在子类函数的第一行。

子类的实例化过程:
子类中所有构造函数,默认都会访问父类构造函数的第一行。因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问的构造函数。
当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。


final 关键字 最终
1,作为一个修饰符,可以修饰类,函数,变量。
2,被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。。
3,被final修饰的方法不会被复写。
4,被final修饰的变量(成员变量,局部变量)是一个常量只能赋值一次,既可以修饰成员变量,也可以修饰局部变量。
当在描述事物时:一些数据的出现是固定的,那么这时为了增强阅读性,都给这个值起个名字。方便于阅读,而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词间通过_连接。
5,内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。

抽象  abstract:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象,因为调用抽象方法没意义。
4,抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是个抽象类。

抽象类里面的方法是抽象方法,即抽象类中的方法没有方法体。创建的对象调用抽象方法是没有任何意义的,所以抽象类不可以创建对象。

     
抽象类的细节:
1:抽象类中是否有构造函数?
有,用于给子类对象进行初始化。
2:抽象类中是否可以定义非抽象方法?
    可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象函数。而且比一般类少了一个创建对象的部分。
3:抽象关键字abstract和哪些不可以共存?
final , private , static
4:抽象类中可不可以不定义抽象方法?
可以。抽象方法目的仅仅为了不让该类创建对象。
 5:抽象类一定是父类,但不一定是顶层父类。抽象类中的方法一般都是抽象方法,需要子类继承后去复写其中的抽象方法。
 

模板设计方法:
在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。由该类的子类去完成。

接口:当一个类中的所有方法都是抽象方法时,这个类就是接口。
class用于定义类。
interface用于定义接口。
格式:
interface 接口名称
{
接口中的成员;
}
1,接口中定义的成员变量都是常量
2,接口中的成员都有固定修饰符
常量:public static final 
public 
static 静态修饰的方法,可以通过类名调用。而抽象方法,它没有方法体,用类名调用这个抽象方法没有任何意义。
final
方法:public abstract
记住:接口中的成员都是public的。
接口是不可以创建对象的,因为有抽象方法。需要被子类实现,子类接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类。

接口可以被类多实现implements。也是java对多继承不支持的转换形式。

接口和接口之间是继承关系,并且可以多继承。

类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。因为接口中的方法都在抽象方法,即使多个接口中有相同的方法,子类只要实现一个即可,创建子类对象,调用方法,不管这个方法是哪一个接口中的,最终都是在执行子类中实现的那个方法。

接口的应用:
     在描述时,如果这个事物(猫和狗)已经具备了这一类事物(动物)的共性,我们需要把这些共性内容进行抽取,抽取到他们的父类(动物)中。这时这个事物(猫和狗)就继承了父类。如果这个事物(猫和狗)还具备其他的功能(搜救)时,这些功能定义在其他类中,这时由于这个事物它已经继承了父类,无法再继承搜救所属的这个类。这时就需要把不属于这类事物的共性内容定义到接口中,只要这个事物实现这个具备搜救功能的接口即可。

接口都用于设计上,设计上的特点:(可以理解主板上提供的接口)
1:接口是对外提供的规则。
2:接口是功能的扩展。
3:接口的出现降低了耦合性。(软件开发规则:低耦合高内聚)
抽象类与接口:
抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取,特点:可以在类中定义抽象内容让子类实现,可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。
接口:一般用于定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能。
抽象类和接口的共性:都是不断向上抽取的结果。
抽象类和接口的区别:
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类去实现。
3:抽象类使用的是  is a 关系。
接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。全都是public的。
5:抽象类它描述的是事物的体系,事物的共性内容。
     接口中描述某些特殊功能,而这个功能并不是这个体系共有的。
6:抽象类中有构造函数。接口中没有。接口中的变量都是常量,抽象类中的变量就是一个普通的变量。
在开发之前,先定义规则,A和B分别开发,A负责实现这个规则,B负责使用这个规则。至于A是如何对规则具体实现的,B是不需要知道的。这样这个接口的出现就降低了A和B直接耦合性。

类是干什么的呢?
用java中的类来描述现实生活中的事物,当我们在描述多个事物的时候,发现这些事物具有共性的内容。这时我们把共性的内容进行抽取,形成父类。可是在描述父类的时候发现这些父类的具体功能体无法详细的书写。我们就把功能体省略,那么这个行为就变成了抽象的行为。

接口:
     当抽象类中的所有方法都是抽象方法时,这个类我们使用接口来描述。接口中也是在描述功能,只不过接口中的功能都是抽象的。在使用接口时,当描述一个事物体系,其中某些事物具备了这个体系中没有的特殊功能,这些功能它不属于这个体系,但是属于这个体系中的某些事物。当这些事物具备这个特殊功能时,我们就让这些事物去实现这个描述特殊功能的接口。
0 0