给出以下类别:
public class Super {
protected int x = 1;
public Super() {
System.out.print("Super");
}
}
public class Duper extends Super {
protected int y = 2;
public Duper() {
System.out.println(" duper");
}
public class Fly extends Super {
private int z, y;
public Fly() {
this(0);
}
public Fly(int n) {
z = x + y + n;
System.out.println(" fly times " + z);
}
public static void main(String[] args) {
Duper d = new Duper();
int delta = 1;
Fly f = new Fly(delta);
}
}
运行Fly
时显示什么?
我的想法是,因为它创建了Duper对象,所以它将打印出duper
。然后,它使用int参数转到Fly构造函数。 x是来自Super的1,y是来自Duper的2,n是来自Fly的1,所以1 + 2 + 1 = 4,所以我认为它也会打印fly times 4
。其实是
Super duper
Super fly times 2
如果有人可以解释,那就太好了!
答案 0 :(得分:2)
在执行Duper
构造函数的主体之前,它将执行超类Super
的构造函数。因此,在“ duper”之前打印“ Super”。
Fly
构造函数也是如此。
关于打印号码z = x + y + n
。 x
和n
为1,而y
为0,所以总和为2。请注意,Fly
不是Duper
的子类,并且即使是y
的{{1}}成员,仍然会包含Fly
并隐藏0
的{{1}}成员,因此{ {1}}的变量y
初始化为2。
答案 1 :(得分:1)
y是Duper中的2
不。 y来自Fly并用0初始化,因此z为2(Super的x = 1,Fly的y = 0,n为delta,即1)。您将在super.y
的构造函数中使用Fly
来访问Duper
的y。
此外,对于“超级duper”,除非您明确调用它,否则会自动调用super()
。在某些情况下,您可能不希望使用super()
,例如基类没有no-arg构造函数,但是有一个接受int的构造函数,因此在派生类的构造函数中,您将其称为super(42)
。
答案 2 :(得分:1)
在子类的构造函数中,如果不显式调用父类的构造函数,则隐式调用父类的默认构造函数。
因此,基本上,Duper类的编译就像是编译
public class Duper extends Super {
protected int y = 2;
public Duper() {
super(); // call Super default constructor
System.out.println(" duper");
}
}
Fly也一样
答案 3 :(得分:1)
Duper d = new Duper();
实例化一个新的Duper
,Duper()
构造函数隐式调用Super()
构造函数
-> 打印“超级” (无行返回)
->然后打印“ duper” (带有换行符)
int delta = 1;
Fly f = new Fly(delta);
Fly
构造函数隐式调用Super()
构造函数-> 打印“超级” (无行返回)
然后调用this(0)
。
编辑:在Fly
中,private int z, y;
将z
和y
都初始化为0
(这是默认值int
)
然后从x = 1
继承Super
,然后将x
的值设置为1
,y
和z
的值保持{{ 1}}。
调用0
时,构造函数n
将1
设置为public Fly(int n)
(增量为new Fly(delta)
)
并计算
1
然后打印“飞行时间2” (带有换行符)