Tidak, tidak, dan bagi mereka yang bertanya-tanya mengapa pertanyaan seperti itu, ada bahasa di mana null memang objek seperti apa pun, misalnya Ruby.
JRL
7
Dalam Scala, yang sangat teliti tentang tipe, ada tipe Null( sifat , sebenarnya) yang memiliki satu contoh null.
Carl Smotricz
1
@ JRL: Hanya ingin tahu, saya bertanya-tanya bagaimana hal itu memengaruhi cara kerja JRuby ... (Saya tidak cukup paham dengan tingkat penerapan itu untuk mengetahui dengan pasti.)
Benjamin Oakes
Untuk menambah komentar @ JRL - setara dengan Ruby nulladalah nil, yang merupakan turunan dari NilClass
Eliot Sykes
Atau javascript, yang null instanceof Objectsalah tapi typeof(null)mengembalikan 'object'. Apakah itu objek dalam kasus itu? Siapa tahu.
Don Hatch
Jawaban:
166
Jika null adalah sebuah Object, itu akan mendukung metode java.lang.Objectseperti equals(). Namun, ini tidak terjadi - setiap pemanggilan metode pada hasil null di a NullPointerException.
Ada juga tipe null khusus, tipe ekspresi null, yang tidak memiliki nama. Karena tipe null tidak memiliki nama, tidak mungkin untuk mendeklarasikan variabel dari tipe null atau mentransmisikan ke tipe null. Referensi null adalah satu-satunya nilai yang mungkin dari ekspresi tipe null. Referensi null selalu dapat ditransmisikan ke semua jenis referensi. Dalam praktiknya, programmer dapat mengabaikan tipe null
dan hanya berpura-pura bahwa null hanyalah literal khusus yang dapat berupa tipe referensi apa pun.
Saya pikir ini bisa diringkas menjadi "null is special".
Jadi sebuah objek di Java hanya sebuah objek jika sama dengan atau subclass java.lang.Object. Praktis - ya. Anda tidak dapat membuat kelas yang bukan subkelas java.lang.Object, tetapi saya tidak pernah memikirkannya dari sudut pandang yang lebih filosofis
Andreas Dolk
Anehnya, dari semua hal, dokumen API untukNullPointerException menyebutkan » nullobjek«… :) Tapi kemudian, tidak apa-apa untuk membicarakan »null pointer«…
Lumi
Anda berkata: "Referensi null selalu dapat dikirim ke semua jenis referensi". Jadi, dapatkah kita mengembalikan null (typecasted-if allow) dalam metode dengan tipe referensi objek (return)?
Srichakradhar
1
@Srichakradhar: ya, kami bisa! Yang dapat Anda temukan lebih mudah dengan mencobanya dalam kode daripada dengan bertanya di sini.
Michael Borgwardt
1
"Referensi null adalah satu-satunya nilai yang mungkin dari ekspresi tipe null". Saatnya untuk membaca dokumen Spesifikasi. :)
sofs1
32
Menurut spesifikasi Java , nulladalah tipe yang dapat ditugaskan ke variabel objek (sebagai nilai seperti yang dicatat dalam komentar). Anda tidak dapat membuat instance atau membuat variabel jenis ini, Anda harus menggunakan literal yang nulldisediakan oleh kompilator.
3) objek dalam " variabel objek ", dibandingkan dengan variabel kelas, biasanya tidak mengacu pada jenisnya tetapi pada masa pakai. Ketika mengacu pada tipe itu biasanya disebut variabel dari tipe referensi atau, singkatnya, variabel referensi (tipe). Saya mengetahui 4 jenis di Java API yang mengekspos variabel instance / objek (mungkin ada lebih banyak): array denganlength subkelasnya dan java.awt.geom.Point2D.
Gerold Broser
28
Sama sekali tidak: null instanceof Objectmengembalikan salah.
Tapi tipe null dapat diberikan ke setiap tipe referensi.
Tom Hawtin - tackline
Tidak ada "tipe nol"; null adalah nilai spesifik dari ekspresi non-primitif (yaitu referensi; tidak ada "tipe referensi" di Jawa, menurut pemahaman saya).
Tommy McGuire
3
Tommy: JLS 4.1: "Ada juga tipe null khusus, tipe ekspresi null, yang tidak memiliki nama."
Seringkali, itu tergantung dari mana Anda melihatnya, siapa yang lebih Anda percayai.
Menurut JLS, ya, benar . Terutama jika Anda mengubah pertanyaan menjadi: "Apakah nullliteral dari tipe Object?". Selain JLS 4.1 yang dikutip oleh Michael Borgwardt di atas:
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 booleannull.toString();// Cannot invoke toString() on the primitive type null
Menurut OpenJDKs 12.0.1 javacitu adalah :
true.toString();// error: boolean cannot be dereferencednull.toString();// error: <null> cannot be dereferenced
Dimana tanda kurung siku menyiratkan bahwa nullselain 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, nullitu 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 nullliteral .
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();
Berbagai urutan karakter terkadang dianggap, salah, menjadi kata kunci:
nullbukan 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 instanceofoperator yang adalah truejika 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 falsedan 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:
classCarimplementsVehicle{...Vehicle car =null;...boolean b = car instanceofCar;// True? There's not even an instance...// which could be of type Car.
Yang juga mengarah ke:
Mengapa instanceofbukan cara yang tepat untuk mengatakan sesuatu tentang nullObject-ness?
Disebut instanceoftidak sameorsubtypeof. Itu berarti kita membandingkan tipe instance dengan satu tipe, bukan dua tipe. Sekarang nullberarti: "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".
Seperti yang dijelaskan di bab 4.1 Macam Jenis dan Nilai Spesifikasi Bahasa Java, null adalah jenis yang memiliki satu nilai, referensi null (dan diwakili oleh literal null):
Ada juga tipe null khusus , tipe ekspresi null, yang tidak memiliki nama. Karena tipe null tidak memiliki nama, tidak mungkin untuk mendeklarasikan variabel dari tipe null atau mentransmisikan ke tipe null. Referensi null adalah satu-satunya nilai yang mungkin dari ekspresi tipe null. Referensi null selalu dapat ditransmisikan ke semua jenis referensi. Dalam praktiknya, programmer dapat mengabaikan tipe null dan hanya berpura-pura bahwa nullitu hanyalah literal khusus yang dapat berupa tipe referensi apa pun.
Anda mungkin ingin membaca tentang Pola Objek Null (yang tidak saya rekomendasikan). Lihat C2 Wiki atau Wikipedia untuk lebih lanjut tentang pola ini.
Ada juga literal null khusus yang dapat digunakan sebagai nilai untuk jenis referensi apa pun. null dapat diberikan ke variabel apapun, kecuali variabel tipe primitif. Tidak banyak yang dapat Anda lakukan dengan nilai nol selain menguji keberadaannya. Oleh karena itu, null sering digunakan dalam program sebagai penanda untuk menunjukkan bahwa beberapa objek tidak tersedia.
Java menangani objek melalui referensi. Null adalah gangguan OO-an Java, karena menurunkan Anda di bawah level OO. Tidak, itu bukan objek, itu adalah NILAI referensi. Dan itu tidak ada hubungannya dengan paradigma objek, tetapi berhubungan dengan pipa Jawa, yang memungkinkan objek.
Baris pertama menunjukkan nulldapat ditetapkan untuk diketik Object, tetapi baris kedua akan menunjukkan itu tentu saja bukan Objectdan akhirnya menghasilkanjava.lang.NullPointerException
Null
( sifat , sebenarnya) yang memiliki satu contohnull
.null
adalahnil
, yang merupakan turunan dari NilClassnull instanceof Object
salah tapitypeof(null)
mengembalikan'object'
. Apakah itu objek dalam kasus itu? Siapa tahu.Jawaban:
Jika null adalah sebuah Object, itu akan mendukung metode
java.lang.Object
sepertiequals()
. Namun, ini tidak terjadi - setiap pemanggilan metode pada hasil null di aNullPointerException
.Dan inilah yang dikatakan Spesifikasi Bahasa Java tentang topik ini:
Saya pikir ini bisa diringkas menjadi "null is special".
sumber
java.lang.Object
. Praktis - ya. Anda tidak dapat membuat kelas yang bukan subkelas java.lang.Object, tetapi saya tidak pernah memikirkannya dari sudut pandang yang lebih filosofisNullPointerException
menyebutkan »null
objek«… :) Tapi kemudian, tidak apa-apa untuk membicarakan »null pointer«…Menurut spesifikasi Java ,
null
adalah tipe yang dapat ditugaskan ke variabel objek (sebagai nilai seperti yang dicatat dalam komentar). Anda tidak dapat membuat instance atau membuat variabel jenis ini, Anda harus menggunakan literal yangnull
disediakan oleh kompilator.sumber
null
Nama adalah "contoh" darinull
jenis, rupanya.null
bukan variabel, ini literal: JLS, 3.10.7. The Null Literalnull
adalah tipe yang dapat diberikan ": 1)null
(dalam kode) adalah literal nol , bukan tipe nol 2) Tipe tidak dapat ditugaskan ke variabel di Jawa secara umum, lihat JLS 4.1: " Ada [... ] dua jenis nilai data yang dapat disimpan dalam variabel [...]: nilai primitif (§4.2) dan nilai referensi (§4.3). " Ini adalah referensi null yang dapat ditetapkan melaluinull
literal. ... lanjutan ...length
subkelasnya danjava.awt.geom.Point2D
.Sama sekali tidak:
null instanceof Object
mengembalikan salah.sumber
Tidak, itu bukan sebuah objek.
sumber
Null adalah ketiadaan suatu objek.
sumber
JRL menulis:
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 tipeObject
?". Selain JLS 4.1 yang dikutip oleh Michael Borgwardt di atas:Lihat JLS 3.10.7 :
dan JLS 4.10 :
atau JLS 4.10.2 :
[Ditekankan oleh saya.]
Menurut kompiler Eclipse 2019-09, ini bukan :
Menurut OpenJDKs 12.0.1
javac
itu adalah :Dimana tanda kurung siku menyiratkan bahwa
null
selain dari tipe primitif. Dan menurut JLS 4.1 :jika bukan yang satu itu yang lainnya.
Claudiu menulis:
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:
Sebenarnya ada tiga item dalam hubungannya dengan null (lihat juga JLS 3.10.7 ):
null
literal .(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 :
Tentang
null instanceof <any type>
Dengan JLS 4.10.2 dalam pikiran (" tipe nol adalah subtipe dari setiap jenis")
null instanceof <any type>
harus dievaluasitrue
, bukan? Sepintas, ya, namun JLS 15.20.2 memberikan jawaban wawasan:[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 kamiatau 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:Yang juga mengarah ke:
Mengapa
instanceof
bukan cara yang tepat untuk mengatakan sesuatu tentangnull
Object-ness?Disebut
instanceof
tidaksameorsubtypeof
. Itu berarti kita membandingkan tipe instance dengan satu tipe, bukan dua tipe. Sekarangnull
berarti: "Tidak ada instance" dan jika tidak ada instance, tidak ada jenis instance. Jelas bahwa membandingkan tidak ada sesuatu pun yang seharusnya mengarah kefalse
.Atau dalam contoh dunia yang "lebih":
Seperti yang disimpulkan Michael: "null is special".
sumber
Tidak, ini bukan instance dari Kelas atau Kelas. Itu tidak mengacu pada apa-apa.
Sunting : belum membaca spesifikasi jadi di atas mungkin tidak 100% akurat.
sumber
Seperti yang dijelaskan di bab 4.1 Macam Jenis dan Nilai Spesifikasi Bahasa Java, null adalah jenis yang memiliki satu nilai, referensi null (dan diwakili oleh literal
null
):Anda mungkin ingin membaca tentang Pola Objek Null (yang tidak saya rekomendasikan). Lihat C2 Wiki atau Wikipedia untuk lebih lanjut tentang pola ini.
sumber
Tidak. Bahkan jika itu dulu, itu tidak berguna karena tidak memiliki metode atau bidang apapun.
sumber
Tidak, bukan merupakan objek karena instance null Objek akan selalu mengembalikan false juga hanya ada satu null, bukan satu untuk setiap kelas.
sumber
null instanceof <anytype>
akan kembalifalse
juga.Menurut Spesifikasi Java ,
sumber
Java menangani objek melalui referensi. Null adalah gangguan OO-an Java, karena menurunkan Anda di bawah level OO. Tidak, itu bukan objek, itu adalah NILAI referensi. Dan itu tidak ada hubungannya dengan paradigma objek, tetapi berhubungan dengan pipa Jawa, yang memungkinkan objek.
sumber
Apakah null merupakan turunan dari
java.lang.Object
? Tidak.Apakah null sebuah objek ? tergantung pada definisi " adalah ".
sumber
Baris pertama menunjukkan
null
dapat ditetapkan untuk diketikObject
, tetapi baris kedua akan menunjukkan itu tentu saja bukanObject
dan akhirnya menghasilkanjava.lang.NullPointerException
sumber
Tidak,
null
bukan objek. Ini adalah tipe referensi dan nilainya tidak merujuk ke objek apa pun sehingga tidak ada representasinull
dalam memori.sumber
Object
, bukan objek (seperti dalam contoh tipe ). Dan jika seseorang mengubah pertanyaannya sesuai ...