Rumah >Java >javaTutorial >Mengapa Warisan Pembolehubah Statik Java Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapa Warisan Pembolehubah Statik Java Menghasilkan Keputusan Yang Tidak Dijangka?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 19:10:12773semak imbas

Why Does Java's Static Variable Inheritance Produce Unexpected Results?

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:

  • Menggunakan nama pembolehubah yang berbeza dalam subkelas, cth., "Nama saya" dan bukannya "saya".
  • Mengubah suai kelas yang diwarisi pembolehubah menggunakan pantulan (kaedah ini tidak disyorkan untuk kegunaan umum).
  • Meluluskan nilai sebagai hujah pembina, seperti yang ditunjukkan dalam contoh di bawah:

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn