Rumah  >  Artikel  >  Java  >  Mengapakah subkelas menjana mesej ralat apabila memanggil kaedah terlampau beban?

Mengapakah subkelas menjana mesej ralat apabila memanggil kaedah terlampau beban?

PHPz
PHPzasal
2024-03-08 11:15:03411semak imbas

Mengapakah subkelas menjana mesej ralat apabila memanggil kaedah terlampau beban?

Mengapa subkelas menjana mesej ralat apabila memanggil kaedah terlebih beban?
Dalam pengaturcaraan berorientasikan objek, beban berlebihan ialah teknik mentakrifkan berbilang kaedah dengan nama yang sama dalam kelas yang sama. Apabila memanggil kaedah terlebih beban, pengkompil akan menentukan kaedah khusus untuk dipanggil berdasarkan jenis parameter kaedah, nombor atau susunan. Walau bagaimanapun, apabila subkelas mewarisi kaedah terlebih beban yang ditakrifkan dalam kelas induk, beberapa mesej ralat mungkin muncul. Mari jelaskan ini dengan contoh kod konkrit.

Katakan terdapat kelas induk Ibu Bapa yang mentakrifkan kaedah terlampau beban public void print(int a) dan public void print(String s) , subkelas Child mewarisi kelas induk dan cuba memanggil dua kaedah terlampau beban ini. Mari kita lihat contoh kod berikut: Parent 中定义了一个重载方法 public void print(int a)public void print(String s),子类 Child 继承了父类并尝试调用这两个重载方法。我们来看看下面的示例代码:

public class Parent {
    public void print(int a) {
        System.out.println("Printing integer: " + a);
    }

    public void print(String s) {
        System.out.println("Printing string: " + s);
    }
}

public class Child extends Parent {
    public static void main(String[] args) {
        Child child = new Child();
        child.print(10);  // 调用父类的重载方法 print(int a)
        child.print("Hello");  // 调用父类的重载方法 print(String s)
    }
}

在上面的代码中,子类 Child 实例化后分别调用了父类 Parent 中的重载方法,这个示例是没有问题的,我们成功地调用了两个重载方法并输出了正确的结果。但是,当子类中重载同名方法时,就有可能会产生错误信息。让我们看下面的示例:

public class Child extends Parent {
    public void print(double d) {
        System.out.println("Printing double: " + d);
    }

    public static void main(String[] args) {
        Child child = new Child();
        child.print(10);  // Error: The method print(int) is ambiguous for the type Child
        child.print("Hello");  // 调用父类的重载方法 print(String s)
        child.print(10.5);  // 调用子类的重载方法 print(double d)
    }
}

在这个例子中,子类 Child 在继承父类的重载方法的同时,又添加了一个新的重载方法 public void print(double d)。当我们尝试调用 child.print(10) 时,编译器会出现错误信息:The method print(int) is ambiguous for the type Child,这是因为编译器无法确定应该调用父类的 print(int a) 还是子类的 print(double d)rrreee

Dalam kod di atas, subkelas Child memanggil kaedah terlebih beban dalam kelas induk Ibu bapa selepas instantiasi masalah dengan contoh ini, kami berjaya memanggil kedua-dua kaedah terlebih beban dan mengeluarkan hasil yang betul. Walau bagaimanapun, apabila kaedah dengan nama yang sama ditindih dalam subkelas, mesej ralat mungkin dijana. Mari lihat contoh berikut:

rrreee

Dalam contoh ini, subkelas Child mewarisi kaedah terlebih beban kelas induk dan menambah kaedah terlampau beban baharu public void print(double d) kod>. Apabila kita cuba memanggil <code>child.print(10), pengkompil akan memberikan mesej ralat: Kaedah print(int) adalah samar-samar untuk jenis Child Ini kerana pengkompil tidak dapat menentukan bahawa induk kelas hendaklah dipanggil print(int a) atau subclass print(double d).

Untuk menyelesaikan masalah ini, kami boleh menentukan kaedah yang akan dipanggil secara eksplisit, atau mengelak daripada membebankan kaedah sedia ada kelas induk dalam subkelas. Apabila kaedah dalam subkelas bercanggah dengan kaedah dalam kelas induk, pengkompil tidak akan dapat menentukan kaedah yang hendak dipanggil, sekali gus menghasilkan mesej ralat. 🎜🎜Dalam pengaturcaraan berorientasikan objek, adalah sangat penting untuk memahami konsep lebihan beban dan warisan Hanya dengan memahami sepenuhnya ciri-ciri ini kita boleh menulis kod yang lebih mantap dan jelas. 🎜

Atas ialah kandungan terperinci Mengapakah subkelas menjana mesej ralat apabila memanggil kaedah terlampau beban?. 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