隐式调用超类中的无参数构造函数

时间:2014-05-03 21:59:25

标签: java

取自: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 这个例子有什么问题,为什么我没有得到错误?

我认为上面的大胆句子应该是:

如果超类没有任何构造函数,....

因为如果至少有一个构造函数..编译器会收到错误..

或者如果有人有解释请,请

感谢

2 个答案:

答案 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。