Object
Java에서 null 입니까?
답변
널 (null)이 객체 인 경우에, 그것은의 방법을 지원하는 것 java.lang.Object
등을 equals()
. 그러나 이것은 사실이 아닙니다. null에 대한 모든 메서드 호출은NullPointerException
. .
이 주제에 대한 Java 언어 사양 은 다음과 같이 말합니다.
또한 이름이없는 특수 널 유형 인 널 표현식 유형도 있습니다. 널 유형에는 이름이 없기 때문에 널 유형의 변수를 선언하거나 널 유형으로 캐스트 할 수 없습니다. 널 참조는 널 유형 표현식의 유일한 가능한 값입니다. 널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다. 실제로 프로그래머는 null 형식을 무시하고
null이 참조 형식이 될 수있는 특수 리터럴 인 척만 할 수 있습니다.
나는 이것이 “null은 특별하다”로 요약 될 수 있다고 생각한다.
답변
자바에 따르면 사양 , null
(주석에 명시된 값으로) 객체 변수에 할당 될 수있는 타입이다. 이 유형의 변수를 인스턴스화하거나 만들 수는 없지만 null
컴파일러에서 제공 하는 리터럴을 사용해야합니다 .
답변
절대 아닙니다 : null instanceof Object
false를 반환합니다.
답변
아니요, 개체가 아닙니다.
답변
Null은 개체가 없습니다.
답변
JRL은 다음과 같이 썼습니다.
아니, 아니야 …
자주, 그것은 당신이 그것을 보는 곳, 당신이 더 믿는 사람에 달려 있습니다.
JLS에 따르면 예, . 특히 질문을 “Is the null
literal 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 참조 ).
- (그렇지 않으면 이름이 지정되지 않은) null 유형 입니다.
null
문자 .- 널 레퍼런스 값. (일반적으로 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
‘객체 성’ 아닌가?
instanceof
not 이라고 sameorsubtypeof
합니다. 즉, 인스턴스의 유형을 두 유형이 아닌 유형과 비교하고 있음을 의미합니다. 이제는 null
“인스턴스가 없습니다”를 의미하며 인스턴스가 없으면 인스턴스 유형이 없습니다. 아무것도 비교하지 않으면false
.
또는 “더 많은”실제 사례에서 :
- »Big Apple«( = 참조 유형 이름 ) 을 사용하여 실제 크기의 사과 사진 ( = 참조 유형 )을 손에 들고 있습니다. )이 적힌 을 가지고 있습니다.
- 테이블이 있습니다 ( = heap내 앞에 )이 있습니다.
- 테이블에 사과 ( = instance )가 있으면 코드 ( = reference 연결된 )가 있습니다.
- 이 코드의 다른 쪽 끝을 손에 쥐고 있습니다 ( = reference 변수 ).
- 코드를 따라 사과를 따라 내 그림 ( = instanceof ) 과 비교합니다 .
- 사과의 크기가 그림과 같거나 큰 경우»Big Apple«이라는 글씨가 적용됩니다 ( = true ).
- 더 작 으면 그렇지 않습니다 ( = false ).
- 테이블에 사과가없고 (= 인스턴스 없음) 코드가 없으면 ( = null ) 쓰기도 적용되지 않습니다 ( = false ). 때문에 : 없습니까 더 사과는 큰 사과? 아니, 그렇지 않습니다.
Michael이 요약 한 것처럼 “null은 특별합니다”.
답변
아니요, 클래스 나 클래스의 인스턴스가 아닙니다. 아무것도에 대한 언급입니다.
편집 : 사양을 읽지 않았으므로 위의 내용이 100 % 정확하지 않을 수 있습니다.