1

我有以下代码:

class Shoe {
    public Shoe(){
        this("thise a shoe");
        System.out.println("Base Class");
     }
    public Shoe(String s){
        System.out.println(s);
    }
}

class TennisShoe extends Shoe {
     public TennisShoe (){
           this("This is a Tennis Shoe");
           System.out.println("Derived Class");
      }
      public TennisShoe(String s){
           super("Exam 1");
           System.out.println(s);
    }
}

class WhiteTennisShoe extends TennisShoe {
     public WhiteTennisShoe(String s){
         System.out.println(s);
}
}

class Test{
   public static void main(String [] args){
       new WhiteTennisShoe("A White Tennis Shoe is Created");
    }

}

输出是:


考试 1

这是网球鞋

派生类

创造了一只白色网球鞋


我只是不明白为什么编译器没有

WhiteTennisShoe 类中的构造函数public WhiteTennisShoe(String s)

到TennisShoe类中的构造函数 public TennisShoe (String s)

4

2 回答 2

2

在这个构造函数中

public WhiteTennisShoe(String s){
     System.out.println(s);
}

您没有指定TennisShoe应该使用哪个构造函数 - 没有super行。当你这样做时,编译器会自动选择不带参数的超类构造函数;如果没有可用的构造函数,这将是一个编译错误(尽管如果根本没有为超类定义构造函数,它将自己生成一个)。

所以TennisShoe被调用的构造函数是

public TennisShoe (){
       this("This is a Tennis Shoe");
       System.out.println("Derived Class");
}

这当然会调用另一个TennisShoe构造函数。

于 2013-11-06T11:50:53.467 回答
0

因为,编译器总是调用带有子类构造函数的隐式super()方法。

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


class Sub extends Super{
    Sub(){
     super();// this super will call implicitly if you call new Sub()
    }
}
于 2013-11-06T11:45:11.340 回答