这段代码如何给我0作为i的值,而不是20?

时间:2016-06-12 13:17:01

标签: java

我除了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);
    }
}

5 个答案:

答案 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);
    }
}
  1. 第1步: void main通过新InvalidValue()启动通话。我
  2. 步骤2: j 将按默认值 0 启动,然后 InvalidValue( )构造函数将被调用,然后 super(); 将被调用 叫,
  3. 第3步:现在构造函数(赋值给实例属性)调用 private int i = giveMeJ()
  4. 步骤4: 给予()方法,此处 i 的值 0 也值 j 0 ,因此此方法将返回0
  5. 第5步: 0 进行初始化,现在流程将转到 private int j = 20
  6. 第6步: 20 值将分配给 j
  7. 第7步:现在编译器将返回构造函数(步骤3),然后它将打印 sysout 语句(里面构造函数[i = 0,j = 20] ),
  8. 第8步:现在编译器将返回 void main() (步骤1),它将打印 sysout 声明( i:0

答案 2 :(得分:2)

j使用后初始化为20 。这里发生的是giveMeJ()用于初始化i返回j的默认值(即0),然后j初始化为20.如果你翻转订购ij并定义您将获得预期结果。

答案 3 :(得分:0)

ji后初始化(尽管它存在),并且在您调用0时值为giveMeJ()。因此,您得到0

如果您将j更改为static,您会看到它返回20,因为在调用该方法之前,它的值将被修复。

答案 4 :(得分:0)

<强>问题 运行程序时。首先要运行的是静态方法,最后和静态字段(成员变量)然后逐行读取程序。

以下是您的程序如何运行 - 第一个主要叫做。 然后调用新创建的对象InvalidValue的第一个字段。 它调用giveMeJ。然后读取giveMeJ并返回j的值。

在这里你可以从程序流程中观察到j从未被初始化。

解决方法 使j静态或最终或两者或初始化j高于i。