JRL menulis:
Tidak, tidak, ...
Seringkali, itu tergantung dari mana Anda melihatnya, siapa yang lebih Anda percayai.
Menurut JLS, ya, benar . Terutama jika Anda mengubah pertanyaan menjadi: "Apakah null
literal dari tipe Object
?". Selain JLS 4.1 yang dikutip oleh Michael Borgwardt di atas:
Lihat JLS 3.10.7 :
Literal null selalu bertipe null.
dan JLS 4.10 :
Subtipe dari tipe T adalah semua tipe U sehingga T adalah supertipe U, dan tipe nol.
atau JLS 4.10.2 :
Supertipe langsung dari tipe nol adalah semua tipe referensi selain tipe nol itu sendiri.
[Ditekankan oleh saya.]
Menurut kompiler Eclipse 2019-09, ini bukan :
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
Menurut OpenJDKs 12.0.1 javac
itu adalah :
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
Dimana tanda kurung siku menyiratkan bahwa null
selain dari tipe primitif. Dan menurut JLS 4.1 :
Ada dua jenis tipe dalam bahasa pemrograman Java: tipe primitif (...) dan tipe referensi (...).
jika bukan yang satu itu yang lainnya.
Claudiu menulis:
null itu jelek.
Au contraire, null
itu indah. Apa yang akan Anda sarankan sebagai nilai default untuk variabel jenis referensi? Kombinasi bit yang sewenang-wenang? Selamat datang untuk mengakses pelanggaran atau, lebih buruk lagi, penunjuk neraka!
Joachim Sauer menulis:
null adalah tipe dan nilai.
Sebenarnya ada tiga item dalam hubungannya dengan null (lihat juga JLS 3.10.7 ):
- Tipe null (jika tidak disebutkan) .
- The
null
literal .
- Nilai referensi nol . (Biasanya disingkat sebagai nilai nol atau hanya nol .)
(1) Perhatikan bahwa, menurut JLS 4.10.2 yang dikutip di atas, tipe null menggunakan banyak pewarisan tidak hanya untuk antarmuka tetapi juga untuk kelas. Yang kita semua tahu tidak mungkin bagi kita pemrogram aplikasi.
(2) Literal nol dapat dibayangkan sebagai variabel yang didefinisikan sebagai:
JVM_global final null_type null = new null_type();
Perhatikan juga JLS 3.9 :
Berbagai urutan karakter terkadang dianggap, salah, menjadi kata kunci:
null
bukan kata kunci, melainkan literal nol ( §3.10.7 ).
Tentang null instanceof <any type>
Dengan JLS 4.10.2 dalam pikiran (" tipe nol adalah subtipe dari setiap jenis") null instanceof <any type>
harus dievaluasi true
, bukan? Sepintas, ya, namun JLS 15.20.2 memberikan jawaban wawasan:
[...] hasil dari instanceof
operator yang adalah true
jika nilai dari RelationalExpression tidaknull
[...]. Jika tidak, hasilnya adalahfalse
.
[Ditekankan oleh saya.]
Tanyakan pada diri Anda apa yang lebih masuk akal (dari sudut pandang pemrogram aplikasi):
Memberi false
dan dengan demikian menunjukkan bahwa ekspresi referensi bukan dari jenis yang diekspos kepada kami, yaitu menunjukkan itu tidak merujuk sesuatu yang berguna bagi kami
atau memberi true
, sehingga memberi tahu kita bahwa ekspresi mengevaluasi ke referensi khusus, referensi null , merujuk "objek", kita tidak tahu apakah objek itu ada dan yang merupakan tipe null khusus yang tidak memiliki nama, tidak diekspos ke kami tetapi melalui literal nol , apakah subtipe dari semua jenis termasuk beberapa warisan dan harus diabaikan? Pertimbangkan juga contoh yang lebih praktis:
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.
Yang juga mengarah ke:
Mengapa instanceof
bukan cara yang tepat untuk mengatakan sesuatu tentang null
Object-ness?
Disebut instanceof
tidak sameorsubtypeof
. Itu berarti kita membandingkan tipe instance dengan satu tipe, bukan dua tipe. Sekarang null
berarti: "Tidak ada instance" dan jika tidak ada instance, tidak ada jenis instance. Jelas bahwa membandingkan tidak ada sesuatu pun yang seharusnya mengarah ke false
.
Atau dalam contoh dunia yang "lebih":
- Saya memiliki gambar apel berukuran nyata ( = tipe referensi ) di tangan saya dengan »Apel Besar« ( = nama tipe referensi ) tertulis di atasnya.
- Ada meja ( = tumpukan ) di depan saya.
- Jika ada apel ( = instance ) di atas meja, ada kabel ( = referensi ) yang terhubung dengannya.
- Saya memegang ujung lain dari kabel ini di tangan saya ( = variabel referensi ).
- Saya menelusuri apel di sepanjang kabelnya dan membandingkannya dengan gambar saya ( = instanceof ).
- Jika apel tersebut berukuran sama atau lebih besar dari gambar, maka tulisan »Big Apple« berlaku untuk itu ( = true ).
- Jika lebih kecil, maka bukan ( = false ).
- Jika tidak ada apel di atas meja (= tidak ada contoh ) dan, karenanya, tidak ada kabel ( = null ) tulisan juga tidak berlaku ( = false ). Karena: Apakah ada apple apel besar? Tidak.
Seperti yang disimpulkan Michael: "null is special".