[java] null은 개체입니까?

ObjectJava에서 null 입니까?



답변

널 (null)이 객체 인 경우에, 그것은의 방법을 지원하는 것 java.lang.Object등을 equals(). 그러나 이것은 사실이 아닙니다. null에 대한 모든 메서드 호출은NullPointerException . .

이 주제에 대한 Java 언어 사양 은 다음과 같이 말합니다.

또한 이름이없는 특수 널 유형 인 널 표현식 유형도 있습니다. 널 유형에는 이름이 없기 때문에 널 유형의 변수를 선언하거나 널 유형으로 캐스트 할 수 없습니다. 널 참조는 널 유형 표현식의 유일한 가능한 값입니다. 널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다. 실제로 프로그래머는 null 형식을 무시하고
null이 참조 형식이 될 수있는 특수 리터럴 인 척만 할 수 있습니다.

나는 이것이 “null은 특별하다”로 요약 될 수 있다고 생각한다.


답변

자바에 따르면 사양 , null(주석에 명시된 값으로) 객체 변수에 할당 될 수있는 타입이다. 이 유형의 변수를 인스턴스화하거나 만들 수는 없지만 null컴파일러에서 제공 하는 리터럴을 사용해야합니다 .


답변

절대 아닙니다 : null instanceof Objectfalse를 반환합니다.


답변

아니요, 개체가 아닙니다.


답변

Null은 개체가 없습니다.


답변

JRL은 다음과 같이 썼습니다.

아니, 아니야 …

자주, 그것은 당신이 그것을 보는 곳, 당신이 더 믿는 사람에 달려 있습니다.

JLS에 따르면 예, . 특히 질문을 “Is the nullliteral of type Object?”로 바꾸면 특히 그렇습니다 . 위의 Michael Borgwardt가 인용 한 JLS 4.1 외에도 :

JLS 3.10.7 참조 :

널 리터럴은 항상 널 유형입니다.

JLS 4.10 :

유형 T의 하위 유형은 T가 U의 상위 유형이고 널 유형 인 모든 유형 U 입니다.

또는 JLS 4.10.2 :

널 유형의 직접 상위 유형은 널 유형 자체가 아닌 모든 참조 유형 입니다.

[내가 강조합니다.]

이클립스 2019-09의 컴파일러에 따르면 그렇지 않다 :

true.toString();  // Cannot invoke toString() on the primitive type boolean
null.toString();  // Cannot invoke toString() on the primitive type null

OpenJDKs에 따르면 12.0.1 javac 이있다 :

true.toString();  // error: boolean cannot be dereferenced
null.toString();  // error: <null> cannot be dereferenced

꺾쇠 괄호 null는 기본 유형이 아닌 다른 유형을 의미합니다 . 그리고 JLS 4.1 에 따르면 :

Java 프로그래밍 언어에는 기본 유형 (…)과 참조 유형 (…)의 두 가지 유형이 있습니다.

하나가 아니라면 다른 것입니다.


Claudiu는 다음과 같이 썼습니다.

null은 추한 것입니다.

Au contraire, null아름답습니다. 대신 참조 유형 변수의 기본값으로 무엇을 제안 하시겠습니까? 임의의 비트 조합? 액세스 위반 또는 더 나쁜 경우 포인터 지옥에 오신 것을 환영합니다!


Joachim Sauer는 다음과 같이 썼습니다.

null은 유형 및 값입니다.

실제로 null 과 관련된 세 가지 항목이 있습니다 ( JLS 3.10.7 참조 ).

  1. (그렇지 않으면 이름이 지정되지 않은) null 유형 입니다.
  2. null 문자 .
  3. 널 레퍼런스 값. (일반적으로 null 값 또는 간단히 null 로 축약됩니다 .)

(1) 위에 언급 된 JLS 4.10.2 에 따르면 null 유형 은 인터페이스뿐만 아니라 클래스에도 다중 상속을 사용합니다. 우리 모두가 알고있는 것은 우리 애플리케이션 프로그래머에게는 불가능합니다.

(2) 널 리터럴 은 다음과 같이 정의되는 변수로 상상할 수 있습니다.

JVM_global final null_type null = new null_type();

JLS 3.9 참고 :

다양한 문자 시퀀스가 ​​때때로 키워드로 잘못 가정됩니다.

  • null키워드가 아니라 null 리터럴 ( §3.10.7 )입니다.

에 관하여 null instanceof <any type>

JLS 4.10.2를 염두에두고 ( ” null 유형 은 모든 유형의 하위 유형입니다”) null instanceof <any type>로 평가 true해야합니다. 그렇지 않습니까? 첫눈에 수 있지만 JLS 15.20.2 는 통찰력에 대한 답을 제공합니다.

[…] 결과instanceof연산자 이다 true값 경우RelationalExpression이 아니다null […]. 그렇지 않으면 결과는false 입니다.

[내가 강조합니다.]

(응용 프로그램 프로그래머의 관점에서) 더 의미있는 것이 무엇인지 자문 해보십시오.

  • 제공 false하고 따라서 참조 표현식이 우리에게 노출 된 유형이 아님을 나타냅니다. 즉, 우리에게 유용한 것을 참조하지 않음을 나타냅니다.

  • 또는 제공 true하여 표현식이 특수 참조로 평가된다는 사실을 알려줍니다 . “객체”를 참조하는 null 참조 는 존재 여부와 이름이없는 특수 null 유형 인지 알 수 없습니다. 우리가 null 리터럴을 통해 다중 상속을 포함하는 모든 유형의 하위 유형이며 어쨌든 무시해야합니까? 더 실용적인 예도 고려하십시오.

     class Car implements Vehicle {
     ...
     Vehicle car = null;
     ...
     boolean b = car instanceof Car;  // True? There's not even an instance
     ...                              // which could be of type Car.

또한 다음으로 이어집니다.

instanceof무언가를 말하는 적절한 방법 이 아닌 이유null ‘객체 성’ 아닌가?

instanceofnot 이라고 sameorsubtypeof합니다. 즉, 인스턴스의 유형을 두 유형이 아닌 유형과 비교하고 있음을 의미합니다. 이제는 null“인스턴스가 없습니다”를 의미하며 인스턴스가 없으면 인스턴스 유형이 없습니다. 아무것도 비교하지 않으면false .

또는 “더 많은”실제 사례에서 :

  • »Big Apple«( = 참조 유형 이름 ) 을 사용하여 실제 크기의 사과 사진 ( = 참조 유형 )을 손에 들고 있습니다. )이 적힌 을 가지고 있습니다.
  • 테이블이 있습니다 ( = heap내 앞에 )이 있습니다.
  • 테이블에 사과 ( = instance )가 있으면 코드 ( = reference 연결된 )가 있습니다.
  • 이 코드의 다른 쪽 끝을 손에 쥐고 있습니다 ( = reference 변수 ).
  • 코드를 따라 사과를 따라 내 그림 ( = instanceof ) 과 비교합니다 .
  • 사과의 크기가 그림과 같거나 큰 경우»Big Apple«이라는 글씨가 적용됩니다 ( = true ).
  • 더 작 으면 그렇지 않습니다 ( = false ).
  • 테이블에 사과가없고 (= 인스턴스 없음) 코드가 없으면 ( = null ) 쓰기도 적용되지 않습니다 ( = false ). 때문에 : 없습니까 사과는 큰 사과? 아니, 그렇지 않습니다.

Michael이 요약 한 것처럼 “null은 특별합니다”.


답변

아니요, 클래스 나 클래스의 인스턴스가 아닙니다. 아무것도에 대한 언급입니다.

편집 : 사양을 읽지 않았으므로 위의 내용이 100 % 정확하지 않을 수 있습니다.