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

解释这个继承Java程序的输出?,java,Java,伙计们,你能给我解释一下这个例子的结果是什么吗 Exam1 This is Tennis Shoes derived class This is a white Tennis Shoes is created 如果您能向我解释一下,在我们创建了一个白色网球鞋的对象之后,到底发生了什么,以及发生了什么。 请不要告诉我做你的家庭作业什么的,我只是在准备考试,我想这是一个老问题 代码如下: class Shoes{ public Shoes(){ this("

伙计们,你能给我解释一下这个例子的结果是什么吗

  Exam1
  This is Tennis Shoes
  derived class
  This is a white Tennis Shoes is created
如果您能向我解释一下,在我们创建了一个
白色网球鞋的对象之后,到底发生了什么,以及发生了什么。
请不要告诉我做你的家庭作业什么的,我只是在准备考试,我想这是一个老问题

代码如下:

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");
    }
}

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


在本例中需要记住的重要一点是,在Java中,实例化一个类会调用该类和每个父类的构造函数。您可以指定要调用的父构造函数,如果不指定,则会调用默认的无参数父构造函数。

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


在本例中需要记住的重要一点是,在Java中,实例化一个类会调用该类和每个父类的构造函数。您可以指定要调用的父构造函数,如果不指定,则会调用默认的无参数父构造函数。

您可以调用WhiteTennisShoes构造函数。此构造函数没有super()调用,因此编译器会为您插入一个,因此它要做的第一件事就是调用其超类的no-arg构造函数:TennisShoes

没有任何参数的TennisShoes构造函数调用另一个以“This is Tennis Shoes”作为参数的构造函数。此构造函数所做的第一件事是以“Exam1”作为参数调用其超类的构造函数


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

调用WhiteTennisShoes构造函数。此构造函数没有super()调用,因此编译器会为您插入一个,因此它要做的第一件事就是调用其超类的no-arg构造函数:TennisShoes

没有任何参数的TennisShoes构造函数调用另一个以“This is Tennis Shoes”作为参数的构造函数。此构造函数所做的第一件事是以“Exam1”作为参数调用其超类的构造函数


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

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

public WhiteTennisShoes(String s){
    super(); // This line is automatically inserted
    System.out.println(s);
}
由于每个构造函数必须在第一行中调用super或另一个构造函数,这样做会使Java自动调用无参数的super构造函数,因此会调用arity为0的
TennisShoes
构造函数。然后,当前调用堆栈将被删除

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
现在,
tennieshoes()
确实在第一行调用了另一个构造函数。当前的调用堆栈现在是

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")
该构造函数使用参数“Exam1”
调用单参数超级构造函数。调用堆栈是

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")
Shoes("Exam1")
main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")
Shoes("Exam1")
Object()
由于
Shoes
的单参数构造函数不调用构造函数,因此现在调用超类对象的隐式构造函数;调用堆栈是

main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")
Shoes("Exam1")
main(..)
WhiteTennisShoes("This is a white ...")
TenniesShoes()
TenniesShoes("This is Tennis Shoes")
Shoes("Exam1")
Object()
之后,调用堆栈展开,并按顺序调用所有打印:

  • Shoes(“Exam1”)
    打印
    “Exam1”
  • TenniesShoes(“这是网球鞋”)
    打印
    “这是网球鞋”
  • tennieshootes()
    打印
    “派生类”
  • WhiteTennisShoes(“这是一个白色…”)
    打印
    “这是一个白色…”
  • main
    不打印任何内容并退出

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

    public WhiteTennisShoes(String s){
        super(); // This line is automatically inserted
        System.out.println(s);
    }
    
    由于每个构造函数必须在第一行中调用super或另一个构造函数,这样做会使Java自动调用无参数的super构造函数,因此会调用arity为0的
    TennisShoes
    构造函数。然后,当前调用堆栈将被删除

    main(..)
    WhiteTennisShoes("This is a white ...")
    TenniesShoes()
    
    现在,
    tennieshoes()
    确实在第一行调用了另一个构造函数。当前的调用堆栈现在是

    main(..)
    WhiteTennisShoes("This is a white ...")
    TenniesShoes()
    TenniesShoes("This is Tennis Shoes")
    
    该构造函数使用参数“Exam1”调用单参数超级构造函数。调用堆栈是

    main(..)
    WhiteTennisShoes("This is a white ...")
    TenniesShoes()
    TenniesShoes("This is Tennis Shoes")
    Shoes("Exam1")
    
    main(..)
    WhiteTennisShoes("This is a white ...")
    TenniesShoes()
    TenniesShoes("This is Tennis Shoes")
    Shoes("Exam1")
    Object()
    
    由于
    Shoes
    的单参数构造函数不调用构造函数,因此现在调用超类对象的隐式构造函数;调用堆栈是

    main(..)
    WhiteTennisShoes("This is a white ...")
    TenniesShoes()
    TenniesShoes("This is Tennis Shoes")
    Shoes("Exam1")
    
    main(..)
    WhiteTennisShoes("This is a white ...")
    TenniesShoes()
    TenniesShoes("This is Tennis Shoes")
    Shoes("Exam1")
    Object()
    
    之后,调用堆栈展开,并按顺序调用所有打印:

  • Shoes(“Exam1”)
    打印
    “Exam1”
  • TenniesShoes(“这是网球鞋”)
    打印
    “这是网球鞋”
  • tennieshootes()
    打印
    “派生类”
  • WhiteTennisShoes(“这是一个白色…”)
    打印
    “这是一个白色…”
  • main
    不打印任何内容并退出<