【问题标题】:Calling super class constructor from subclass从子类调用超类构造函数
【发布时间】:2014-12-27 11:13:19
【问题描述】:
class Top { 
    public Top(String s) { 
        System.out.print("B"); 
    }
}

public class Bottom2 extends Top {
    public Bottom2(String s) {  
        super();
        System.out.print("D"); 
    }

    public static void main(String [] args) { 
        Bottom2 as=new Bottom2("A");
        new Bottom2("C");
        System.out.println(" ");
    }
}

我想调用超类构造函数。为什么编译不出来?

【问题讨论】:

  • 是什么让你认为它没有被调用?它应该打印BDBD
  • Top 的构造函数接受一个字符串,所以你应该写 super(s);
  • 我明白了,您想说它甚至无法编译,因为您错误地调用了super()...

标签: java inheritance constructor


【解决方案1】:

super() 的调用意味着基类中有一个默认构造函数。您的示例没有显示,因此代码无法编译。

因此,为了使其正常工作,只需像这样在子类中添加调用:

public Bottom2(String s) 
{   
    super(s); // call to superclass constructor with parameters.
    System.out.print("D"); 
}

【讨论】:

    【解决方案2】:

    您拨打的是super(),而不是super(s)。当你有一个参数化的构造函数时,你不能再使用默认的无参数构造函数,这就是super() 不会编译的原因。

    【讨论】:

    • 也许他不知道,当你在一个类中定义一个构造函数时,java不再提供默认的构造函数,你必须自己做。
    • 没有默认构造函数——显式构造函数移除了隐式默认构造函数
    • 是的,这就是我的意思,让我编辑它。谢谢。
    • 没有注意到代码中没有无参数构造函数,谢谢提示。我已经编辑了我的答案。
    【解决方案3】:

    您的超类构造函数包含 1 个字符串参数, 而且你没有用参数调用你的超类

    在代码中 超级();

    应该是这样的

    super("任意字符串");

    【讨论】:

      【解决方案4】:

      此程序将给出编译时错误。 必须在 Top 类中包含一个默认构造函数 Top()

      【讨论】:

        【解决方案5】:

        首先它会给出编译时错误(因为如果你在子类中有参数构造函数,那么你必须在基类中没有 -arg 构造函数)其次编译器将隐式调用基类的无参数构造函数(如果没有其他调用超类构造函数或子类构造函数)。所以你不应该写

        super();
        

        所以你应该明确调用

        super(s);
        

        【讨论】:

          猜你喜欢
          • 2016-05-08
          • 1970-01-01
          • 2011-02-16
          • 2012-12-17
          • 1970-01-01
          • 1970-01-01
          • 2021-09-19
          • 2013-10-20
          相关资源
          最近更新 更多