초기화되지 않은 개체와 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 objectsNull 검사 초기화되지 않은 개체가 정확하다고 가정 할 수있는 것과 동일 합니까?

답변:


115

정확합니다. 명시 적으로 초기화되지 않은 참조 유형의 정적 및 인스턴스 멤버는 모두 nullJava 에 의해 설정됩니다 . 동일한 규칙이 배열 구성원에 적용됩니다.

로부터 Java 언어 사양 , 섹션 4.12.5 :

변수의 초기 값

프로그램의 모든 변수에는 값이 사용되기 전에 값이 있어야합니다.

각 클래스 변수, 인스턴스 변수 또는 배열 구성 요소는 생성시 기본값으로 초기화됩니다.

[...] 모든 참조 유형의 기본값은 null입니다.

위의 규칙은 지역 변수를 제외합니다. 명시 적으로 초기화해야합니다. 그렇지 않으면 프로그램이 컴파일되지 않습니다.


예를 들어 이것이 어떻게 적용 char됩니까? 나는 할 수 char test;있지만char test = null;
xorinzor

1
@xorinzor 당신은 할당 할 수 없습니다 nullchar는 원시 형이기 때문이다. 또한 나중에 char test;할당하지 않고 메서드 내에서 수행 할 수 없습니다 test. char test='a'원하는 경우 수행 하거나 char test;멤버 선언에서 그대로 두어 기본값 인 '\0'.
세르게이 Kalinichenko

14

경우 Object참조가 선언되었지만 인스턴스화되었는지, 그 값입니다 null.


8
클래스의 인스턴스 필드로만.
Sotirios Delimanolis 2013 년

1
@SotiriosDelimanolis 좀 자세히 설명해 주 시겠어요? 나는 배우려고 해요 :)
SnakeDoc

5
@SnakeDoc 메서드 본문에 Object를 선언하는 경우 먼저 초기화하지 않고 사용하려고하면 컴파일 오류가 발생합니다.
Sotirios Delimanolis

9
여기서 정확할 가치가 있습니다. 객체를 선언하지 않습니다. 변수를 선언 합니다 . 그들은 같은 것이 아닙니다.
Jon Skeet

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");
              }   
            }
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.