继承和super关键字
继承的好处和弊端
继承的好处
- 提高了代码的复用性
- 提高了代码的维护性
- 让类与类之间产生了关系,是多态的前提
继承的弊端
- 类的耦合性增强了
Java中类的继承特点
-
Java只支持单继承(一个子类只能有一个父类,一个父类是可以有多个子类),不支持多继承。
有些语言是支持多继承,格式:extends 类1,类2,…
-
Java支持多层继承(继承体系)。
-
Object 是我们Java继承体系当中的顶层父类,所有的类都是直接或间接继承自他。
继承的注意事项和什么时候使用继承
继承的注意事项
- 子类只能继承父类所有非私有的成员(成员方法和成员变量)。私有的成员,子类不能继承。
- 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。在你初始化子类对象时,会调用父类构造来完成父类数据的初始化。
- 不要为了部分功能而去继承
什么时候使用继承
- 继承其实体现的是一种关系:“is a” .
- 如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
继承中成员变量的关系
-
子类中的成员变量和父类中的成员变量名称不一样
-
子类中的成员变量和父类中的成员变量名称一样
在子类中访问一个变量的查找顺序(“就近原则”)
- 在子类的方法的局部范围找,有就使用
- 在子类的成员范围找,有就使用
- 在父类的成员范围找,有就使用
- 如果还找不到,就报错
this和super的区别和应用
this和super的区别
- this 代表的是本类对象的引用
- super 代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员)
this和super的使用
- 调用成员变量
- this.成员变量 调用本类的成员变量
- super.成员变量 调用父类的成员变量
- 调用构造方法
- this(…) 调用本类的构造方法
- super(…) 调用父类的构造方法
- 调用成员方法
- this.成员方法 调用本类的成员方法
- super.成员方法 调用父类的成员方法
继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法
因为子类会继承父类中的数据,可能还会使用父类的数据。
所以,子类初始化之前,一定要先完成父类数据的初始化。
每一个构造方法的第一条语句默认都是:super()
Object类没有父类了。
继承中构造方法的注意事项
父类没有无参构造方法,子类怎么办
-
在父类中添加一个无参的构造方法
-
子类通过super去显示调用父类其他的带参的构造方法
-
子类通过this去调用本类的其他构造方法
本类其他构造也必须首先访问了父类构造
super(…)或者this(….)必须出现在第一条语句上
案例演示
class Fu {
static {
System.out.println("静态代码块Fu"); //1
}
{
System.out.println("构造代码块Fu"); //3
}
public Fu() {
System.out.println("构造方法Fu"); //4
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");//2
}
{
System.out.println("构造代码块Zi"); //5
}
public Zi() {
super();
System.out.println("构造方法Zi"); //6
}
}
class Test {
public static void main(String[] args) {
Zi z = new Zi(); //请执行结果。
}
}
运行结果
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
继承中成员方法关系
-
当子类的方法名和父类的方法名不一样的时候
-
当子类的方法名和父类的方法名一样的时候
通过子类调用方法:
- 先查找子类中有没有该方法,如果有就使用
- 再看父类中有没有该方法,有就使用
- 如果没有就报错