我有以下代码:
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)答案 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()
}
}