В случае полей классов нет никакой разницы. Поля, которые явно не инициализируются, инициализируются значением по умолчанию для этого типа при создании экземпляра класса; в случае объектов по умолчанию null
. Итак:
private MyClass myClass1;
эквивалентно
private MyClass myClass1 = null;
, так как приведет к myClass1
быть null
.
В случае переменных метода существует довольно большая разница. Переменные должны иметь объявленное значение, даже если это null
, иначе вы получите (потенциальные) ошибки компилятора, когда позже попытаетесь его использовать. Делая что-то вроде этого:
public void myMethod() {
MyClass myClass1;
if(someCondition)
myClass1 = new MyClass();
myClass1.doSomething();
}
будет недействительным, так как компилятор не может гарантировать, что myClass1
будет иметь значение.Изменение этой строки до MyClass myClass1 = null;
было бы действительно, хотя на практике вы могли получить ошибку времени выполнения (NullPointerException
), если someCondition
не соответствует действительности.
Вы могли бы сделать что-то вроде этого:
MyClass myClass1;
// calculate some values
myClass1 = new MyClass(arg1, arg2, ...);
но кажется бессмысленным для меня; нет необходимости указывать myClass1
, пока вы не создадите его. Вместо этого просто выполните:
// calculate some values
MyClass myClass1 = new MyClass(arg1, arg2, ...);
Мы говорим о полях в классе или переменных внутри метода? –
Не могли бы вы рассказать мне, что произойдет в обоих случаях – JOHND
Это зависит от того, записываете ли вы его как поле класса или как локальную переменную внутри метода. Первый запускает компилятор, когда вы используете его как локальную переменную, и вы пытаетесь прочитать значение переменной перед назначением значения. –