继承:子类如何与其父类交互?

时间:2013-11-06 11:42:14

标签: java inheritance superclass

我有以下代码:

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)

2 个答案:

答案 0 :(得分: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构造函数。

答案 1 :(得分:0)

因为,Compiler总是使用Subclass构造函数调用隐式super()方法。

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


class Sub extends Super{
    Sub(){
     super();// this super will call implicitly if you call new Sub()
    }
}