ObjectJava에서 null 입니까?
Null( 실제로 는 특성 )이 null있습니다.
null instanceof Object거짓에 불과하다 typeof(null)돌아갑니다 'object'. 이 경우 개체입니까? 누가 알아.
ObjectJava에서 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
lengthjava.awt.geom.Point2D
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 참조 ).
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 .
또는 "더 많은"실제 사례에서 :
Michael이 요약 한 것처럼 "null은 특별합니다".
4.1 Java 언어 사양 의 유형 및 값 의 종류 장에서 설명했듯이 null은 하나의 값인 null 참조 (그리고 리터럴로 null표시됨) 를 갖는 유형입니다 .
이름이없는 표현식의 유형 인 특수 널 유형 도 있습니다
null. 널 유형에는 이름이 없기 때문에 널 유형의 변수를 선언하거나 널 유형으로 캐스트 할 수 없습니다. 널 참조는 널 유형 표현식의 유일한 가능한 값입니다. 널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다. 실제로 프로그래머는 널 유형을 무시하고null참조 유형이 될 수있는 특수 리터럴 인 척할 수 있습니다.
그래도 Null 개체 패턴 (권장하지 않음) 에 대해 읽고 싶을 수 있습니다 . 이 패턴에 대한 자세한 내용은 C2 Wiki 또는 Wikipedia 를 참조하십시오 .
아니, 그랬어도 방법이나 분야가 없기 때문에 쓸모가 없다.
아니요, null instanceof Object는 항상 false를 반환하므로 개체가 아닙니다. 또한 각 클래스에 대해 하나가 아닌 하나의 null 만 있습니다.
null instanceof <anytype>반환 false합니다.