Присвоение значений переменным класса - PullRequest
3 голосов
/ 17 октября 2011

Я постараюсь сохранить это простым.

class MyClass {
   private int x = 3;
}

против

class MyClass {
   private int x;
   public MyClass() {
      x = 3;
   }
}

В чем разница между ними и как эти различия вступают в игру?

Заранее спасибо.

Ответы [ 6 ]

3 голосов
/ 17 октября 2011
class MyClass {    
   private int x = 3; 
} 

совпадает с

class MyClass {    
   private int x; 
   MyClass() { // default constructor based on the class access modifier
     x = 3; 
   }
} 
2 голосов
/ 17 октября 2011

В вашем примере у вас фактически есть переменная экземпляра, а не переменная класса.Разница наступает в тот момент, когда вы добавляете новый конструктор MyClass (аргумент объекта) и забываете непосредственно устанавливать x и забываете также вызывать оригинальный конструктор без аргументов.Если вы сделаете его окончательным, если это применимо, вы, конечно, заставите вас не забывать устанавливать значение где-либо.

В случае с переменными класса все становится намного интереснее, просто измените x на static и добавьте следующий метод main в MyClassи наблюдать за результатами.

   public static void main(String ... args) {
       MyClass y = null;
       System.out.println(y.x);
       System.out.println(MyClass.x);
       new MyClass();
       System.out.println(MyClass.x);
   }
2 голосов
/ 17 октября 2011

Инициализация полей выполняется до вызова конструктора . Но для вашего примера они такие же

2 голосов
/ 17 октября 2011

Ничего.Переменные устанавливаются при вызове конструктора, вы можете увидеть это, добавив строку MyClass temp = new MyClass() и войдя в нее с помощью отладчика, отладчик сначала перейдет на строку private int x = 3;.

2 голосов
/ 17 октября 2011

Они оба одинаковы. Но если бы х был статической переменной, они были бы разными.

1 голос
/ 17 октября 2011

Как уже упоминали другие, они оба эквивалентны.Основным отличием является удобочитаемость, двойственность и удобство сопровождения кода.Если мы расширим данный пример, чтобы иметь более одного конструктора, вы начнете замечать различия.Если значение x не зависит от конструктора, я бы порекомендовал инициализировать переменную поля, иначе установите значение в конструкторах.Это несколько повысит удобочитаемость и удобство сопровождения кода и удалит дублирующийся код (в случае, если несколько конструкторов должны инициировать переменную с одинаковым значением).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...