在Java中,执行子类的构造方法之前或者子类没有明确地指定构造方法,会自动地调用父类中没有参数的构造方法。其目的是为了帮助继承自父类的成员变量做初始化操作。问题是,如果父类有多个构造方法,如何才能调用父类中特定的构造方法呢?如果在子类中还需要用到父类中被隐藏的变量或者被覆盖了的方法,该怎么办呢?Java提供了关键字super来实现对父类的成员和方法的访问。super有三种情况可以使用:
(1)用来访问父类中被覆盖的方法
(2)用来调用父类中的构造方法
(3)用来访问父类中被隐藏的成员变量
<span style="font-size:24px;"><span style="font-size:24px;">
package java5;
public class java5 {
public static void main(String args[]){
Subclass Subc = new Subclass();
Subc.dosomething();
}
}
class Superclass{
int x;
Superclass(){
x = 3;
System.out.println("in Superclass:x = "+x);
}
void dosomething(){
System.out.println("in Superclass.dosomething");
}
}
class Subclass extends Superclass{
int x;
Subclass(){
super();//A行
x = 5;//B行
System.out.println("in Subclass:x = "+x);
}
void dosomething(){
super.dosomething();
System.out.println("in Subclass.dosomething()");
System.out.println("super.x = "+super.x+" \tsub.x = "+x);
}
}
</span></span>
运行结果见下图:
注意:在子类中用super关键字可以使用父类中被覆盖的方法和被隐藏的变量。在所有的父类中的非static方法都可以用super调用。数据成员变量的值也可以用super来访问,如果一个类有父类还有祖先类,即父类的父类,super是指父类而不是祖先类。
与父类的其他成员不同,父类的构造方法是不能被它的子类继承的,也就是必须为子类定义一个构造方法或者使用默认(无参)的构造方法。
如果在子类中定义了一个构造方法,它没有显式包含调用父类的构造方法,那么Java编译器将添加”super();”作为该构造方法的第一条语句,即假如例子中没有A行,编译器在编译时将自动在B行前加上”super();”。
如果父类定义有带参数的构造方法,也就是说明系统不会对它添加默认的构造方法,那么在子类中将会出现编译错误。因为编译器自动加上super()方法,但实际上父类中不存在与之相匹配的无参构造方法,结果导致编译错误。