【问题标题】:Why can't we call parent constructor explicitly in child class? [duplicate]为什么我们不能在子类中显式调用父构造函数? [复制]
【发布时间】:2018-12-21 10:35:11
【问题描述】:

我有点困惑为什么我们不能在子类构造函数中显式调用父构造函数。如果我们谈论方法,它可以很容易地在子构造函数中调用。

class F {
     F() {
        System.out.println("F");
     }
}

class G extends F {

    G() {
        F();
    }
    public static void main(String args[]){
        new G();
    }
 }

输出

 G.java:8: error: cannot find symbol
                         F();                      
  symbol:   method F()
  location: class G 
  1 error

【问题讨论】:

  • 您可以使用super();调用父级的构造函数
  • 我想显式调用..
  • @AshwiniPandey 你所能做的就是调用 super() (在这种情况下是隐含的)。
  • 不,我想显式调用
  • 因为构造函数不能直接调用,和普通函数一样,需要new操作符。

标签: java


【解决方案1】:

如果要调用超类的构造函数,使用

G() {
  super();
}

【讨论】:

  • 我知道............但是为什么不能明确
  • 有什么区别?由于一个类只有一个超类,因此 super() 尽可能显式。
  • @AshwiniPandey 因为在 Java 中调用超类的构造函数的正确语法是使用 super 而不是使用超类的名称。这就是Java的设计方式。抱怨你想要它不同是没有用的......你为什么想要这个?
【解决方案2】:

你可以调用它,但是你使用了错误的语法。使用:

G() {
    super();
}

super() 调用超类构造函数。


只有在创建类的对象时才会调用构造函数。您不能简单地调用它(这就是语言的设计方式)。在您的情况下,您可以创建一个对象,该对象又会调用构造函数。

G() {
    new F();
}

【讨论】:

  • 我知道............但是为什么不能明确
  • 编辑了答案。
  • @AshwiniPandey 因为这就是语言的设计方式
【解决方案3】:

Java 编译器可以通过关键字super 告诉您需要调用this 实例的父类构造函数。如果显式键入构造函数名称,则无法确定需要在哪个实例中调用构造函数方法。这就是为什么您需要使用关键字new 来指示您需要在new 实例中调用构造函数方法的原因。

【讨论】:

    【解决方案4】:

    如果你想创建一个新对象,你必须使用“new”关键字:

    new F();
    

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 2012-02-28
      • 2015-02-05
      • 2013-06-08
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多