继承
通过扩展一个类来建立另外一个类的过程,叫做继承(inheritance)
通俗地说,所谓继承,就是让类与类之间产生父子关系。
所有的类都直接或间接的继承自: java.lang.Object 被继承的类叫做父类(基类、超类) 继承的类叫做子类(派
生类)
**格式(**extends)
class 父类 {
// ...
}
class 子类 extends 父类 {
// ...
}
子类继承父类之后有什么效果?
子类拥有了父类的非私有成员(成员变量、成员方法)
继承的使用场景
1.向上抽取:
多个类中存在相同的属性和行为时,可以将这些内容提取出来放到一个新类中,让这些类和新类产生父子关系,实现代码复用。
2.向下扩展:
当需要扩展已有的类的功能时,可以通过继承已有的类,在子类中添加新功能或重新实现已有功能,对父类(已有的类)没有影响。
继承的优缺点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZO5W618-1614674283805)(C:\Users\wukang\AppData\Roaming\Typora\typora-user-images\image-20210221105307245.png)]
使用变量遵循就近原则.
先在局部位置找, 有就使用.
没有就去本类的成员位置找, 有就使用.
没有就去父类的成员位置找, 有就使用, 没有就报错.
如果局部变量, 本类的成员变量, 父类的成员变量重名了, 如何解决?(重要!)
直接写变量名: 局部变量.
this.成员变量名: 本类的成员变量
super.成员变量名: 父类的成员变量
结论:
子类所有构造方法的第一行都有一个默认的super()用来访问父类的无参构造方法.
如果父类没有无参构造, 可以通过super(参数)的形式访问父类的带参构造.
方法重写
概述:子类中出现和父类方法定义相同的方法的现象
解释:方法重写也叫方法的复写、覆盖 方法名、参数列表、返回值类型都相同
注意事项:
父类私有方法无法重写 子类方法访问权限不能小于父类方法 子类不能比父类方法抛出更大的异常(了解)
使用场景:扩展父类功能 父类功能过时,重新实现父类功能
Java中的访问权限修饰符(理解记忆!!!面试可能会问)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ga4DwLBA-1614674283808)(C:\Users\wukang\AppData\Roaming\Typora\typora-user-images\image-20210221163940755.png)]
总结:
private:强调给自己来使用
默认:强调的是给同包下的来使用
protected:强调的是给子类使用
public:强调的是给大家使用
方法重写和方法重载的区别[重要面试问!!!!]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DvfpZtzn-1614674283811)(C:\Users\wukang\AppData\Roaming\Typora\typora-user-images\image-20210221164356574.png)]
Java中继承的特点
单继承
Java只支持类的单继承,但是支持多层(重)继承
Java支持接口的多继承,语法为: 接口A extends 接口B,接口C,接口D…
私有成员不能继承
只能继承父类的非私有成员(成员变量、成员方法)
构造方法不能继承
构造方法用于初始化本类对象。
创建子类对象时,需要调用父类构造初始化该对象的父类内容,若父类构造可以被继承,该操作会造成调用的混乱。
继承体现了“is a”的关系
子类符合“is a(是一个)”父类的情况下,才使用继承,其它情况不建议使用