Rumah >Java >javaTutorial >Bolehkah Subkelas Java Benar-Benar Mengatasi Pembolehubah Instance, atau Adakah Sesuatu yang Lain sedang dimainkan?

Bolehkah Subkelas Java Benar-Benar Mengatasi Pembolehubah Instance, atau Adakah Sesuatu yang Lain sedang dimainkan?

Barbara Streisand
Barbara Streisandasal
2024-12-16 18:58:12798semak imbas

Can Java Subclasses Truly Override Instance Variables, or is Something Else at Play?

Peningkatan Pembolehubah dalam Java: Penerokaan Lebih Dalam

Mengatasi fungsi ahli di Java ialah konsep yang terkenal. Walau bagaimanapun, bereksperimen dengan pembolehubah ahli mengatasi menimbulkan persoalan. 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);
        aRef.identifyClass();
        aRef = b;
        System.out.println(aRef.intVal);
        aRef.identifyClass();
    }
}

Tingkah laku yang membingungkan terletak pada output:

1
I am class A
1
I am class B

Mengapa intVal masih 1 apabila aRef menunjuk kepada b?

Menyingkap Pembolehubah Menyembunyikan

Bertentangan dengan fungsi mengatasi, pembolehubah mengatasi tidak mungkin. Sebaliknya, Java menggunakan konsep yang dikenali sebagai "penyorok pembolehubah." Apabila pembolehubah dengan nama yang sama diisytiharkan dalam subkelas, ia menutup pembolehubah dalam superclass dalam skop subkelas.

Dalam contoh, kelas B mengisytiharkan intVal = 2. Walaupun ini bertindih dengan pembolehubah dalam kelas A, ia tidak mengatasinya. Kedua-dua pembolehubah wujud bersama dalam objek jenis B.

Mengakses Pembolehubah Kelas Super

Untuk mengakses pembolehubah daripada kelas super, terdapat dua pilihan:

  • super.var: Ini secara eksplisit merujuk pembolehubah daripada superclass.
  • ((SuperClass)this).var: Ini menurunkan ini kepada jenis superclass dan kemudian mengakses pembolehubah.

Sebagai contoh, aRef.super.intVal akan mendapatkan 2 , intVal kelas B.

Pembolehubah Bersembunyi dalam Berlatih

Penyorok pembolehubah boleh berguna dalam senario tertentu. Sebagai contoh, anda boleh menentukan kelas asas dengan sifat biasa yang diwarisi oleh semua subkelas dan secara selektif mengatasi sifat tertentu mengikut keperluan. Walau bagaimanapun, adalah penting untuk menggunakan teknik ini dengan bijak untuk mengelakkan kekeliruan dan kemungkinan ralat.

Atas ialah kandungan terperinci Bolehkah Subkelas Java Benar-Benar Mengatasi Pembolehubah Instance, atau Adakah Sesuatu yang Lain sedang dimainkan?. 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