006-面向对象编程-继承
面相对象编程-继承
什么是继承?
-
Java中提供了一个关键字extends,用这个关键字可以让一个类和另一个类建立起父子关系
public class B extends A { }
-
子类能继承什么?
- 子类能继承父类的非私有成员(成员变量、成员方法)
-
继承后对象的创建
- 子类的对象是由子类、父类共同完成的
权限修饰符
- 权限修饰符是用来先知类中的成员(成员变量、成员方法、构造器)能被访问的范围
- 分类:
- private:只能本类
- 缺省:本类、同一个包中的类
- protected:本来、同一包中的类、子孙类
- public:任意位置
- private < 缺省 < protected < public
- 一般规范:成员变量一般用私有,成员方法一般公开
继承的特点
-
单继承:一个类只能继承一个直接父类
-
多层继承:不支持多继承,单可以支持多层继承,如父类还继承于父类的父类
-
祖宗类:所有Java类都是Object类的子类
- 一个类一定直接或间接继承自Object,不显式继承Object也会默认继承Object
-
就近原则:优先访问自己类中,自己类中没有才会访问父类
- 如果子类和父类中有重复的成员变量名或方法名,那么在子类中不写this或者写上this都是访问子类中的变量和方法,如果必须访问父类变量或方法,那么要用super去点那个变量或方法
-
注意:
- 一个文件里可以有多个类,但只能有一个public类
方法重写
-
当子类觉得父类中的某个方法不好用,或者无法满足自己需求时,子类可以重写一个方法名、参数列表一样的方法,去覆盖这个方法
-
根据就进原则,优先调用的是子类的方法
-
在重写方法上面加上
@Override
:@Override
是方法重写的校验注解(标志):要求方法名称和形参列表必须与被重写方法一致,否则报错!- 更安全,可读性好,更优雅
-
注意:
- 子类重写父类方法时,访问权限必须大于或等于父类该方法的权限
- 重写的方法返回值类型必须与被重写方法的返回值类型一样或更小
- 私有方法、静态方法不能被重写,如果重写会报错
-
常见应用场景:
- 子类重写Object类的toString()方法,以便返回对象的内容
- 打印一个对象时默认调用toString()方法,可以省略不写
- Object类的toString()方法是输出所谓的地址的
- 开发中更希望输出对象时看对象的内容信息,所以子类需要重写Object的toString()方法,以便以后输出对象时默认就近调用子类重写的toString()方法返回对象内容
- 可以右键生成
- 子类重写Object类的toString()方法,以便返回对象的内容
子类构造器的特点
- 子类的全部构造器都会先调用父类的构造器,再执行自己的构造器内容
- 子类构造器是如何实现调用父类构造器的?
- 默认情况下,子类的全部构造器的第一行代码都是super(),无论写不写都有,它会调用父类的无参构造器
- 如果父类没有无参构造器,则我们必须在子类构造器的第一行手写super(...),指定去调用父类的参数构造器
- 无法直接在子类中设置有参构造器给父类的变量赋值,需要调用父类的有参构造器给父类变量赋值,再写代码给自己类中变量赋值
this(...)调用兄弟构造器
- 如果想默认其中的一些变量的初始化,可以直接用this(...)调用兄弟构造器,而把其中一些值设置为想设置的默认值
- 注意:super(...)和this(...)都只能卸载构造器的第一行,而且两者不可共存
- 不能共存是因为兄弟构造器调用过父类构造器
- this(...)要放第一行是因为要先通过兄弟构造器调用父类构造器