我除了i:20的值,但是它给了我0的值,为什么我在java 1.7版本中获得值0?
public class InvalidValue {
private int i = giveMeJ();
private int j = 20;
private int giveMeJ() {
return j;
}
public static void main(String[] args) {
System.out.println("i: " + new InvalidValue().i);
}
}
答案 0 :(得分:8)
实例变量按出现顺序初始化。因此private int i = giveMeJ()
在j
初始化为20之前执行,因此i
被分配了默认值j
,即0
。
答案 1 :(得分:6)
如果没有构造函数,Java会保留默认构造函数。因此,让我们在代码中保留默认构造函数,以便在每一步中理解代码流和i和j的值:
见下面的代码:
package com.java;
public class InvalidValue {
private int i = giveMeJ();
private int j = 20;
// Default Constructor
public InvalidValue() {
super();
// Second Print: inside Constructor[i= 0, j= 20]
System.out.println("inside Constructor[i= " + i + ", j= " + j + "]");
}
private int giveMeJ() {
// First Print: inside giveMeJ[i= 0, j= 0]
System.out.println("inside giveMeJ[i= " + i + ", j= " + j + "]");
return j;
}
public static void main(String[] args) {
// Third Print: i: 0
System.out.println("i: " + new InvalidValue().i);
}
}
答案 2 :(得分:2)
j
在使用后初始化为20 。这里发生的是giveMeJ()
用于初始化i
返回j
的默认值(即0),然后j
初始化为20.如果你翻转订购i
和j
并定义您将获得预期结果。
答案 3 :(得分:0)
j
在i
后初始化(尽管它存在),并且在您调用0
时值为giveMeJ()
。因此,您得到0
。
如果您将j
更改为static
,您会看到它返回20,因为在调用该方法之前,它的值将被修复。
答案 4 :(得分:0)
<强>问题强> 运行程序时。首先要运行的是静态方法,最后和静态字段(成员变量)然后逐行读取程序。
以下是您的程序如何运行 - 第一个主要叫做。 然后调用新创建的对象InvalidValue的第一个字段。 它调用giveMeJ。然后读取giveMeJ并返回j的值。
在这里你可以从程序流程中观察到j从未被初始化。
解决方法 使j静态或最终或两者或初始化j高于i。