2013-07-01 2 views
0

Ссылки могут быть созданы с помощьюМаленькая путаница между ClassType variable_name = null И ClassType имя_переменной;

Class_Name Var_Name; 
Class_Name Var_Name=null; 

Я знаю, что в обоих случаях var_name присваивается нулевое значение. Является ли это просто хорошим стандартом кодирования для присвоения значения null (аннулирование ссылки) для ссылки или существует какая-либо логика или преимущество присвоения значения null.

+2

Мы говорим о полях в классе или переменных внутри метода? –

+0

Не могли бы вы рассказать мне, что произойдет в обоих случаях – JOHND

+0

Это зависит от того, записываете ли вы его как поле класса или как локальную переменную внутри метода. Первый запускает компилятор, когда вы используете его как локальную переменную, и вы пытаетесь прочитать значение переменной перед назначением значения. –

ответ

1

В случае полей классов нет никакой разницы. Поля, которые явно не инициализируются, инициализируются значением по умолчанию для этого типа при создании экземпляра класса; в случае объектов по умолчанию 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, ...); 
+0

Хорошее объяснение и строка «но это кажется бессмысленным для меня нет необходимости упоминать myClass1 до тех пор, пока вы его не создадите. Вместо этого просто выполните: – JOHND

2

Это не просто хорошее кодирование.

Вы должны инициализировать переменные в Java. Для полей классов вам не нужно этого делать, но на самом деле они инициализируются как null.

Для локальной переменной вы не можете использовать неинициализированный переменную так:

String n; 
n.length() 

нашел Также подобный вопрос: uninitialized vars

+0

Я имею в виду, если предположить, что сначала объявляю переменную ref как Test t; и после серии вычислений и операций присваиваем значение t = somethingObj; что произойдет – JOHND

+0

, вы не сможете использовать t до тех пор, пока оно не будет инициализировано (речь идет о локальных переменных). поэтому вы можете сделать это t = что-то, если вы никогда не использовали t до – Tala

+0

Если компилятор может сказать, что 't' будет инициализирован до его использования, компилятор не будет жаловаться. Но анализ компилятора не особенно устойчив. 'boolean b = true; if (b) {t = new Test();} t.exec(); 'не будет компилироваться. –

0

зависит от вашего использования.

Для переменных переменного уровня, если вы не назначаете null, вы получаете ошибку компилятора, если используете переменную перед назначением ей значения.

Для переменных уровня класса это просто избыточно.

2

Ну, если указанное выше объявление находится на уровне экземпляра, то присвоение null явно избыточно, поскольку переменные экземпляра получают значения по умолчанию. Однако для локальных переменных вы должны инициализировать переменную, прежде чем использовать ее, иначе будет ошибка компилятора

+0

Я имею в виду, если предположить, что сначала объявляю переменную ref как Test t; и после серии вычислений и операций присваиваем значение t = somethingObj; что произойдет – JOHND

+0

В этом случае 't' теперь укажет на вновь созданный объект (somethingObj), и ссылка на ваш первоначальный объект будет потеряна – PermGenError

+0

В обоих случаях или во втором случае? – JOHND

1

Инициализация полей 0-false-null является избыточной.

Явным образом установка полей в 0, ложных или нулевых (в зависимости от обстоятельств) является ненужной и избыточной. Поскольку эта языковая функция была включена для того, чтобы частично сократить повторяющееся кодирование, рекомендуется использовать ее в полной мере. Настаивая на том, что поля должны быть явно инициализированы до 0, false или null, является идиомой, которая, вероятно, неприемлема для Java programming language.