我有以下代码:

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)

最佳答案

在这个构造函数中

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构造函数。

10-08 14:43