Java Class Variable Override Conundrum
Pertimbangkan coretan kod Java berikut:
kelas Ayah {
protected static String me = "dad"; public void printMe() { System.out.println(me); }
}
Anak kelas lanjutkan Ayah {
protected static String me = "son";
}
public void doIt() {
new Son().printMe();
}
Kod nampaknya mentakrifkan pembolehubah kelas bernama "saya" dalam kedua-dua kelas "Ayah" dan "Anak". Apabila memanggil "doIt()", seseorang mungkin menjangkakan kod untuk mencetak "anak" kerana "Anak" ialah subkelas "Ayah". Walau bagaimanapun, ini bukan yang berlaku.
Mengapa "doIt()" Mencetak "ayah"?
Di Java, pembolehubah kelas tidak boleh ditindih. Sebaliknya, mereka tersembunyi. Khususnya, apabila mengisytiharkan pembolehubah kelas dengan nama sedia ada dalam subkelas, subkelas menyembunyikan pembolehubah kelas yang diwarisi, dengan berkesan mencipta pembolehubah kelas baharu dengan nama yang sama tetapi berbeza daripada kelas induknya.
Menggantikan lwn. Menyembunyikan
Overriding melibatkan penyediaan pelaksanaan yang berbeza untuk kaedah dalam subkelas yang mengatasi kaedah dalam superclass. Sebaliknya, penyembunyian melibatkan penggunaan nama pembolehubah yang sama dalam subkelas, tetapi ia menyembunyikan pembolehubah yang diwarisi daripada superclass dan mencipta pembolehubah tempatan baharu kepada subkelas.
Bagaimana untuk Mencetak "anak"?
Untuk mencapai tingkah laku yang diingini untuk mencetak "anak", seseorang tidak boleh mengatasi pembolehubah kelas. Sebaliknya, seseorang boleh menggunakan teknik pewarisan lain seperti:
Contoh dengan Hujah Pembina:
Orang kelas awam {
private String name; public Person(String name) { this.name = name; } public void printName() { System.out.println(name); }
}
Dalam contoh ini, kelas "Orang" mempunyai pembina yang menetapkan nama. Ini membolehkan seseorang membuat subkelas "Orang" dan menghantar nilai khusus untuk nama itu.
Atas ialah kandungan terperinci Mengapa Warisan Pembolehubah Statik Java Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!