【问题标题】:What is invoking the super class constructor here?什么在这里调用超类构造函数?
【发布时间】:2015-03-04 22:13:07
【问题描述】:

我在寻找考试准备问题时遇到了这段代码。 我不明白什么在调用超类构造函数 在这段代码中?

输出是 ---> feline cougar cc

THL

        public class Feline{

        public String type = "f ";

        public Feline(){
            System.out.print("feline ");
        }
        }

-

    public class Cougar extends Feline {

    public Cougar(){
            System.out.print("cougar ");
    }

    public static void main(String[] args){
            new Cougar().go();                    
    }                                                                                     
    void go(){                            
            type = "c ";                                
            System.out.print(this.type + super.type);
    }
    }

【问题讨论】:

  • 在执行子类的构造函数体之前隐式完成。
  • 添加覆盖以抑制超级调用。

标签: java inheritance constructor superclass super


【解决方案1】:

如果您有一个扩展了其他类的类,例如Cougar extends Feline,则必须调用构造函数顶部的超类。如果您不编写,Java 会假定您要调用默认的超类构造函数。所以你的构造函数:

public Cougar(){
    System.out.print("cougar ");
}

实际上解释为:

public Cougar(){
     super();
     System.out.print("cougar ");
}

因此调用了超类构造函数。有趣的是,因为所有类都是类Object 的扩展,所以在您编写的每个构造函数的开头都会调用一个超类构造函数——无论是包含或不包含的显式构造函数参数,或默认的超类构造函数(如果您未指定)。

【讨论】:

  • 没错。唯一的例外是您自己调用 super() (可能提供一些参数)。
  • 是的。我会清理我的答案以使其更明确
【解决方案2】:

在这种情况下,Java 编译器会自动插入对super() 的调用。我建议阅读this Java tutorial,特别是这部分:

注意:如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。 Object 确实有这样的构造函数,所以如果 Object 是唯一的超类,没有问题。

【讨论】:

    【解决方案3】:

    如果不包含对父构造函数的调用,则父构造函数(无 arg)将在当前类的第一行执行之前被调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 2017-04-07
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多