Overriding Member Variable in Java: Understanding Variable Hiding
Di Java, overriding fungsi ahli ialah konsep yang terkenal, tetapi bagaimana pula dengan overriding pembolehubah ahli? Untuk meneroka perkara ini, pertimbangkan kod berikut:
public class A { public int intVal = 1; public void identifyClass() { System.out.println("I am class A"); } } public class B extends A { public int intVal = 2; public void identifyClass() { System.out.println("I am class B"); } } public 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); // Output: 1 aRef.identifyClass(); // Output: "I am class A" aRef = b; System.out.println(aRef.intVal); // Output: 1 aRef.identifyClass(); // Output: "I am class B" } }
Kod ini bertujuan untuk menunjukkan gelagat pembolehubah ahli yang diganti. Walau bagaimanapun, terdapat teka-teki - mengapa aRef.intVal masih mengembalikan 1 selepas aRef ditetapkan kepada b, yang mempunyai intVal 2?
Jawapannya terletak pada konsep penyembunyian berubah-ubah. Apabila subkelas mengisytiharkan pembolehubah dengan nama yang sama seperti dalam kelas supernya, ia "menyembunyikan" pembolehubah superclass itu. Ini bermakna subkelas mempunyai dua pembolehubah: satu daripada kelas supernya dan satu daripada takrifannya sendiri.
Dalam kod di atas, pembolehubah ahli intVal diisytiharkan dalam kedua-dua A dan B. Oleh itu, apabila B dicipta, ia mempunyai kedua-dua intVals - satu dengan nilai 1 diwarisi daripada A dan satu dengan nilai 2 ditakrifkan dalam B.
Apabila aRef ditetapkan kepada a, ia merujuk kepada intVal A. Apabila aRef ditetapkan kepada b, ia masih merujuk kepada intVal A. Ini kerana dalam ungkapan aRef.intVal, aRef menyelesaikan kepada jenis A dan intVal ialah pembolehubah A.
Untuk mengakses intVal B, seseorang perlu menggunakan ((B)aRef).intVal, yang secara eksplisit menghantar aRef ke taip B dan membenarkan akses kepada pembolehubah B.
Atas ialah kandungan terperinci Bolehkah Subkelas Java Mengatasi Pembolehubah Ahli?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!