取自:http://docs.oracle.com/javase/tutorial/java/IandI/super.html
注意:如果构造函数没有显式调用超类 构造函数,
Java编译器自动插入对无参数的调用
的构造函数超类。如果超类没有无参数 构造函数,
您将收到编译时错误。对象确实有这样的 构造函数,所以
如果Object是唯一的超类,则没有问题。
我做了一个小例子来测试:
class P as superclass(它的空类):
package org.standro.com.pk1;
public class P {
}
和类N在不同的包中,类N扩展了类P而没有显式调用super():
import org.standro.com.pk1.P;
public class N extends P {
public N() {
//imlicitly super() is called here .. that means the constructor of P
}
public static void main(String[] arg){
N n=new N();
}
}
没有编译错误..我正在使用JDK1.7 这个例子有什么问题,为什么我没有得到错误?
我认为上面的大胆句子应该是:
如果超类没有任何构造函数,....
因为如果至少有一个构造函数..编译器会收到错误..
或者如果有人有解释请,请
感谢
答案 0 :(得分:4)
由于类P扩展了对象,并且没有构造函数,因此它的构造函数默认为无参数构造函数,该构造函数隐式调用Object中的构造函数。
要导致错误,您需要向P&#39的构造函数添加一个参数,如下所示:
public class P {
public P(int a) {
}
}
现在N试图隐式调用super(),它在P中寻找一个no-args构造函数。但是,由于我们在P中添加了一个构造函数,因此无法再使用默认的no-args构造函数。
Claification:
如果没有构造函数,则添加默认的no-arg。如果存在任何类型的构造函数,则不会添加缺省的无参数构造函数
答案 1 :(得分:1)
仅根据您的解释,如果子类没有调用超类构造函数 然后自动编译器插入一个内部调用超类的无arg constrcutor。
所以在N类中,你有N()
构造函数及其内部调用P class no arg构造函数。
和P内部调用Object class no arg constructor。
所以你的代码会成功编译。
如果超类中没有相应的构造函数,那么只会抱怨。
所以尝试将一些参数化的constrcutor放在基类P(like p(int x){ })
中并运行你的程序。
你肯定会得到错误,因为没有arg costrcutor在超类中不可用。
注意:只有在班级中根本没有构造者时才会插入arg constrcutor。