【问题标题】:Is calling super's constructor redundant in this case? [duplicate]在这种情况下调用 super 的构造函数是多余的吗? [复制]
【发布时间】:2014-10-08 18:52:37
【问题描述】:

我一直认为,在创建带有子类的对象时,需要显式使用super(arguments list)来调用超类的构造函数。然而我做了一个实验,发现即使没有使用super(),超类的构造函数也会被自动调用。这是真的?

如果这是真的,super() 什么时候是多余的,什么时候不是?

class Parent
{
    public Parent()
    {
        System.out.println("Super Class");
    }           

}

class Child extends Parent
{
    public Child()
    {
        super();   //Is this redundant?
        System.out.println("Sub Class");
    }   
}

public class TestClass
{
    public static void main(String[] args) 
    {
        new Child();
    }
}

输出 super(); 在子类中):

Super Class
Sub Class

输出(在子类中没有super();):

Super Class
Sub Class

【问题讨论】:

  • 即使你不打电话也隐藏着超级存在
  • 在需要传递参数的时候必须调用super()构造函数,否则如果不调用,就会隐式调用不带参数的super()。
  • 那么我们在超类的构造函数中有参数的时候显式调用?

标签: java class super sup


【解决方案1】:

默认情况下,super() 会添加到所有子类中,因此不需要显式调用它。

可以通过使用super(args) 调用超类的重载构造函数或使用this(args) 调用同一类的重载构造函数来覆盖默认行为。

假设超类没有无参数构造函数,并且您已经创建了其他构造函数,在这种情况下,您必须显式调用super(args) 来解决编译时错误。

【讨论】:

    【解决方案2】:

    如有疑问,请随时咨询the specification

    如果构造函数体不是以显式构造函数调用开始并且被声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式以超类构造函数调用“super();”开始,调用不带参数的直接超类的构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多