鉴于以下代码:
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.任何反馈将不胜感激。
答案 0 :(得分:4)
因为他们指的是相同的数字
Java中没有指针。
i
和j
是包含整数值的原始变量。
int j = i;
将j
的当前值分配给i
。分配后更改i
并不会更改j
。
因此i
首先被初始化为6,然后j
被分配6,然后i
被更改为5(它不会更改{{1}的值}})。
答案 1 :(得分:2)
您所描述的内容适用于reactive programming模型。 JVM不能以这种方式工作。 j
变量在字段声明中分配时包含旧值i
。因此它的价值仍为6
。 i
的值更改后,新值不会发布到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;
这两个语句首先执行,因此i
和j
的值为6。
现在,当您调用构造函数时,您将获得i=5
。 i
的值现已更改,但j
的值仍为6。
所以当你说a.i+a.j
时它是5 + 6,因此11就是答案。 i
中的更改不会更改j
,因为它们是原始数据类型和对象。