Неініціалізований об’єкт проти об’єкта, ініціалізованого до NULL


93

Я працюю на Java.

Я зазвичай встановлюю деякі об'єкти як такі:

public class Foo {
    private SomeObject someName;

    // do stuff

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

Питання someNameв наступному : Чи прирівнюється в цьому прикладі до того null, як я можу reliably for all objectsприпустити, що неініціалізовані об’єкти, що перевіряють нуль, будуть точними?

Відповіді:


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
Тільки як поле екземпляра класу.
Sotirios Delimanolis

1
@SotiriosDelimanolis, будь ласка, розкажіть? Я намагаюся вчитися :)
SnakeDoc

5
@SnakeDoc Якщо ви оголосите об'єкт у тілі методу, ви отримаєте помилку компіляції, якщо спробуєте використовувати його без попередньої ініціалізації.
Sotirios Delimanolis

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");
              }   
            }
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.