2

我正在学习,我遇到了这段代码:

class Shoe{
    public Shoe(){
        this("This is 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");
    }
}

我认为输出将是:

A white tennis shoe is created

因为只调用了子类 WhiteTennisShoe 的构造函数。然而,真正的输出是完全不同的:

Exam 1
This is a Tennis Shoe
Derived Class
A white tennis shoe is created

这是因为动态和静态绑定吗?还是纯java继承?我真的很困惑。几天来,我一直在寻找关于静态和动态绑定的一个很好的解释,但我没有找到。

4

2 回答 2

2

简单的java继承。

子类的每个构造函数都需要调用它扩展的类的构造函数。如果您不自己进行调用,则会为您添加对扩展类的默认构造函数的调用。

在示例中:

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

是相同的:

 public WhiteTennisShoe(String s){
        super();
        System.out.println(s);
    }
于 2013-11-04T17:09:50.333 回答
0

它是纯 Java 继承。每个 Java 构造函数都会隐式插入 super() 作为其第一行,除非显式调用父构造函数,例如在第二个 TennisShoe 构造函数中,显式调用 super("Exam 1")。

请参阅:子类构造函数

于 2013-11-04T17:14:25.673 回答