static
anggota ( static
bidang atau static
metode) di Java dikaitkan dengan kelasnya masing-masing daripada objek kelas ini. Kode berikut mencoba mengakses bidang statis pada null
referensi.
public class Main
{
private static final int value = 10;
public Main getNull()
{
return null;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("value = "+main.getNull().value);
}
}
Meskipun main.getNull()
kembali null
, itu berfungsi dan ditampilkan value = 10
. Bagaimana kode ini bekerja?
Main main = null; main.getNull().value
.new Thread[]{}[-1].sleep(10);
mana sleep () adalah metode statis. Ini dulu berhasil pada beberapa versi Java yang lebih lama.Jawaban:
Perilaku itu ditentukan dalam Spesifikasi Bahasa Java :
Dalam rincian lebih lanjut, sebuah evaluasi lapangan statis , seperti
Primary.staticField
karya-karya sebagai berikut (penekanan) - dalam kasus Anda,Primary = main.getNull()
:sumber
Karena, seperti yang Anda katakan, bidang statis tidak terkait dengan sebuah instance.
Kemampuan untuk mengakses bidang statis dari referensi instance (seperti yang Anda lakukan) hanyalah gula sintaksis dan tidak memiliki arti tambahan.
Kode Anda dikompilasi ke
sumber
Kapan pun Anda mengakses variabel statis atau metode dengan objek pada waktu kompilasi, itu diubah menjadi nama Kelas. misalnya:
Ini akan mencetak nilai nilai variabel statis karena pada waktu kompilasi Ini akan diubah menjadi
Bukti:
unduh decompiler dan Dekompilasi file .class Anda ke file .java dan Anda dapat melihat semua metode statis atau variabel yang dirujuk nama objek secara otomatis diganti dengan nama kelas.
sumber
Mengakses
static
anggota dengan nama kelas adalah legal, tetapi tidak tertulis bahwa seseorang tidak dapat mengaksesstatic
anggota menggunakan variabel referensi objek. Jadi ini berfungsi di sini.Sebuah
null
variabel referensi obyek diperbolehkan untuk mengaksesstatic
variabel kelas tanpa membuang pengecualian baik di kompilasi atau run time.sumber
Variabel dan metode statis selalu menjadi milik kelas. Jadi ketika kita membuat objek apa pun hanya variabel non-statis dan metode pergi ke heap bersama dengan objek tetapi statis berada di area metode dengan kelas. Itulah mengapa ketika kita mencoba mengakses variabel statis atau metode itu diubah menjadi nama kelas variabel titik atau nama metode.
Silakan lihat tautan di bawah ini untuk detail lebih lanjut.
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
sumber