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); } }
Dalam kod di atas, kami mentakrifkan kelas induk 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
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 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!