Apa null
?
Apakah null
contoh sesuatu?
Apa set null
milik?
Bagaimana itu direpresentasikan dalam memori?
java
null
terminology
unj2
sumber
sumber
Jawaban:
Tidak, tidak ada tipe yang
null
merupakaninstanceof
.15.20.2 Jenis Operator Perbandingan
instanceof
Ini berarti bahwa untuk semua jenis
E
danR
, untuk apa punE o
, di manao == null
,o instanceof R
selalufalse
.JLS 4.1 Jenis-Jenis dan Nilai
Seperti yang dikatakan kutipan JLS di atas, dalam praktiknya Anda bisa berpura-pura bahwa itu "hanya literal khusus yang bisa dari jenis referensi apa pun".
Di Jawa,
null == null
(ini tidak selalu terjadi dalam bahasa lain). Perhatikan juga bahwa berdasarkan kontrak, properti ini juga memiliki (darijava.lang.Object
):Ini juga merupakan nilai default (untuk variabel yang memilikinya) untuk semua jenis referensi:
JLS 4.12.5 Nilai Awal Variabel
Bagaimana ini digunakan bervariasi. Anda dapat menggunakannya untuk mengaktifkan apa yang disebut inisialisasi malas bidang, di mana bidang akan memiliki nilai awal
null
sampai benar-benar digunakan, di mana itu diganti dengan nilai "nyata" (yang mungkin mahal untuk dihitung).Ada juga kegunaan lain. Mari kita ambil contoh nyata dari
java.lang.System
:Ini adalah pola penggunaan yang sangat umum:
null
digunakan untuk menunjukkan tidak adanya suatu objek.Berikut contoh penggunaan lain, kali ini dari
java.io.BufferedReader
:Jadi di sini,
readLine()
akan kembaliinstanceof String
untuk setiap baris, sampai akhirnya mengembalikannull
tanda akhir. Ini memungkinkan Anda memproses setiap baris sebagai berikut:Seseorang dapat merancang API sehingga kondisi penghentian tidak tergantung pada
readLine()
pengembaliannull
, tetapi orang dapat melihat bahwa desain ini memiliki manfaat membuat semuanya ringkas. Perhatikan bahwa tidak ada masalah dengan garis kosong, karena garis kosong"" != null
.Mari kita ambil contoh lain, kali ini dari
java.util.Map<K,V>
:Di sini kita mulai melihat bagaimana penggunaan
null
dapat mempersulit hal-hal. Pernyataan pertama mengatakan bahwa jika kunci tidak dipetakan,null
dikembalikan. Pernyataan kedua mengatakan bahwa bahkan jika kunci dipetakan,null
bisa juga dikembalikan.Sebaliknya,
java.util.Hashtable
menjaga hal-hal lebih sederhana dengan tidak mengizinkannull
kunci dan nilai; ituV get(Object key)
, jika kembalinull
, jelas berarti bahwa kunci tersebut tidak dipetakan.Anda dapat membaca seluruh API dan menemukan di mana dan bagaimana
null
digunakan. Ingatlah bahwa itu tidak selalu merupakan contoh praktik terbaik .Secara umum,
null
digunakan sebagai nilai khusus untuk menandakan:Di jawa Tidak ada yang menjadi perhatian Anda. Dan sebaiknya tetap seperti itu.
Apakah
null
itu hal yang baik?Ini sekarang batas subyektif. Beberapa orang mengatakan itu
null
menyebabkan banyak kesalahan programmer yang bisa dihindari. Ada yang mengatakan bahwa dalam bahasa yang menangkapNullPointerException
seperti Java, ada baiknya menggunakannya karena Anda akan gagal-cepat pada kesalahan programmer. Beberapa orang menghindarinull
dengan menggunakan pola objek Null , dll.Ini adalah topik besar sendiri, jadi sebaiknya didiskusikan sebagai jawaban untuk pertanyaan lain.
Saya akan mengakhiri ini dengan kutipan dari penemu
null
dirinya, CAR Hoare (dari quicksort fame):The video presentasi ini lebih dalam; itu adalah arloji yang direkomendasikan.
sumber
NIL
) pada tahun 1960, dan mungkin sebelumnya. Tapi saya tidak berpikir Hoare benar - benar mencoba mengklaim penemuan referensi nol dalam kutipan itu.Tidak. Itu sebabnya
null instanceof X
akan kembalifalse
untuk semua kelasX
. (Jangan tertipu oleh fakta bahwa Anda dapat menetapkannull
untuk variabel yang jenisnya adalah jenis objek. Sebenarnya, tugas tersebut melibatkan konversi jenis implisit; lihat di bawah.)Ini adalah satu-satunya anggota dari tipe null, di mana tipe null didefinisikan sebagai berikut:
"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 dilemparkan ke tipe null. referensi adalah satu-satunya nilai yang mungkin dari ekspresi tipe nol. Referensi nol selalu dapat dilemparkan ke jenis referensi apa pun. Dalam praktiknya, pemrogram dapat mengabaikan jenis nol dan hanya berpura-pura bahwa null hanyalah literal khusus yang dapat berupa tipe referensi. " JLS 4.1
Lihat di atas. Dalam beberapa konteks,
null
digunakan untuk menunjukkan "tidak ada objek" atau "tidak diketahui" atau "tidak tersedia", tetapi makna ini khusus untuk aplikasi.Itu spesifik implementasi, dan Anda tidak akan dapat melihat representasi
null
dalam program Java murni. (Tetapinull
direpresentasikan sebagai nol alamat mesin / penunjuk di sebagian besar jika tidak semua implementasi Java.)sumber
Apa itu null?
Ini bukan apa-apa.
Apakah null adalah contoh dari apa pun?
Tidak karena tidak ada apa-apa. Itu tidak bisa menjadi contoh dari hal apa pun.
Set apa yang dimiliki null?
Tidak ada set apa pun
Bagaimana itu direpresentasikan dalam memori?
Jika beberapa referensi menunjuk padanya seperti:
Dalam memori tumpukan beberapa ruang yang ditetapkan untuk objek yang baru dibuat. Dan o akan menunjuk ke ruang yang ditugaskan di memori.
Sekarang
o=null;
Ini berarti sekarang tidak akan menunjuk ke ruang memori objek.
sumber
Tidak itu bukan turunan dari apa pun, turunan dari akan selalu salah.
sumber
Kata kunci null adalah literal yang mewakili referensi nol, yang tidak merujuk ke objek apa pun . null adalah nilai default variabel tipe referensi.
Juga mungkin kita lihat
null: Daftar Istilah Java
sumber
Null bukan turunan dari kelas mana pun.
Namun, Anda dapat menetapkan null ke variabel jenis apa pun (objek atau array):
sumber
Null in Java (tm)
Dalam C dan C ++, "NULL" adalah konstanta yang didefinisikan dalam file header, dengan nilai seperti:
atau:
atau:
tergantung pada opsi penyusun dan model memori. NULL bukan bagian dari C / C ++ itu sendiri.
Di Java (tm), "null" bukan kata kunci, tetapi literal khusus dari tipe null. Ia dapat dilemparkan ke tipe referensi apa saja, tetapi tidak untuk tipe primitif seperti int atau boolean. Nol literal tidak harus memiliki nilai nol. Dan tidak mungkin untuk menggunakan tipe null atau mendeklarasikan variabel dari tipe ini.
sumber
Representasi bytecode
Java
null
memiliki dukungan JVM langsung: tiga instruksi digunakan untuk mengimplementasikannya:aconst_null
: misalnya untuk mengatur variabel menjadinull
seperti padaObject o = null;
ifnull
danifnonnull
: misalnya untuk membandingkan objek kenull
dalamif (o == null)
Bab 6 "Set Instruksi Mesin Virtual Java" kemudian menyebutkan efek dari
null
pada instruksi lain: ia melemparNullPointerException
banyak dari mereka.2.4. "Jenis dan Nilai Referensi" juga menyebutkan
null
dalam istilah umum:sumber
null
adalah nilai spesial, ini bukan turunan dari apa pun. Untuk alasan yang jelas itu tidak bisainstanceof
apa - apa.sumber
null
adalah nilai khusus yang bukan turunan dari kelas mana pun. Ini diilustrasikan oleh program berikut:sumber
null
bukan turunan dariString
.void f(String o)
, itu akan lebih masuk akal.null di Java seperti / mirip dengan nullptr di C ++.
Program dalam C ++:
Program yang sama di Jawa:
Sekarang apakah Anda mengerti dari kode di atas apa yang null di Jawa? Jika tidak maka saya sarankan Anda untuk belajar pointer di C / C ++ dan kemudian Anda akan mengerti.
Perhatikan bahwa dalam C, tidak seperti C ++, nullptr adalah undefined, tetapi NULL digunakan sebagai gantinya, yang juga dapat digunakan dalam C ++, tetapi dalam C ++ nullptr lebih disukai daripada hanya NULL, karena NULL dalam C selalu terkait dengan pointer dan itu itu, jadi di C ++ sufiks "ptr" ditambahkan ke akhir kata, dan juga semua huruf sekarang huruf kecil, tetapi ini kurang penting.
Di Jawa setiap variabel tipe kelas non-primitif selalu merujuk ke objek jenis itu atau diwariskan dan nol adalah referensi objek kelas nol, tetapi bukan null pointer, karena di Jawa tidak ada yang namanya "pointer", tetapi referensi ke kelas objek digunakan sebagai gantinya, dan null di Java terkait dengan referensi objek kelas, jadi Anda juga dapat menyebutnya sebagai "nullref" atau "nullrefobj", tetapi ini panjang, jadi sebut saja "null".
Dalam C ++ Anda dapat menggunakan pointer dan nilai nullptr untuk anggota opsional / variabel, yaitu anggota / variabel yang tidak memiliki nilai dan jika tidak memiliki nilai maka itu sama dengan nullptr, jadi bagaimana null di Jawa dapat digunakan misalnya.
sumber
Ada dua kategori utama tipe di Jawa: primitif dan referensi . Variabel dideklarasikan dari nilai toko tipe primitif; variabel yang dideklarasikan dari referensi tipe toko referensi.
Dalam hal ini, pernyataan inisialisasi mendeklarasikan variabel "x". "X" menyimpan referensi String. Itu nol di sini. Pertama-tama, null bukan instance objek yang valid, jadi tidak ada memori yang dialokasikan untuk itu. Ini hanyalah nilai yang menunjukkan bahwa referensi objek saat ini tidak merujuk ke suatu objek.
sumber
Cara yang menarik untuk melihat null di java menurut saya adalah melihatnya sebagai sesuatu yang TIDAK menunjukkan tidak adanya informasi tetapi hanya sebagai nilai literal yang dapat ditugaskan untuk referensi jenis apa pun. Jika Anda memikirkannya jika ini menunjukkan tidak adanya informasi maka untuk a1 == a2 menjadi benar tidak masuk akal (jika mereka berdua diberi nilai nol) karena mereka benar-benar dapat menunjuk ke objek APA PUN (kita cukup tidak tahu objek apa yang seharusnya mereka tunjukkan) ... Ngomong-ngomong null == null mengembalikan true di java. Jika java misalnya akan seperti SQL: 1999 maka null == null akan mengembalikan tidak dikenal (nilai boolean dalam SQL: 1999 dapat mengambil tiga nilai: benar, salah dan tidak dikenal tetapi dalam prakteknya tidak diketahui diimplementasikan sebagai nol dalam sistem nyata) ... http://en.wikipedia.org/wiki/SQL
sumber
Jawaban singkat dan tepat yang menjawab semua pertanyaan Anda secara resmi dari JLS:
Hanya referensi tipe yang ditugaskan ke null yang dialokasikan. Anda tidak memberikan nilai (objek) apa pun ke referensi. Alokasi tersebut khusus untuk JVM berapa banyak referensi yang akan diambil dan di mana area memori itu akan dialokasikan.
sumber