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
Lepaskan: 2024-12-01 19:10:12
asal
763 orang telah melayarinya

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);
}
Salin selepas log masuk

}

Anak kelas lanjutkan Ayah {

protected static String me = "son";
Salin selepas log masuk

}

public void doIt() {

new Son().printMe();
Salin selepas log masuk

}

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);
}
Salin selepas log masuk

}

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan