概述:类与类之间产生关系,一个类在另一个类的基础上创建,新建的类使用已创建的类的类成员,但也有自己特有的类成员,这两个类的关系就是继承。
语法:
class A{
}
class B extends A{
}
A类:称为父类,又称为基类,超类。
B类:称为子类,又称为派生类,衍生类。
extends : 关键字,表示继承
继承的优缺点:
优点:
- 提高代码的复用性。
- 提高代码的可维护性。
- 多态的前提
缺点:
- 提高耦合,降低内聚(当父类损坏,继承了子类都会出现BUG)
解决:
- 装饰着设计模式
- 代理设计模式
注意点:
父类的私有成员无法被子类继承
- 如果需要对父类的私有成员进行访问,则需要封装该成员,再根据提高的getter/setter进行访问。
父类的构造方法无法被子类继承
- 构造方法无法被继承,但是可以在子类的构造方法中通过super(参数列表)进行对父类构造方法的调用。
不要为了某个类成员而使用继承
- 子类必须是父类的一个特例,满足Is a 要求。
- 子类必须全继承父类的成员,不能部分继承类成员。
继承中的属性:
- 继承中不同名属性访问
子类能够使用父类的非私有成员。 - 继承中同名属性访问
如果属性同名,调用时使用子类的属性
如果属性同名,想要调用父类的属性,需要用到 super 关键字
class Fu{
int x = 10;
}
class Zi extends Fu{
int x = 20;
public void show(){
System.out.println(x);
System.out.println(super.x);
}
}
public class Demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
输出结果:
super关键字
含义:代表父类,存储父类对象地址。
作用:区分子类成员和父类成员
class Fu{
public Fu(){
System.out.println("父类的无参构造方法");
}
}
class Zi extends Fu{
}
public class Demo {
public static void main(String[] args) {
Zi zi1 = new Zi();
}
}
输出结果:
结论:
- 类中都有一个隐式的无参构造方法,当实例化子类时,子类的会隐式调用父类的无参构造方法【 super()】。
class Fu{
public Fu(){
System.out.println("父类的无参构造方法");
}
public Fu(int x){
System.out.println("父类的有参构造方法");
}
}
class Zi extends Fu{
public Zi(int x) {
super(x);
}
}
public class Demo {
public static void main(String[] args) {
Zi zi1 = new Zi();
Zi zi2 = new Zi(2);
}
}
输出结果:
结论:
- 在执行子类构造方法代代码前,会先调用父类构造方法,完毕后再回到子类构造方法去执行。
- 如果需要调用父类有参构造方法,则需要通过显式super(参数列表)进行调用。
- 当显式super(参数列表)进行调用父类有参构造方法时,原隐式调用父类无参构造方法的super()将消失。
- 父类自定义有参构造方法但没有显式定义无参构造方法,则子类无法调用父类的无参构造方法。
- 同一个构造方法中不能同时存在this() 和 super(),因为这两个关键字都在抢构造方法中的第一行。
- 所有类都继承Object类,而无显式继承父类,都隐式继承了Object类。
继承中的方法:
-
继承中不同方法名访问
直接访问 -
继承中相同方法名访问
直接继承父类方法,但当父类方法不能满足子类的方法需求时,可以进行方法重写。
结论:
-
在具有继承关系的类中,存在一个方法名相同,返回值类型相同,参数相同(参数类型,个数,顺序)方法,就是方法重写(override)技术。
-
重写作用:父类方法无法满足子类需求时,就可以使用重写。
-
@Override注释可以验证子类方法是否对父类方法重写正确。
-
父类static方法无法被重写
-
父类private方法无法被重写
-
子类重写方法要与父类方法访问修饰符权限一致或更大。
继承特性:
- 单继承