“任何人都可以解释一下以下java代码的执行流程吗?” 对不起我的误导性陈述......我的问题是......
Main b = new Main();
控件转到A类构造函数,然后控件直接转到类Main
的overriden方法public void PrintFields() {
System.out.println("x = "+x+" y = "+y);
}
为什么编译器没有给出错误,因为没有创建x和y .. !!我对此感到困惑。
什么时候在内存中创建x和y以及何时进行初始化?是控件到达Main
class?
int x = 1;
int y;
代码:
class A
{
public A() {
PrintFields();
}
public void PrintFields() {}
}
class Main extends A
{
int x = 1;
int y;
public Main() {
y = -1;
PrintFields();
}
public void PrintFields() {
System.out.println("x = "+x+" y = "+y);
}
}
class Test
{
public static void main(String[] args) {
Main b = new Main();
}
}
输出:
run:
x = 0 y = 0 //why 0 0 ?
x = 1 y = -1 // why 1 -1 ?
BUILD SUCCESSFUL (total time: 0 seconds)
谢谢。
答案 0 :(得分:5)
Main b = new Main();
control转到A类构造函数,然后调用Main类
的overriden方法public void PrintFields() {
System.out.println("x = "+x+" y = "+y);
}
此时x和y的默认值为
so x=0, y=0
现在控制来了
int x = 1;
int y;
public Main() {
y = -1;
PrintFields();
}
然后
public void PrintFields() {
System.out.println("x = "+x+" y = "+y);
}
此时x = 1且y = -1
所以输出是
x=1, y=-1
答案 1 :(得分:3)
流程如下:
main
来电new Main()
。Main()
构造函数隐式调用A()
作为第一件事。A()
来电PrintFields()
。但是,因为重写了此方法,所以实际执行的是Main.PrintFields()
。这会打印第一行x = 0 y = 0
,因为x
和y
字段具有默认值。A()
完成后,Main()
构造函数继续执行。它初始化x
和y
。 (请注意,在int x = 1;
完成之后,A()
的分配部分才会不执行。)Main()
然后调用再次执行的PrintFields()
并打印(现已初始化)x
和y
的值。所有这些工作原理的说明可以在Java Language Specification (§12.5)。
中找到答案 2 :(得分:0)
如果你改变:
System.out.println("x = "+x+" y = "+y);
为:
new Exception().printStackTrace(System.out); // <-- CFPMD (poor man's debugger)
System.out.println("x = "+x+" y = "+y);
这可能会让您更容易理解其他回答者告诉您的内容。