解释以下java程序的执行流程

时间:2012-03-15 06:06:33

标签: java oop

“任何人都可以解释一下以下java代码的执行流程吗?” 对不起我的误导性陈述......我的问题是......

Main b = new Main();

控件转到A类构造函数,然后控件直接转到类Main

的overriden方法
public void PrintFields() {
    System.out.println("x = "+x+" y = "+y);
}

为什么编译器没有给出错误,因为没有创建x和y .. !!我对此感到困惑。

什么时候在内存中创建x和y以及何时进行初始化?是控件到达Main class?

中的以下语句时创建的x和y
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)

谢谢。

3 个答案:

答案 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,因为xy字段具有默认值。
  • A()完成后,Main()构造函数继续执行。它初始化xy。 (请注意,在int x = 1;完成之后,A()的分配部分才会执行。)Main()然后调用再次执行的PrintFields()并打印(现已初始化)xy的值。

所有这些工作原理的说明可以在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);  

这可能会让您更容易理解其他回答者告诉您的内容。