面向对象中的继承

一、继承
1.概述:多个类中存在相同的属性和行为,将这些类抽取的一个单独的类中
class 子类名 extends 父类名 {}
2.被继承的类:父类/超类/基类
3.继承的类:子类/扩展类
4.子类继承父类,子类可以拥有父类中非私有的所有成员
5.好处:提高了代码的复用性
提高了代码的维护性
让类与类之间产生了关系,是多态的前提
类是对对象的抽象,继承是对对某一批类的抽象,从而实现对现实界更好的建模

6. java继承的特点: java只支持单继承,不支持多继承
子类=父类+新增的变量+新增的方法
java支持多层继承
什么时候使用继承?
7. public 子类名 extends 父类名(){
super();
}
8.注意点:子类的动态方法里才有super, 才能修改来自于父类的属性或方法
父类与子类中没有同名属性时不需要通过this 和super 区分
动态方法处理的是super 的属性,处理成员变量,和具体的实例绑在一起的
java只支持单继承,不支持多继承 子类=父类+新增的变量+新增的方法
9.继承的初始化顺序:
a 初始化父类再初始化子类
b 先执行初始化对象中的属性,再执行构造方法中的初始化。
父属性>父方法>子属性>子方法
10继承小结:
* 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造函数)
* java中类只有单继承,无多继承 (接口可以有多继承)
多继承,就是为了实现代码的复用性,却引入复杂性,使得系统之间的关系混乱。
* 如果定义一个类时,没有调用extends,则他的父类是java.lang.Object
* private 无效

二、同名情况
1.子类父类成员变量名相同的情况下,获取本类的成员变量
方法中包含有同名的变量名称,获取的是方法里的局部变量(就近原则)
2.在成员变量名称一致的情况下:
获取父类成员变量:super(父类对象的属性)
获取子类成员变量:this
获取方法的成员变量:

三、继承中的成员方法
1.方法名不同:子类直接继承父类中的非私有的方法
2.方法名相同:就近原则(子类局部范围(方法) -> 子类成员范围 ->父类成员范围 ->报错)
重写 * 两个方法不是同一个类
* 方法名称一致
* 重写的方法的权限不能低于被重写的方法权限
* 方法的参数类型一致
标识为final的方法不能被重写,静态方法不能被重写。
静态方法形式上可以重写,但那实际上不是重写,相当于对其隐藏
私有方法不能被重写   因为私有方法根本就不能继承

重载 * 方法名一致
* 返回类型一致
* 权限一致
* 两个方法在同一个类中
* 参数列表不一致
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即延续父类的功能,又定义了子类特有的内容。
3.在子类的重写方法中调用父类的方法: super.父类 方法
4.静态的方法只能重写静态方法
5.子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法,子类构造方法首行默认调用无参的父类构造方法super();
6.创建子类对象的时候会先初始化父类,默认调用父类的无参构造方法

四、继承中的构造函数
1.继承中的构造函数,系统默认有一个空参的构造函数
2.子类的构造函数中默认会有一个super();代码来调用父类的空参构造函数
因为子类要继承父类中的成员,那么父类应该先初始化才产生成员变量和方法
3. this 和super的区别
this.成员变量调用的是本类的成员变量 super.成员变量调用的是父类的成员变量
this()调用的是本类的构造函数 super调用的是父类的构造函数
this(参数)调用的是本类的有参构造函数 super调用的是父类的有参构造函数
this(...)或者super(...)必须出现在第一条语句上
如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。( java中第一行默认构造函数为空)
4.如果父类没有空参构造函数那么子类必须调用this(参数)或super(参数)有参数的构造函数才可以初始化
5. 因为子类在初始化之前,首先会初始化父类,它要继承或使用父类的数据
如果父类没有无参构造方法,那么子类的构造方法会报错
解决方案:A:在父类中加一个无参构造方法
B:通过使用super关键字去显示的调用父类的带参构造方法
C:子类通过this去调用本类的其他构造方法
子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。
面向对象中的继承