Rumah >Java >javaTutorial >Bagaimanakah Java Menyelesaikan Kekaburan Apabila Mengatasi Kaedah dalam Pelbagai Antara Muka?

Bagaimanakah Java Menyelesaikan Kekaburan Apabila Mengatasi Kaedah dalam Pelbagai Antara Muka?

Barbara Streisand
Barbara Streisandasal
2024-12-08 22:26:16603semak imbas

How Does Java Resolve Ambiguity When Overriding Methods in Multiple Interfaces?

Mengatasi Kekaburan dengan Pelbagai Antara Muka

Dalam bidang pengaturcaraan berorientasikan objek, kelas boleh melaksanakan berbilang antara muka. Walau bagaimanapun, apabila antara muka ini mempunyai kaedah dengan tandatangan yang sama, persoalan timbul: bagaimana pengkompil menyelesaikan kaedah antara muka yang ditindih?

Di Java, kelas yang melaksanakan berbilang antara muka dengan kaedah bertindih sedemikian hanya akan mempunyai satu pelaksanaan yang berkesan . Pengkompil tidak membezakan antara kaedah berdasarkan asal antara muka mereka.

Untuk memahami konsep ini, mari kita pertimbangkan contoh berikut:

interface A {
  int f();
}

interface B {
  int f();
}

class Test implements A, B {   
  @Override
  public int f() {  
    return 0;
  }
}   

Dalam senario ini, Ujian melaksanakan kedua-dua A dan B , dan kedua-dua antara muka mentakrifkan kaedah bernama f() dengan tandatangan yang sama. Dengan mengatasi kaedah ini dalam Ujian, kelas secara berkesan mengatasi kaedah f() daripada kedua-dua antara muka, walaupun hanya satu anotasi @Override hadir.

Ini kerana peraturan warisan Java menentukan bahawa kaedah dengan tandatangan yang sama dipertimbangkan "override-equivalent." Akibatnya, pengkompil memilih kaedah mengatasi pertama yang ditemuinya, tanpa mengira asal antara mukanya.

Selain itu, ketidakserasian boleh timbul jika kaedah bercanggah mempunyai jenis pulangan yang berbeza. Dalam kes sedemikian, pengkompil akan melaporkan ralat, kerana tidak mungkin mempunyai dua kaedah dengan tandatangan yang sama tetapi jenis pulangan yang berbeza dalam kelas yang sama.

Untuk menggambarkan perkara ini, mari kita ubah suai contoh seperti berikut:

interface Gift {
  void present();
}

interface Guest {
  boolean present();
}

class Presentable implements Gift, Guest {
  @Override
  public void present() {
    System.out.println("Present as a gift!");
  }
}

Di sini, Gift.present() dan Guest.present() mempunyai jenis pulangan yang tidak serasi (void vs. boolean). Akibatnya, Presentable tidak boleh melaksanakan kedua-dua antara muka kerana ia melanggar peraturan utama.

Kesimpulannya, apabila kelas melaksanakan berbilang antara muka dengan kaedah setara override, pengkompil mengiktiraf hanya terdapat satu kaedah untuk dilaksanakan dan @Override anotasi pada kaedah overriding digunakan pada semua antara muka. Walau bagaimanapun, ketidakserasian antara tandatangan kaedah akan membawa kepada ralat penyusunan.

Atas ialah kandungan terperinci Bagaimanakah Java Menyelesaikan Kekaburan Apabila Mengatasi Kaedah dalam Pelbagai Antara Muka?. 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