《Oracle Java SE编程指南》13-03:构造器和继承
2020-04-26 本文已影响0人
AT阿宝哥
课程封面-JavaSE-AT阿宝哥
扫描二维码,关注AT阿宝哥
内容导航:
- 前言
- 1、构造方法与继承
- 2、继承中构造方法的调用
- 3、子类调用父类构造方法的原因
- 4、子类构造方法的执行详解
前言
子类不能继承父类的构造器,但是父类的构造器对子类的作用又非常关键。
1、构造方法与继承
要调用父类的属性和方法,必须对父类对象进行初始化,而初始化要调用构造方法才可以。我们在创建circle对象的时候,怎么保证调用了父类的构造方法Shape()呢?
因此,创建子类对象的时候,一定要先调用父类构造方法,否则就无法保证父类中的属性和方法被初始化,子类对象就不能使用。
2、继承中构造方法的调用
子类构造方法总是先调用父类构造方法。
默认情况下,调用父类无参构造方法。
可以在子类构造方法的第一行,使用super关键字调用父类任意一个构造方法。
例:
//类:图形
public class Shape {
public int x;
public int y;
public Shape() {
System.out.println("这是父类的无参构造方法!");
}
public Shape(int x, int y) {
this.x = x;
this.y = y;
System.out.println("这是父类的有参构造方法!");
}
public void draw() {
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
//类:圆形
public class Circle extends Shape {
private int r;
public Circle() {
// super();
// super(0, 0);
System.out.println("这是子类的无参构造方法!");
}
// 方法:获取直径
public int getDiameter() {
return 2 * r;
}
public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
}
public class Client {
public static void main(String[] args) {
Circle circle = new Circle();
}
}
输出:
这是父类的无参构造方法!
这是子类的无参构造方法!
3、子类调用父类构造方法的原因
Java 语言中,要求子类有责任保证它所继承的父类尽快进入到一个稳定、完整的状态中。如果没有这个约束,那么子类的某个继承自父类的方法可能会使用到父类中的一些变量,而这些变量并没有进行初始化,从而产生一些难以预料的后果。
4、子类构造方法的执行详解
必须将调用父类构造方法的这条语句放在子类构造方法的第一条语句位置。如果第一条语句没有调用父类的构造方法,系统将会自动地在这个位置上插入一条调用父类默认构造方法的语句,即super();
由于默认的构造方法不带参数,所以,如果在父类中定义了带参数的构造方法,而没有定义不带参数的构造方法将会出现编译错误。这也正是建议大家在定义带参数的构造方法时,一定要定义一个不带参数的构造方法的原因所在。
父类中那些带参数的构造方法,子类将不会自动地调用它们,必须人工地将调用它们的语句写入子类的构造方法中。
持续更新,欢迎留言提议!
码字很累,多点赞多赞赏!
扫描二维码,关注AT阿宝哥