1、继承概述:根据多个类中的共性内容,向上抽取而来;
让类与类之间产生关系(子父类关系),子类可以直接使用父类中非私有的成员;
(1)继承的格式:
格式:public class子类名extends父类名{}
例子:public class Zi extends Fu{};Fu是父类,也称基类,超类; Zi子类,也称派生类;
(2)继承的好处和短板
好处:提高代码的复用性、维护性;类与类之间产生关系,是多态的前提;
短板:继承是侵入性,
降低代码的灵活性;继承关系,导致子类必须拥有父类非私有属性和方法,让子类自由的设计界多了约束
增强代码的耦合性:代码与代码之间存在关联都可以将其称为耦合;
(3)应用场景
当类与类之间存在相同的内容,且产生了isa的关系,可以使用继承,来优化代码;
(4)继承的特点:
Java只支持单继承,不支持多继承,但支持多层继承;
多层继承:子类A继承父类B,父类B可以继承父类C;
(5)继承的成员变量访问特点
在子类方法中访问一个变量:
子类局部范围找;子类成员范围找;父类成员范围找;
注意:如果子父类中,出现了重名的成员变量,通过就近原则,会优先使用子类的,如果一定要使用父类的,可以通过super关键字来进行区分;
(6)、super和this关键字的用法相似:
this代表本类对象引用,super代表父类存储空间的表示(父类对象的引用);
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
this | this.成员变量,访问本类成员变量 | this.成员方法(),访问本类成员方法 | this(…)访问本类构造方法 |
super | super.成员变量,访问父类成员变量 | super.成员方法(),访问父类成员方法 | super(..)访问父类构造方法 |
(7)继承中成员方法的访问特点
通过子类对象访问一个方法:子类成员范围找;父类成员范围找;
2、方法重写
在继承体系中,子类出现了和父类中一模一样的方法声明;
(1)应用场景:
当子类需要父类的功能,而功能主体子类有自己特有内容,可以重写父类中的方法,这样,沿袭父类功能,有定义子类特有的内容;
(2)方法重写和重载
方法重写:在继承体系中,子类出现了和父类一模一样的方法声明(方法名,参数列表,返回值类型)
方法重载:在同一个类中,方法名相同,参数列表不同,与返回值无关;
(3)方法重写注意事项
父类中私有方法不能被重写
父类静态方法,子类必须通过静态方法进行重写,父类非静态方法,子类也必须通过非静态方法进行重写;
注意:静态方法不能被重写!如果子类中,也存在一个方法声明一模一样的方法,可以理解为,子类将父类中同名的方法,隐藏起来,并非是方法重写;
子类重写父类方法时,访问权限必须大于等于父类;
(4)权限修饰符
修饰符 | 同一个类中 | 同一个包中子类无关类 | 不同包的子类 | 不同包的无关类 |
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
3、构造方法访问特点
(1)子类中所有的构造方法默认都会访问父类中无参数构造方法;子类在初始化时,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类数据;子类初始化之前,一定要先完成父类初始化;
(2)系统在每个构造方法中,默认隐藏的依据代码super();构造方法的第一条语句默认都是super();
(3)如果编写的类,没有手动指定父类,系统也会自动继承object(Java继承体系中的最顶层父类)编写的每个类都默认继承object类;
(4)父类中没有无参构造,只有有参构造;
子类通过super,手动调用父类的带参构造方法;
子类通过this去调用本类的其他构造方法,本类其他构造方法再通过super去手动调用父类的带参构造方法;
总结:
this(…)super(…)必须放在构造方法的第一行有效语句,并且两者不能共存;
子类中所有的构造方法,默认都会通过super()访问父类中无参的构造方法;
每个子类构造方法的第一条语句默认是super();