2017-01-18 3 views
1

Учитывая код ниже:Переменная Java и инициализация конструктора?

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. Любая обратная связь будет принята с благодарностью.

ответ

4

, поскольку они указывают на тот же номер

Там нет указателей в Java.

i и j - это примитивные переменные, содержащие целочисленные значения.

int j = i; 

присваивает текущее значение j к i. Изменение i после назначения не изменяется j.

Поэтому i сначала инициализируется до 6, а затем j назначается 6, а затем i изменяется до 5 (который не изменяет значение j).

+0

Итак, причиной является выход 11, потому что это примитивы, а не объекты? Если бы они были объектами, то ссылки ссылались бы на один и тот же объект в памяти, а объект j был бы таким же, как и i ((j == i)). – CBA110

+1

@ CBA110 № Ответ будет таким же, если вы использовали 'Integer' вместо' int'.Когда вы назначаете новое значение переменной (будь то примитивное значение или ссылка на объект), вы не влияете на значение других переменных, которые имеют одинаковое значение до назначения. Если, с другой стороны, 'i' и' j' относятся к одному и тому же изменяемому объекту, вызов 'i.setSomething (value)' также изменит состояние объекта, на которое ссылается 'j', поскольку оба будут ссылаться к одному и тому же объекту. – Eran

+0

Perfect. Спасибо @Eran. – CBA110

2

Что вы описываете, относится к модели reactive programming. JVM не работает таким образом. Переменная j содержит старое значение i во время его назначения в объявлении поля. Следовательно, его значение остается 6. После изменения значения i новое значение не публикуется до 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]); 

Это не так.

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, поскольку они имеют примитивный тип данных и объекты.

Смежные вопросы