继承(Inherit)
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成某种关系。如图所示:
多个类可以称为子类,也叫派生类;多个类抽取出来的这个类称为父类、超类(superclass)或者基类。
继承描述的是事物之间的所属关系,这种关系是:is-a
的关系。
继承的好处
- 提高代码的复用性。
- 提高代码的扩展性。
- 类与类之间产生了关系,是学习多态的前提。
弊端:增加了类与类之间的耦合度
1、继承的格式
通过 extends
关键字,可以声明一个子类继承另外一个父类,定义格式如下:
【修饰符】 class 父类 {
…
}
【修饰符】 class 子类 extends 父类 {
…
}
2、继承的特点
1、子类会继承父类所有的成员变量和方法
- 当子类对象被创建时,在堆中给对象申请内存时,就要看子类和父类都声明了什么实例变量,这些实例变量都要分配内存。
- 当子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,会看它的父类甚至父类的父类是否声明了这个方法,遵循从下往上找的顺序,找到了就停止,一直到根父类都没有找到,就会报编译错误。
2、子类无法直接使用父类的私有成员
子类虽会继承父类私有(private)的成员变量,但子类不能对继承的私有成员变量直接进行访问(也可以理解为私有的属性不能被继承,官方文档中的说法),可通过继承的公共的get/set方法进行访问。如图所示:
3、Java只支持单继承
public class A{}
class B extends A{}
//一个类只能有一个父类,不可以有多个直接父类。
class C extends B{} //ok
class C extends A,B… //error
4、Java支持多层继承
class A{}
class B extends A{}
class C extends B{}
顶层父类是Object类。所有的类默认继承Object,作为父类。
子类和父类是一种相对的概念,例如,B类对于A来说是子类,但是对于C类来说是父类
5、一个类可以同时拥有多个子类
class A{}
class B extends A{}
class D extends A{}
class E extends A{}
3、super调用父类构造器
在继承关系中,子类不会继承父类的构造器,子类构造器可以通过**super(【实参列表】)
**来调用父类构造器。
- 子类的每个构造器中默认隐藏
super()
,即默认调用父类的无参构造器。 - 子类构造器中可以显示使用
super(【实参列表】)
来调用父类无参或有参构造器,那么默认隐藏的super()
不再存在。 - 如果父类没有无参构造,则必须在子类构造器中显示使用
super(实参列表)
来调用父类构造器。 super(【实参列表】)
只能出现在子类构造器的首行
总之:使用子类任意构造器创建对象时,必须要直接或间接通过super(【实参列表】)
先调用执行父类构造器。
4、IDEA中查看类的继承关系
选择一个类名,按Ctrl + H
就会显示该类的继承树。
按Ctrl+ Alt+U就会用图形化方式显示C类的继承祖宗