【问题标题】:Calling no-argument constructor in superclass implicitly隐式调用超类中的无参数构造函数
【发布时间】:2014-05-03 21:59:24
【问题描述】:

这取自:http://docs.oracle.com/javase/tutorial/java/IandI/super.html

注意:如果构造函数没有显式调用超类 构造函数,

Java 编译器自动插入对无参数的调用

的构造函数

超类。如果超类没有无参数 构造函数,

你会得到一个编译时错误。对象确实有这样一个 构造函数,所以

如果 Object 是唯一的超类,则没有问题。

我做了这个小例子来测试:

类 P 作为超类(它的空类):

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

我觉得上面的粗体字应该是:

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

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

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

谢谢

【问题讨论】:

  • "您不必为您的类提供任何构造函数,但这样做时必须小心。编译器自动提供无参数任何没有构造函数的类的默认构造函数。" 由于您没有为类P 指定构造函数,因此编译器为您添加了无参数的构造函数,因此隐式@您的N 类中的987654325@ 调用有效。
  • 说编译器会添加no-arg构造函数,意思是构造函数不存在那里..所以根据上面的粗体句子,为什么没有编译器时错误?
  • 我不明白你。 P 类有一个无参数构造函数。如果查看你的 P 类生成的字节码,你会看到它。
  • 这就是我一直在寻找的......因此我想知道为什么不澄清这句话并重写为:如果超类没有无参数构造函数并且(至少)有一个参数构造函数..然后编译器会抱怨..我是对的吗?

标签: java


【解决方案1】:

由于类 P 扩展了对象,并且没有构造函数,所以它的构造函数默认为无参数构造函数,它隐式调用 Object 中的构造函数。

要导致错误,你需要像这样向 P 的构造函数添加一个参数:

public class P {

    public P(int a) {
    }
}

现在 N 试图隐式调用 super() 来寻找 P 中的无参数构造函数。但是,由于我们在 P 中添加了一个构造函数,因此无法再使用默认的无参数构造函数。

澄清:

如果没有构造函数,则添加默认的无参数。如果有任何类型的构造函数,则不添加默认的无参数构造函数

【讨论】:

  • 我明白了..但还是那句话:如果超类没有无参数构造函数是模棱两可的,我可以理解为超类有无参数构造函数但它有另一个参数-contractor,在这种情况下我可以犯那个错误,但也可以理解为根本没有构造函数,因此编译器将添加无参数构造函数并且没有错误..我是对的吗?
  • 是的。如果没有构造函数,则添加默认的无参数。如果存在任何类型的构造函数,则不添加默认的无参数构造函数。
【解决方案2】:

仅根据您的解释,如果子类未调用超类构造函数 然后编译器会自动插入对超类的无参数构造函数的内部调用。

所以在 N 类中,你有 N() 构造函数和它内部调用的 P 类没有 arg 构造函数。

而 P 在内部调用 Object 类无 arg 构造函数。

这样你的代码就会成功编译。

如果超类中没有对应的构造函数,那么它只会报错。

所以尝试在基类P(like p(int x){ }) 中放置一些参数化的构造函数并运行您的程序。 你肯定会出错,因为 no arg costrcutor is not available in super class。

注意:只有在类中根本没有构造函数时才插入 arg 构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多