Semasa meneroka konsep mengatasi fungsi ahli di Java, anda telah mencuba mencuba pembolehubah ahli mengatasi. Untuk itu, anda mencipta struktur kelas berikut:
class A { public int intVal = 1; } class B extends A { public int intVal = 2; } class MainClass { public static void main(String[] args) { A a = new A(); B b = new B(); A aRef; aRef = a; System.out.println(aRef.intVal); aRef.identifyClass(); aRef = b; System.out.println(aRef.intVal); aRef.identifyClass(); } }
Melaksanakan kod ini menghasilkan output berikut:
1 I am class A 1 I am class B
Anda menyatakan kekeliruan mengapa aRef.intVal kekal 1 walaupun selepas menjadi diberikan kepada contoh kelas B. Untuk merungkai misteri ini, fahami bahawa dalam senario yang anda bentangkan, anda berhadapan dengan penyembunyian berubah-ubah bukannya mengatasi.
Di Java, anda boleh mempunyai pembolehubah dengan nama yang sama dalam superclass dan subclass. Teknik menyembunyikan pembolehubah ini secara berkesan menyembunyikan pembolehubah superclass. Walau bagaimanapun, kedua-dua pembolehubah terus wujud secara bebas dalam kelas masing-masing.
Apabila anda mengakses pembolehubah daripada rujukan superclass, anda berinteraksi dengan pembolehubah superclass. Rujukan itu sendiri tidak dipengaruhi oleh kelas objek yang ditunjukkannya. Oleh itu, walaupun aRef menunjuk kepada contoh kelas B, ia mengakses pembolehubah intVal daripada kelas A kerana itulah kelas yang dimiliki oleh aRef.
Untuk mengakses pembolehubah intVal daripada subkelas (B), anda boleh menggunakan kata kunci super, yang merujuk kepada superclass. Pendekatan ini membolehkan anda membezakan antara pembolehubah dengan nama yang sama dalam superclass dan subclass, dengan itu menyelesaikan sebarang kekaburan.
Atas ialah kandungan terperinci Mengapa Penyembunyian Pembolehubah Berlaku Apabila Mengatasi Pembolehubah Ahli di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!