Java 字段的初始化顺序是什么?

Java 字段的初始化顺序是什么?,java,initialization,Java,Initialization,我在学习考试的模型题时读了这个问题 class Was { private int a=show(); private int b=5; private int show() { return b; } public static void main(String args[]) { System.out.println((new Was()).a); } } 我编译了这个,它打印为0。为什么不打印

我在学习考试的模型题时读了这个问题

class Was
{
    private int a=show();
    private int b=5;
    private int show()
    {
        return b;
    }
    public static void main(String args[])
    {
        System.out.println((new Was()).a);
    }
}

我编译了这个,它打印为0。为什么不打印为“5”?

字段初始化是在调用构造函数时按声明顺序进行的。这个领域

private int a=show();
是在之前初始化的

private int b=5;

它由
show()
返回的值初始化。此时,
b
尚未初始化为
5
。其默认值为
0
。因此
show()
返回
0
。该值被分配给
a

字段,在调用构造函数时,按照声明顺序进行初始化。这个领域

private int a=show();
private int a=show();
是在之前初始化的

private int b=5;
它由
show()
返回的值初始化。此时,
b
尚未初始化为
5
。其默认值为
0
。因此
show()
返回
0
。该值被分配给
a

private int a=show();
调用
show()
方法时,
b
的值尚未设置,因此整数的默认值为
0
results

查看所需输出

private int b=5;
private int a=show();
调用
show()
方法时,
b
的值尚未设置,因此整数的默认值为
0
results

查看所需输出

private int b=5;
private int a=show();

因为初始值设定项是按它们出现的顺序计算的。因为初始值设定项是按它们出现的顺序计算的。谢谢@Sotirios Delimanolis。但是,在调用show()时,b是未知字段,如何返回?@anavaraslamurep该字段是已知的,它刚刚被赋予了
int
原语的默认值,这是
0
。Java对象字段经过两个步骤。在执行任何构造函数或初始值设定项之前,每个构造函数或初始值设定项都被初始化为仅取决于其类型的默认值,0表示数值字段,null表示引用,false表示布尔值。该值可以稍后由初始值设定项或构造函数代码更改。谢谢@Sotirios Delimanolis。但是,在调用show()时,b是未知字段,如何返回?@anavaraslamurep该字段是已知的,它刚刚被指定为
int
原语的默认值,这是
0
。Java对象字段经过两个步骤。在执行任何构造函数或初始值设定项之前,每个构造函数或初始值设定项都被初始化为仅取决于其类型的默认值,0表示数值字段,null表示引用,false表示布尔值。该值可以稍后由初始值设定项或构造函数代码更改。