伙计们,请您解释一下这个例子的输出是怎么来的:
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");
}
}
答案 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并按顺序调用所有打印:
Shoes("Exam1")
打印"Exam1"
TenniesShoes("This is Tennis Shoes")
打印"This is Tennis Shoes"
TenniesShoes()
打印"derived class"
WhiteTennisShoes("This is a white ...")
打印"This is a white ..."
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构造函数继续执行并输出其参数:“这是一个白色的网球鞋创建”。