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 ). Тому що: чи не одне яблуко є великим яблуком? Ні це не так.
Як підсумовує Майкл: справді "нуль особлива".