Rumah > Java > javaTutorial > teks badan

Mengapakah pengecualian berlaku apabila subkelas memanggil kaedah terlebih beban?

WBOY
Lepaskan: 2024-03-08 16:48:04
asal
533 orang telah melayarinya

Mengapakah pengecualian berlaku apabila subkelas memanggil kaedah terlebih beban?

Mengapa pengecualian berlaku apabila subkelas memanggil kaedah terlebih beban?

Dalam pengaturcaraan berorientasikan objek, beban berlebihan merujuk kepada mentakrifkan berbilang kaedah dalam kelas yang sama dengan nama yang sama tetapi senarai parameter yang berbeza untuk mencapai pelaksanaan fungsi yang berbeza. Apabila subkelas mewarisi daripada kelas induk, jika terdapat lebihan kaedah dengan nama yang sama dalam subkelas, pengecualian mungkin berlaku.

Untuk menerangkan dengan lebih khusus mengapa pengecualian dilemparkan apabila subkelas memanggil kaedah terlebih beban, mari lihat contoh kod berikut:

class Parent {
    void display() {
        System.out.println("Parent class display method");
    }
    void display(int num) {
        System.out.println("Parent class display method with parameter");
    }
}

class Child extends Parent {
    void display() {
        System.out.println("Child class display method");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent parent = new Child();
        parent.display();
        parent.display(10);
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mentakrifkan kelas induk Induk Dan subclass Child Terdapat dua kaedah display yang berlebihan dalam kelas induk, iaitu versi tanpa parameter dan versi dengan parameter integer. Subkelas Child mewarisi daripada kelas induk Induk dan mengatasi kaedah display dalam kelas induk. Parent 和一个子类 Child,父类中有两个重载的 display 方法,分别是没有参数的版本和带一个整型参数的版本。子类 Child 继承自父类 Parent,并且重写了父类中的 display 方法。

Main 类中,我们创建了一个父类的引用指向子类的对象。然后尝试分别调用 display 方法和 display(int num) 方法。根据多态的原则,由于引用变量是父类类型,实际对象是子类类型,所以调用的应该是子类 Child 中的方法。

然而,当运行程序时,会发现只有 display 方法被调用,而调用 display(int num) 方法时会产生编译错误。这是因为在继承关系中,子类重载父类的方法,并不会覆盖父类的方法,而只是新增了一个重载的方法。因此,当通过父类引用调用重载方法时,编译器会选择调用父类中定义的方法,而不是子类中重载的方法。

为了解决这个问题,我们可以通过将父类中的方法声明为 final

Dalam kelas Main, kami mencipta rujukan daripada kelas induk kepada objek subkelas. Kemudian cuba panggil kaedah display dan kaedah display(int num). Menurut prinsip polimorfisme, oleh kerana pembolehubah rujukan adalah daripada jenis kelas induk dan objek sebenar adalah daripada jenis subkelas, kaedah dalam subkelas Child harus dipanggil.

Walau bagaimanapun, apabila anda menjalankan program, anda akan mendapati bahawa hanya kaedah display dipanggil dan memanggil kaedah display(int num) akan menghasilkan ralat penyusunan. Ini kerana dalam perhubungan pewarisan, apabila subkelas mengatasi kaedah kelas induk, ia tidak menimpa kaedah kelas induk, tetapi hanya menambah kaedah terlebih muatan baharu. Oleh itu, apabila kaedah terlebih beban dipanggil melalui rujukan kelas induk, pengkompil akan memilih untuk memanggil kaedah yang ditakrifkan dalam kelas induk dan bukannya kaedah terlebih beban dalam kelas anak. 🎜🎜Untuk menyelesaikan masalah ini, kita boleh mengisytiharkan kaedah dalam kelas induk sebagai akhir, atau melebihkan semua kaedah dalam kelas induk dalam subkelas untuk memastikan kaedah dalam subkelas dipanggil kaedah tanpa membuang pengecualian. 🎜🎜Ringkasnya, pengecualian akan dilemparkan apabila subkelas memanggil kaedah terlebih beban kerana dalam hubungan warisan, subkelas yang melebihkan kaedah kelas induk tidak akan mengatasi kaedah kelas induk, jadi anda perlu memberi perhatian untuk mengelakkan ini apabila menggunakan ia timbul. 🎜

Atas ialah kandungan terperinci Mengapakah pengecualian berlaku apabila subkelas memanggil kaedah terlebih beban?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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