Apa null
?
Apakah null
contoh sesuatu?
Apa set null
milik?
Bagaimana itu direpresentasikan dalam memori?
Apa null
?
Apakah null
contoh sesuatu?
Apa set null
milik?
Bagaimana itu direpresentasikan dalam memori?
Jawaban:
Apakah null adalah contoh dari apa pun?
Tidak, tidak ada tipe yang null
merupakan instanceof
.
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
Pada saat run time, hasil dari
instanceof
operator adalahtrue
jika nilai RelationalExpression tidaknull
dan referensi dapat dilemparkan ke ReferenceType tanpa menaikkan aClassCastException
. Kalau tidak hasilnya adalahfalse
.
Ini berarti bahwa untuk semua jenis E
dan R
, untuk apa pun E o
, di mana o == null
, o instanceof R
selalu false
.
Set apa yang dimiliki '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 untuk melemparkan ke tipe null . Thenull
referensi adalah satu-satunya nilai yang mungkin dari sebuah ekspresi dari nol jenis. Thenull
referensi selalu bisa dilemparkan untuk semua jenis referensi. Dalam praktiknya, programmer dapat mengabaikan tipe nol dan hanya berpura-pura bahwanull
itu hanyalah sebuah literal khusus yang dapat dari jenis referensi apa pun.
Apa itu null?
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 (dari java.lang.Object
):
public boolean equals(Object obj)
Untuk
null
nilai non- referensix
,x.equals(null)
harusreturn false
.
Ini juga merupakan nilai default (untuk variabel yang memilikinya) untuk semua jenis referensi:
- Setiap variabel kelas, variabel instan, atau komponen array diinisialisasi dengan nilai default saat dibuat:
- Untuk semua jenis referensi, nilai standarnya adalah
null
.
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
:
public static Console console()
Pengembalian : Konsol sistem, jika ada, jika tidak
null
.
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
:
public String readLine() throws IOException
Pengembalian : A
String
berisi konten baris, tidak termasuk karakter pemutusan baris, ataunull
jika akhir aliran telah tercapai.
Jadi di sini, readLine()
akan kembali instanceof String
untuk setiap baris, sampai akhirnya mengembalikan null
tanda akhir. Ini memungkinkan Anda memproses setiap baris sebagai berikut:
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
Seseorang dapat merancang API sehingga kondisi penghentian tidak tergantung pada readLine()
pengembalian null
, 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>
:
V get(Object key)
Mengembalikan nilai yang dipetakan kunci yang ditentukan, atau
null
jika peta ini tidak mengandung pemetaan untuk kunci tersebut.Jika peta ini mengizinkan
null
nilai, maka nilai balik darinull
tidak selalu menunjukkan bahwa peta tidak mengandung pemetaan untuk kunci; mungkin juga peta secara eksplisit memetakan kunci untuknull
. ThecontainsKey
operasi dapat digunakan untuk membedakan dua kasus ini.
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 mengizinkan null
kunci dan nilai; itu V get(Object key)
, jika kembali null
, 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:
Bagaimana itu direpresentasikan dalam memori?
Di jawa Tidak ada yang menjadi perhatian Anda. Dan sebaiknya tetap seperti itu.
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 menangkap NullPointerException
seperti Java, ada baiknya menggunakannya karena Anda akan gagal-cepat pada kesalahan programmer. Beberapa orang menghindari null
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):
Saya menyebutnya kesalahan miliaran dolar saya. Itu adalah penemuan
null
referensi pada tahun 1965. Pada waktu itu, saya sedang merancang sistem tipe komprehensif pertama untuk referensi dalam bahasa berorientasi objek (ALGOL W). Tujuan saya adalah untuk memastikan bahwa semua penggunaan referensi harus benar-benar aman, dengan pengecekan dilakukan secara otomatis oleh kompiler. Tetapi saya tidak bisa menahan godaan untuk menaruhnull
referensi, hanya karena itu sangat mudah diimplementasikan. Ini telah menyebabkan kesalahan yang tak terhitung banyaknya, kerentanan, dan crash sistem, yang mungkin telah menyebabkan satu miliar dolar rasa sakit dan kerusakan dalam empat puluh tahun terakhir.
The video presentasi ini lebih dalam; itu adalah arloji yang direkomendasikan.
NIL
) pada tahun 1960, dan mungkin sebelumnya. Tapi saya tidak berpikir Hoare benar - benar mencoba mengklaim penemuan referensi nol dalam kutipan itu.
Apakah null adalah contoh dari apa pun?
Tidak. Itu sebabnya null instanceof X
akan kembali false
untuk semua kelas X
. (Jangan tertipu oleh fakta bahwa Anda dapat menetapkan null
untuk variabel yang jenisnya adalah jenis objek. Sebenarnya, tugas tersebut melibatkan konversi jenis implisit; lihat di bawah.)
Set apa yang dimiliki 'null'?
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
Apa itu null?
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.
Bagaimana itu direpresentasikan dalam memori?
Itu spesifik implementasi, dan Anda tidak akan dapat melihat representasi null
dalam program Java murni. (Tetapi null
direpresentasikan sebagai nol alamat mesin / penunjuk di sebagian besar jika tidak semua implementasi Java.)
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:
Object o=new Object();
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.
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 in Java (tm)
Dalam C dan C ++, "NULL" adalah konstanta yang didefinisikan dalam file header, dengan nilai seperti:
0
atau:
0L
atau:
((void*)0)
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.
Representasi bytecode
Java null
memiliki dukungan JVM langsung: tiga instruksi digunakan untuk mengimplementasikannya:
aconst_null
: misalnya untuk mengatur variabel menjadi null
seperti padaObject o = null;
ifnull
dan ifnonnull
: misalnya untuk membandingkan objek ke null
dalamif (o == null)
Bab 6 "Set Instruksi Mesin Virtual Java" kemudian menyebutkan efek dari null
pada instruksi lain: ia melempar NullPointerException
banyak dari mereka.
2.4. "Jenis dan Nilai Referensi" juga menyebutkan null
dalam istilah umum:
Nilai referensi juga dapat berupa referensi nol khusus, referensi ke tanpa objek, yang akan dilambangkan dengan nol. Referensi nol pada awalnya tidak memiliki tipe run-time, tetapi dapat dilemparkan ke tipe apa pun. Nilai default dari tipe referensi adalah nol.
null
adalah nilai spesial, ini bukan turunan dari apa pun. Untuk alasan yang jelas itu tidak bisa instanceof
apa - apa.
null
adalah nilai khusus yang bukan turunan dari kelas mana pun. Ini diilustrasikan oleh program berikut:
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
null
bukan turunan dari String
.
void f(String o)
, itu akan lebih masuk akal.
null di Java seperti / mirip dengan nullptr di C ++.
Program dalam C ++:
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
Program yang sama di Jawa:
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}
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.
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.
String x = null;
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.
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
Jawaban singkat dan tepat yang menjawab semua pertanyaan Anda secara resmi dari JLS:
3.10.7. The Null Literal
Tipe nol memiliki satu nilai, referensi nol, diwakili oleh null literal nol, yang dibentuk dari karakter ASCII.
Null literal selalu dari tipe null.
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.