Rumah > Java > javaTutorial > Bolehkah Subkelas Java Mengatasi Pembolehubah Ahli?

Bolehkah Subkelas Java Mengatasi Pembolehubah Ahli?

DDD
Lepaskan: 2024-12-18 18:15:10
asal
945 orang telah melayarinya

Can Java Subclasses Override Member Variables?

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan