Object
Java에서 null 입니까?
Null
( 실제로 는 특성 )이 null
있습니다.
null instanceof Object
거짓에 불과하다 typeof(null)
돌아갑니다 'object'
. 이 경우 개체입니까? 누가 알아.
Object
Java에서 null 입니까?
Null
( 실제로 는 특성 )이 null
있습니다.
null instanceof Object
거짓에 불과하다 typeof(null)
돌아갑니다 'object'
. 이 경우 개체입니까? 누가 알아.
답변:
널 (null)이 객체 인 경우에, 그것은의 방법을 지원하는 것 java.lang.Object
등을 equals()
. 그러나 이것은 사실이 아닙니다. null에 대한 모든 메서드 호출은NullPointerException
. .
이 주제에 대한 Java 언어 사양 은 다음과 같이 말합니다.
또한 이름이없는 특수 널 유형 인 널 표현식 유형도 있습니다. 널 유형에는 이름이 없기 때문에 널 유형의 변수를 선언하거나 널 유형으로 캐스트 할 수 없습니다. 널 참조는 널 유형 표현식의 유일한 가능한 값입니다. 널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다. 실제로 프로그래머는 null 형식을 무시하고 null이 참조 형식이 될 수있는 특수 리터럴 인 척만 할 수 있습니다.
나는 이것이 "null은 특별하다"로 요약 될 수 있다고 생각한다.
java.lang.Object
입니다. 실질적으로-예. 당신은 java.lang.Object 상위의 서브 클래스가 아닌 클래스를 만들 수는 없지만, 내가보기의 철학적 관점에서 그것에 대해 생각하지 않았다
NullPointerException
는» null
객체«… :) 그러나»null 포인터«에 대해 언급하는 것도 괜찮습니다.…
자바에 따르면 사양 , null
(주석에 명시된 값으로) 객체 변수에 할당 될 수있는 타입이다. 이 유형의 변수를 인스턴스화하거나 만들 수는 없지만 null
컴파일러에서 제공 하는 리터럴을 사용해야합니다 .
null
이름의 "인스턴스"입니다 null
분명히 유형입니다.
null
변수가 아니라 리터럴입니다 : JLS, 3.10.7. The Null Literal
null
는 할당 할 수있는 유형입니다 ": 1) null
(코드에서) null 유형이 아닌 null 리터럴 2) 유형은 일반적으로 Java에서 변수에 할당 할 수 없습니다 . JLS 4.1을 참조하십시오 . " There are [... ] 변수에 저장 될 수있는 데이터의 2 종류의 값 [...]. 프리미티브 값 (§4.2) 및 기준값 (§4.3) " 그건 널 레퍼런스 비아 할당 될 수 리터럴. ... 계속 ...null
length
java.awt.geom.Point2D
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
문자 .(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
.
또는 "더 많은"실제 사례에서 :
Michael이 요약 한 것처럼 "null은 특별합니다".
4.1 Java 언어 사양 의 유형 및 값 의 종류 장에서 설명했듯이 null은 하나의 값인 null 참조 (그리고 리터럴로 null
표시됨) 를 갖는 유형입니다 .
이름이없는 표현식의 유형 인 특수 널 유형 도 있습니다
null
. 널 유형에는 이름이 없기 때문에 널 유형의 변수를 선언하거나 널 유형으로 캐스트 할 수 없습니다. 널 참조는 널 유형 표현식의 유일한 가능한 값입니다. 널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다. 실제로 프로그래머는 널 유형을 무시하고null
참조 유형이 될 수있는 특수 리터럴 인 척할 수 있습니다.
그래도 Null 개체 패턴 (권장하지 않음) 에 대해 읽고 싶을 수 있습니다 . 이 패턴에 대한 자세한 내용은 C2 Wiki 또는 Wikipedia 를 참조하십시오 .
아니, 그랬어도 방법이나 분야가 없기 때문에 쓸모가 없다.
아니요, null instanceof Object는 항상 false를 반환하므로 개체가 아닙니다. 또한 각 클래스에 대해 하나가 아닌 하나의 null 만 있습니다.
null instanceof <anytype>
반환 false
합니다.