JRL написав:
Ні це не так, ...
Як часто, це залежить від того, де ти на це дивишся, кому більше віриш.
Згідно JLS, так, так . Особливо, якщо ви перефразовуєте запитання на тему: "Чи null
буквальний тип Object
?" Крім JLS 4.1 цитованого Майклом Боргвардом вище:
Див. JLS 3.10.7 :
Нульовий літерал завжди має нульовий тип.
та JLS 4.10 :
Підтипами типу T є всі типи U такі, що T є супертипом U та нульовим типом.
або JLS 4.10.2 :
Прямі супертипи нульового типу - це всі типи посилань, крім самого нульового типу.
[Наголоси від мене.]
За компілятором Eclipse 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 є два типи: примітивні типи (...) та типи посилань (...).
якщо це не той, то інший.
Клавді написав:
null - це щось некрасиво.
Au contraire, null
прекрасна. Що б ви запропонували замість змінної типу посилання за замовчуванням? Довільна бітова комбінація? Ласкаво просимо, щоб отримати доступ до порушення або, що ще гірше, пекло покажчика!
Йоахім Зауер написав:
null - це тип і значення.
У поєднанні з null є три елементи (див. Також JLS 3.10.7 ):
- Нульовий тип (інакше безіменний) .
null
Буквальним .
- Посилання нульове значення. (Зазвичай скорочується як null value або просто null .)
(1) Зауважимо, що згідно з цитованим вище JLS 4.10.2 , тип null використовує багатократне успадкування не тільки для інтерфейсів, але і для класів. Що ми всі знаємо, це неможливо для нас програмістів прикладних програм.
(2) Нульовий літерал можна уявити як змінну, що визначається як:
JVM_global final null_type null = new null_type();
Зверніть увагу також на JLS 3.9 :
Різні послідовності символів іноді невірно вважаються ключовими словами:
null
це не ключове слово, а скоріше нульовий літерал ( §3.10.7 ).
Стосовно null instanceof <any type>
Маючи на увазі JLS 4.10.2 (« нульовий тип - це підтип кожного типу»), null instanceof <any type>
слід вважати true
, чи не так? На перший погляд, так, але JLS 15.20.2 дає зрозумілу відповідь:
[...] результат від instanceof
оператора є , true
якщо значення в ВираженіяОтношеніі НЕnull
[...]. Інакше результат єfalse
.
[Наголоси від мене.]
Запитайте себе, що має більше сенсу (з точки зору програміста програми):
Надання false
та тим самим вказівка на те, що опорний вираз не такого типу, який нам піддається, тобто вказує, що він не посилається на щось корисне
або даючи true
, таким чином, повідомляючи нас, що вираз оцінює спеціальне посилання, нульове посилання , посилаючись на "об'єкт", ми не знаємо, чи він існує і який має спеціальний нульовий тип, який не має імені, не піддається Ми, але через нульовий буквальний , є підтипом будь-якого типу, включаючи множинне успадкування, і все-таки його слід ігнорувати? Розглянемо також більш практичний приклад:
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
не sameorsubtypeof
. Це означає, що ми порівнюємо тип екземпляра з типом, а не два типи. Тепер null
означає: „Не існує примірника”, а якщо немає примірника, немає типу примірника. Очевидно, що порівнювати нічого з чим-небудь не повинноfalse
.
Або в "більш" прикладі реального світу:
- У мене в руках малюнок яблука в реальному розмірі ( = еталонний тип ) з "Великим яблуком" ( = назва базового типу) ) , написаним на ній.
- Там таблиця ( = купаПереді мною ).
- Якщо на столі є яблуко ( = екземпляр ), є шнур ( = посилання) ).
- Я тримаю інший кінець цього шнура в руці ( = контрольна змінна ).
- Я простежу яблуко уздовж шнура і порівнюю його зі своїм малюнком ( = instanceof ).
- Якщо яблуко такого ж розміру або більше, ніж на малюнку, до нього застосовується написання «Велике яблуко» ( = вірно ).
- Якщо вона менша, то не ( = false ).
- Якщо на столі немає яблука (= немає примірника ), а значить, немає шнура ( = null ), запис не застосовується (або false ). Тому що: чи не одне яблуко є великим яблуком? Ні це не так.
Як підсумовує Майкл: справді "нуль особлива".