概述
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。
其中,多个类可以称为子类,单独那一个类称为父类、超类或者基类。继承描述的是事物之间的所属关系,这种关系是:is-a的关系。父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。
子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。
好处
- 提高代码复用性
- 类与类之间产生了关系,是多态的前提
定义格式
使用extends
关键字,声明一个子类继承另一个父类,格式如下:
calss Fu {
// ...
}
class Zi extends Fu {
// ...
}
特点
java 只支持单继承,不支持多继承
//一个类只能有一个父类,不可以有多个父类。 class C extends A{ }// ok class C extends A,B...//error
java 支持多层继承
class A {} class B extends A{} class C extends B{}
子类和父类是一种相对的概念
继承后的特点
成员变量
成员变量不重名时,访问不受影响,子类可以访问父类中的非私有成员变量
成员变量重名,需要使用
super
关键字,来访问被隐藏的父类成员变量(类似于 this)格式:
super.父类成员变量名
通常编码时,我们遵循封装的原则,使用 private 修饰成员变量,那么如何访问父类的私有成员变量呢?
可以通过父类中提供的公共的 getXxx()和 setXxx()方法
成员方法
成员方法不重名,若子类中存在就执行子类中的方法,没有则向上调用父类中的方法
成员方法重名——重写(Override)
子类中出现与父类一模一样的方法时(返回值类型,方法名,参数列表都相同),会出现覆盖效果,也称为重写或复写
应用: 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。
注意:
- 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
- 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。
@Override
:写在方法前面,用来检测是不是有效的方法重写。如果不是有效重写,则编译出错这个注解即使不写,只要满足要求,也是正确的方法重写
局部变量/方法:直接写成员变量名
本类成员变量/方法:this.成员变量名父类
成员变量/方法:super.成员变量名
构造方法
构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个
super()
,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。子类构造必须调用父类构造方法,不写则默认赠送
super()
super 只能有一个,且必须在方法第一行