解释这个继承Java程序的输出?

时间:2011-10-15 13:27:39

标签: java

伙计们,请您解释一下这个例子的输出是怎么来的:

  Exam1
  This is Tennis Shoes
  derived class
  This is a white Tennis Shoes is created

如果您能够向我解释在创建White Tennis Shoes的对象后发生了什么,以及发生了什么。 请大家不要告诉我做你的作业或者我正准备考试的事情,这是一个老问题。

代码如下:

class Shoes{
    public Shoes(){
        this("you have created a shoes Object");
        System.out.println("This is the base class");
    }

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

class TennisShoes extends Shoes{
    public TennisShoes(){
        this("This is Tennis Shoes");
        System.out.println("derived class");
    }

    public TennisShoes(String s){
        super("Exam1");
        System.out.println(s);
    }
}

class WhiteTennisShoes extends TennisShoes{
    public WhiteTennisShoes(String s){
        System.out.println(s);
    }
}

class ConstructorPrintingTester{
    public static void main(String[] args){
        WhiteTennisShoes shoesObj;
        shoesObj = new WhiteTennisShoes("This is a white Tennis Shoes is created");
    }
}

3 个答案:

答案 0 :(得分:3)

当您创建类型为WhiteTennisShoes的对象时,将执行其构造函数:

public WhiteTennisShoes(String s){
    super(); // This line is automatically inserted
    System.out.println(s);
}

由于每个构造函数必须在第一行中调用super或另一个构造函数,并且这样做会使Java自动调用无paremeter的超级构造函数,因此调用带有arity 0的TennisShoes构造函数。然后是当前的callstack

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()

现在,TenniesShoes()会在第一行调用另一个构造函数。现在的callstack现在是

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")

该构造函数使用参数"Exam1"调用单参数超级构造函数。 callstack是

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")
Shoes("Exam1")

由于Shoes的单参数构造函数不调用构造函数,因此现在调用超类Object的隐式构造函数; callstack是

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")
Shoes("Exam1")
Object()

之后,解开callstack并按顺序调用所有打印:

  1. Shoes("Exam1")打印"Exam1"
  2. TenniesShoes("This is Tennis Shoes")打印"This is Tennis Shoes"
  3. TenniesShoes()打印"derived class"
  4. WhiteTennisShoes("This is a white ...")打印"This is a white ..."
  5. main不打印并退出。

答案 1 :(得分:0)

如果未在Java中指定要在类中调用的父构造函数,则在实例化期间将调用默认的父构造函数。在您的情况下,创建新的WhiteTennisShoes将自动调用默认的父构造函数,即TennisShoes()。这会调用TennisShoes(),然后调用Shoes(String)

在这种情况下要记住的重要事项是,在Java中,实例化一个类会调用类和每个父类的构造函数。您可以指定要调用的父构造函数,如果不这样,则调用默认的no-arg父构造函数。

答案 2 :(得分:0)

您调用WhiteTennisShoes构造函数。这个构造函数没有super()调用,所以编译器会为你插入一个,并且它所做的第一件事就是调用它的超类的无参数构造函数:TennisShoes。

没有任何参数的TennisShoes构造函数调用另一个带有“This is Tennis Shoes”的构造函数作为参数。这个构造函数的第一个作用是调用其超类的构造函数,并将“Exam1”作为参数。

因此,使用Exam1作为参数调用Shoes构造函数,并输出Exam1。然后,TennisShoes构造函数继续执行并输出其参数:“这是网球鞋”。然后,TennisShoes no-arg构造函数继续执行并输出“派生类”。然后WhiteTennisShoes构造函数继续执行并输出其参数:“这是一个白色的网球鞋创建”。