Неинициализированный объект против объекта, инициализированного значением NULL

93

Я работаю на Яве.

Я обычно настраиваю некоторые объекты как таковые:

public class Foo {
    private SomeObject someName;

    // do stuff

    public void someMethod() {
        if (this.someName != null) {
            // do some stuff
        }
    }
}

Возникает вопрос: someNameприравнивается ли в этом примере к тому null, как я могу reliably for all objectsпредположить, что проверка на null неинициализированных объектов будет точной?

SnakeDoc
источник

Ответы:

115

Правильно, как статические члены, так и члены экземпляра ссылочного типа, не инициализированные явно, устанавливаются в nullJava. То же правило применяется к членам массива.

Из Спецификации языка Java , раздел 4.12.5:

Начальные значения переменных

Каждая переменная в программе должна иметь значение, прежде чем ее значение будет использовано:

Каждая переменная класса, переменная экземпляра или компонент массива инициализируется значением по умолчанию при создании.

[...] Для всех ссылочных типов значение по умолчанию - null.

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

Сергей Калиниченко
источник
как это применимо, например, к char? Я могу, char test;но не могуchar test = null;
xorinzor
1
@xorinzor Вы не можете назначить nullна , charпотому что это примитивный тип. Также вы не можете работать char test;внутри метода без testпоследующего назначения . Вы можете сделать это, char test='a'если хотите, или оставить это как char test;в объявлении члена, чтобы получить значение по умолчанию '\0'.
Сергей Калиниченко
14

Если Objectссылка была объявлена, но не создана, ее значение равно null.

Джаред Нильсен
источник
8
Только как поле экземпляра класса.
Сотириос Делиманолис,
1
@SotiriosDelimanolis не могли бы вы уточнить, пожалуйста? Пытаюсь узнать :)
SnakeDoc
5
@SnakeDoc. Если вы объявите объект в теле метода, вы получите ошибку компиляции, если попытаетесь использовать его без предварительной инициализации.
Сотириос Делиманолис
9
Здесь стоит быть точным - вы никогда не объявляете объект. Вы объявляете переменную . Это не одно и то же.
Джон Скит
7
@SotiriosDelimanolis, извините, что поднимаю действительно старое обсуждение, но есть ли у вас ссылка на то, почему они решили, что это должно вызвать ошибку компиляции, а не просто инициализировать его nullкак поле экземпляра?
childofsoong
-1
namespace Design
     {
              class Program
              {

                static void Main(string[] args)
                {
                  Logger obj1;   // By Default, the value of obj1 is null
                  Logger obj2 = new Logger();  // By Default the value of obj2 is 
                                               // Design.Logger which is not null
                  Console.WriteLine(obj2); 
                  Console.Read();
                }
              }

     class Logger
           {
             public Logger()
              {
                 Console.writeline("Called");
              }   
            }
        }
Александр Залдостанов
источник