Java SE--继承
一.为什么要继承呢?
可以保持原有类的功能上扩展新功能,继承主要解决的问题是共性的抽取,实现代码的复用
二.继承的语法
举例:
相关图像:

三.父类成员访问
1.子类中(注意)访问父类的成员变量
了解原因:继承下来父类成员可能与子类成员同名时(主要原因),在子类成员方法中访问该类成员时该访问哪一个?或者利用子类对象引用同名成员时该访问哪一个?
在子类方法中(在父类方法不一样)或子类对象访问成员时:
如果访问的成员变量子类中有,优先访问自己的成员变量。
如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义。
如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
举例和相关图像:
2.子类中访问父类的成员方法
在子类方法中或子类对象访问成员方法时:
通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;如果父类和子类同名方法的参数列表相同(重写以后会讲),成员方法访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
举例和相关图像:
问题:如果出现在继承时出现同名成员变量或方法时,我们该在子类中如何访问与父类的成员变量和方法同名的成员变量和方法呢?
四.super关键字
作用:在子类中访问父类的成员变量和方法
五.子类构造方法
1.若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
2.如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3.在子类构造方法中,super(..)调用父类构造时,必须是子类构造函数中第一条语句。
4.super(..)只能在子类构造方法中出现一次,并且不能和this同时出现(讲this和super区别会讲)
六.this和super的区别
相同点:
1.都是lava中的关键字
2.只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3.在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
不同点:
1.this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2.在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3.在构造方法中:this(..)用于调用本类构造方法,super(..)用于调用父类构造方法,俩者都必须是构造方法的第一条语句,所以两种调用不能同时在构造方法中出现
4.构造方法中一定会存在super(..)的调用,用户没有写编译器也会增加,但是this(..)用户不写则没有
七.再谈初始化
之前在谈初始化时执行顺序时没有继承,那继承时执行顺序会是什么样呢?
由上述代码加上之前学习的对执行顺序进行总结:
步骤 | 类别 | 执行类容 |
1 | 父类静态 | 父类static修饰的成员变量初始化----》父类静态代码块 |
2 | 子类静态 | 子类static修饰的成员变量初始化----》子类静态代码块 |
3 | 父类实例 | 父类实例变量初始化---》父类实例代码块---》父类构造方法 |
4 | 子类实例 | 子类实例变量初始化---》子类实例代码块---》子类构造方法 |
八.protected(类和对象补充访问限定符)
代码举例:
九.继承方式
1.单继承
2.多层继承(最好别超过3层)
3.不同类继承一个类
4.多继承(不支持)
十.final关键字
1.修饰变量或字段(类中成员变量):表示常量(既不能修改)
2.修饰类:表示该类不能被继承,叫做密封类
3.修饰方法:表示该方法不能被重写(以后讲)
十一.继承和组合
继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
组合表示对象之间是has-a的关系,比如:汽车和其轮胎、发动机、方向盘、车载系统等的关系就应该是组合,因为汽车是有这些部件组成的