Java变量和构造函数初始化?

时间:2017-01-18 13:44:34

标签: java variables constructor initialization

鉴于以下代码:

public class A {

   private int i = 6;
   private int j = i;

   public A() {
       i = 5;
   }

   public static void main(String[] args) {
      A a = new A();
      System.out.println(a.i + a.j);
   }
}

为什么这个加法的输出是11而不是10?据我所知,构造函数在静态和实例变量初始化后最后运行。因此,如果构造函数是最后一个被触发的,它应该将“both”i和j设置为5,因为它们指向相同的数字。有人可以一步一步解释这里发生的事情,这样一旦执行该值是11.任何反馈将不胜感激。

4 个答案:

答案 0 :(得分:4)

  

因为他们指的是相同的数字

Java中没有指针。

ij是包含整数值的原始变量。

int j = i;

j的当前值分配给i。分配后更改i并不会更改j

因此i首先被初始化为6,然后j被分配6,然后i被更改为5(它不会更改{{1}的值}})。

答案 1 :(得分:2)

您所描述的内容适用于reactive programming模型。 JVM不能以这种方式工作。 j变量在字段声明中分配时包含旧值i。因此它的价值仍为6i的值更改后,新值不会发布到j

答案 2 :(得分:0)

一切都是Java中的指针,它只是隐藏在你身上。当你来自其他语言时,这会导致混淆。

private int i = 6; // i is an int pointer, the value hold at his address is 6
private int j = i; // j is an int pointer, its value is assigned from the value hold at i, therefore it is 6
A a = new A(); // i is now assigned a value of 5, but i and j have different address, so j isn't impacted.

如果您想要如您所述的行为,则必须使用对象。

private int[] i = new int[] {6}; // Not sure of this syntax
private int[] j = i;
i[0] = 5;
System.out.println(i[0]+j[0]);

它就是。

答案 3 :(得分:0)

执行流程为: -

private int i = 6;
private int j = i;

这两个语句首先执行,因此ij的值为6。 现在,当您调用构造函数时,您将获得i=5i的值现已更改,但j的值仍为6。

所以当你说a.i+a.j时它是5 + 6,因此11就是答案。 i中的更改不会更改j,因为它们是原始数据类型和对象。