父类与子类是从一般到特殊的关系,用”is-a”表示,在父类中存放共同的状态和行为即实例字段和实例方法,子类存放个体独有的成员数据
Java的继承语法格式
[修饰符] class 子类 extends 父类 {...}
通过继承,子类能自动具有父类的某些方法和字段,访问内容由具体数据的访问修饰权限有关,比如子类能继承父类 用public和protected修饰的成员数据 ,以及同一个包下父类默认包访问权限的数据, 并且 构造器是不能被继承 .
!!!警告: 父类的private成员无法被子类访问, 更不能被继承
构造器为什么不能被继承???
· 构造器的名称需要与类名相同,因此父类构造器不能继承给子类
· 构造器实际上是隐时static声明的方法
继承作用
· 减少代码的重复
· 表现类之间的is-a关系,多个类所组成的体系
继承特点
· 只支持单继承,没有多继承
· 单继承基础上存在多重继承
· 任何类 除Object类外 的直接子类或者间接子类都为Object类
· 破坏了类的封装 ,让子类具有部分不该有的功能和行为
继承与组合的取舍
类之间存在一般与特殊的关系时使用继承, 若不存在此种关系就采用组合的方式
继承的覆写
What 覆写
继承自父类的某些方法不符合子类的特性,子类需要对其方法进行重新定义的做法叫做方法覆盖
Why 覆写
类的继承关系中只有对实例方法存在覆写,字段没有覆写的概念
覆写的原则: 一同两小一大
· 子类与父类具有相同的方法签名
· 子类的返回值类型是父类返回值类型的子类或者同类
· 子类抛出的异常类型是父类抛出异常类型的子类或者同类
· 子类的方法权限访问修饰符跟父类的相等或者更大
关键点
仅存在与继承关系的子类和父类间
只针对实例方法,与字段无关
私有的父类方法和构造器由于不能被继承所以不存在覆写现象
覆写与重载的区别
拓展 @override声明的使用: 表示一个方法声明打算重写超类中的另一个方法。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息
super关键字
与this关键字一样,同属于对象级别, 不能与static共用
What is super: 暂时理解为当前对象的父类对象; 其实该关键字用来告知编译器直接从父类开始查找紧跟的字段/方法,直至到根类Obejct;而父类中this表示的引用仍是当前对象,
super作用
调用父类可访问的被覆盖的实例方法
调用父类可访问的被隐藏的实例字段
调用父类的构造器初始化对象
继承的隐藏
What is 隐藏?: 子类继承父类后,将父类的部分方法和字段进行遮蔽,使得直接无法访问的现象
类的继承关系中隐藏现象有哪些?
在可访问权限下,子类的静态方法与父类的静态方法完全相同即方法签名相同时,会隐藏其父类静态方法
在可访问权限下,子类的字段与父类的字段标识符相同,与其类型无关,会将父类字段隐藏,只能通过super关键字进行访问;并且这种访问方式让字段暴露,破坏了类的封装,不推荐使用
还有一种隐藏来自于当类内实例变量名与局部变量名重复时,无法直接访问其实例字段的情况