把多个类中相同的内容给提取出来定义到一个类中。多个类可以称为子类,单独的这个类称为父类或者超类。通过extends关键字让类与类之间产生继承关系。
格式:
class Fu{}
class Zi extends Fu{}
好处:
A:提高了代码的复用性。
B:提高了代码的维护性。
C:让类与类之间产生了关系,是多态的前提。
弊端:
类与类之间产生了关系,其实也是继承的弊端,因为类的耦合性增强了。而开发的原则是低耦合,高内聚
耦合:类与类的关系
内聚:就是自己完成某件事情的能力。
特点:
java只支持单继承,支持多继承。但是保留了这种多继承机制,进行改良,就是多层继承。
如A继承B B继承C C继承D。这就有了继承体系,体系中的顶层父类是通过不断向上抽取而来的。
它里面定义的该体系最基本最共性内容的功能。
对于一个继承体系的使用,就是查阅顶层父类中的内容,创建最底层子类的对象。
注意事项:
A:子类只能继承父类所有非私有的成员(成员方法和成员变量)
B: 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
C:不能为了部分功能而去继承,必须是"is a"的关系。如苹果--水果。
二、super关键字&方法重写
子父类出现后,类成员的特点:
类中成员:
1:变量。
如果子类中出现了非私有的同名成员变量时,
子类要访问本类中的变量,用this
子类要访问父类中的同名变量,用super。
super 的使用和this的使用几乎一致。
this 代表的是本类对象的引用。
super代表的是子类所属的父类中的内存空间引用。
2:子父类中函数。
当子类对象调用和父类一模一样的函数时,会运行子类函数的内容。如同父类的函数被覆盖一样。
这种情况是函数的另一个特性:重写(覆盖)。
当子类继承了父类,沿袭了父类的功能,到子类中,但子类虽具备该功能,但是功能的内容却和父类不一致,
这时,没有必要定义新功能,而是使用覆盖特性,保留父类的概念定义,并重写功能内容。
注意事项:
1.子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,并重写功能。
2.静态只能覆盖静态。
3.父类中的私有方法不可以被覆盖
重载与重写
重载:只看同名函数的参数列表。
重写:子父类方法要一模一样。
3:子父类中的构造函数。
第一行第一条隐式的语句super();在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认
super():会访问父类中空参数的构造函数,而且子类中所以的构造函数默认第一行都是super()。
子类一定要访问父类中的构造函数。因为父类中的数据子类可以直接获取,所以子类对象在建立时,
需要先查看父类是如何对这些数据进行初始化的。如果要访问父类中的指定的构造函数,可以通过
手动定义super语句的方式来指定。
4:子类的实例化
会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。因为子类继承父类,
注意事项:
super语句一定定义在子类构造函数的第一行。
因为super()或者this()都是调用构造函数,构造函数用于初始化,所以初始化的动作要先完成。
一个构造方法中super或this只能有一个。
结论:
A:子类的所有的构造函数,默认都会访问父类中空参数的构造函数。
因为子类的每一个构造函数的第一行都有一句隐式super();
B:当父类中没有的空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。
C:如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问
父类中的构造函数。
三、final关键字
1:是最终的意思,可以修饰类,方法,变量。
2:特点
A:它修饰的类,不能被继承。
B:它修饰的方法,不能被重写。
C:它修饰的变量,是一个常量,只能被赋值一次。
3:写作规范
4:final修饰局部变量的问题常量单词所有字母都大写,多个单词,中间用_连接。
基本类型:基本类型的值不能发生改变。
引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。
四、多态
同一个对象在不同时刻体现出来的不同状态。多态性简单的说就是一个对象对应着不同的类型。1:多态的前提:
A:有继承或者实现关系。
B:有方法重写。
C:有父类或者父接口引用指向子类对象。
2:多态的分类:
a:具体类多态
class Fu {}class Zi extends Fu {}
Fu f = new Zi();
b:抽象类多态
abstract class Fu {}class Zi extends Fu {}Fu f = new Zi();
c:接口多态
3:多态中的成员访问特点interface Fu {}class Zi implements Fu {}Fu f = new Zi();
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造
C:成员方法
编译看左边,运行看右边。因为成员方法有重写。
D:静态方法
编译看左边,运行看左边 。因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
4:多态的好处:
A:提高代码的维护性(继承体现)5:多态的弊端:
B:提高代码的扩展性(多态体现)
父不能使用子的特有功能。 子可以当作父使用,父不能当作子使用。
6:多态中的转型
A:向上转型——从子到父
B:向下转型——从父到子
对于转型,自始至终都是子类对象在做类型的变化
7:instanceof
如果想用子类对象的特有方法,需要进行健壮性判断,判断对象是否实现了指定的借口
或继承了指定的类。
格式
对象 instanceof 类型。判断一个对抓是否所属于指定的类型
如 Student instanceof Person = true;//Student类继承了Person类。
五、抽象类
Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,
包含抽象方法的类就是抽象类。
1:抽象类的特点
A:抽象类和抽象方法必须用关键字abstract修饰。
B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
C:抽象类不能实例化。
D:抽象类的子类
a:可以是一个抽象类。
b:可以是一个具体类。这个类必须重写抽象类中的所有抽象方法,才可以实例化。
E:抽象类不可以与private, static, final共存。
2:抽象类的成员特点:
A:成员变量
有变量,有常量。
B:构造方法
有构造方法,用于给子类对象进行初始化。
C:成员方法
有抽象,有非抽象。
3:抽象类与一般类的区别
相同点:
抽象类和一般类都是用来描述事物的,都在内部定义了成员
不同点:
A:一般类有足够的信息描述事物
抽象类描述事物的信息有可能不足
B:一般类中不能定义抽象方法,只能定义非抽象方法
抽象类中可定义抽象方法,同时也可以定义非抽象方法
C:一般类可以被实例化
抽象类不可以被实例化
六、接口
1:接口的特点:当一个抽象类的方法都是抽象的时候,这时可以将该抽象类用另一个形式定义和表示,就是接口。
接口是对外暴露的规则,是程序的功能扩展。
接口的出现避免了单继承的局限性,也降低了耦合性。
A:接口用关键字interface修饰
格式:interface 接口名 {}
B:类实现接口用implements修饰
格式:class 类名 implements 接口名 {}
C:接口不能实例化
D:接口的实现类
a:可以是一个抽象类。
2:接口的成员特点:b:可以是一个具体类,这个类必须重写接口中的所有抽象方法。
A:成员变量
只能是常量默认修饰符:public static final
B:构造方法
没有构造方法
C:成员方法
3:类与类,类与接口,接口与接口只能是抽象的默认修饰符:public abstract
A:类与类
继承关系,只能单继承,可以多层继承。
B:类与接口
实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时,实现多个接口。
C:接口与接口
继承关系,可以单继承,也可以多继承。
4:抽象类与接口的区别
A:抽象类需要被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
B:抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。
接口中只能定义抽象方法,必须由子类去实现。
C:抽象类的继承,是is a 关系,定义该体系的基本共性内容。
接口的实现是like a关系。
D:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的,全都是public的。