Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java变量和构造函数初始化?_Java_Variables_Constructor_Initialization - Fatal编程技术网

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

Java变量和构造函数初始化?,java,variables,constructor,initialization,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?据我所知,构造函数在初始化静

鉴于以下代码:

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?据我所知,构造函数在初始化静态变量和实例变量之后最后运行。因此,如果构造函数是最后一个被触发的,它应该将i和j都设置为5,因为它们指向相同的数字。请有人一步一步地解释一下这里发生了什么,这样一旦执行,值就是11。如有任何反馈,将不胜感激

因为它们指向同一个数字

Java中没有指针

i和j是包含整数值的基本变量

int j = i;
将j的当前值指定给i。在作业后改变i不会改变j

因此,首先将i初始化为6,然后将j赋值为6,然后将i更改为5,这不会改变j的值

因为它们指向同一个数字

Java中没有指针

i和j是包含整数值的基本变量

int j = i;
将j的当前值指定给i。在作业后改变i不会改变j


因此,首先将i初始化为6,然后将j指定为6,然后将i更改为5,这不会更改j的值。

您所描述的内容适用于模型。JVM不是这样工作的。j变量包含在字段声明中赋值时的旧值i。因此它的值仍然是6。i的值更改后,新值不会发布到j。

您描述的内容适用于模型。JVM不是这样工作的。j变量包含在字段声明中赋值时的旧值i。因此它的值仍然是6。i的值更改后,新值不会发布到j。

在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]);

它就在那里。

在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]);

就在这里。

执行流程是:-

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,因为它们是原始数据类型和对象。

执行流程是:-

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,因为它们是基本数据类型和对象。

所以输出为11的原因是因为它们是基本数据而不是对象?如果它们是对象,那么引用肯定会在内存中寻址同一个对象,并且对象j将与i j==i相同。CBA110否。如果使用整数而不是int,答案将是相同的。当您为变量指定新值时,无论它是基元值还是对对象的引用,您不会影响在赋值之前恰好具有相同值的其他变量的值。另一方面,如果i和j都引用同一个可变对象,调用i.setSomethingvalue也会更改j引用的对象的状态,因为两者都引用同一个object.Perfect。谢谢@Eran。所以输出为11的原因是因为它们是原语而不是对象?如果它们是对象,那么引用肯定会在内存中寻址同一个对象,并且对象j将与i j==i相同。CBA110否。如果使用整数而不是int,答案将是相同的。当您为变量指定新值时,无论它是基元值还是对对象的引用,您不会影响在赋值之前恰好具有相同值的其他变量的值。另一方面,如果i和j都引用同一个可变对象,调用i.setSomethingvalue也会更改j引用的对象的状态,因为两者都引用同一个object.Perfect。谢谢你@Eran。