当父类和子类中存在同名的成员变量时,可以通过super关键字在子类中引用父类的成员,以区分父子类中同名的变量。
class Father {
public int number = 10;
}
class Son extends Father {
public int number = 20;
void show() {
System.out.println(number); // 子类自己的number,输出20
System.out.println(super.number); // 父类的number,输出10
}
}Code language: JavaScript (javascript)
子类的构造函数中,需要调用父类的构造函数来完成父类部分的初始化。
可以使用super(参数)来显式调用父类的构造函数,也可以使用this(参数)来调用子类自身的其他构造函数。
注意:super()调用父类构造函数时,必须放在子类构造函数体的第一行。
另外,如果子类的构造函数中没有显式调用父类的构造函数,则系统会默认调用基类的无参构造函数。
如果子类的构造函数没有显式调用父类的构造函数,而基类中又没有定义无参构造函数(比如基类只定义了带参构造函数),则编译会出错。
class Father {
public int number;
Father(int n) {
number = n;
}
}
class Son extends Father {
Son() {
// 编译出错:没有显式调用父类构造函数,且父类没有无参构造函数
// 必须显式调用 super(参数)
}
Son(int n) {
super(n); // 正确:显式调用父类带参构造函数
}
}Code language: JavaScript (javascript)