Hai! Anda sudah menggunakan kaedah Java dan tahu banyak tentangnya. Cara mengatasi kaedah berfungsi - 1Pasti anda telah menemui kelas dengan banyak kaedah yang mempunyai nama yang sama tetapi senarai hujah yang berbeza. Anda akan ingat bahawa dalam kes tersebut kami menggunakan kaedah lebih muatan. Hari ini kita akan melihat situasi yang berbeza. Bayangkan bahawa kita mempunyai satu kaedah biasa, tetapi ia harus melakukan perkara yang berbeza bergantung pada kelas mana ia dipanggil. Bagaimanakah kita melaksanakan tingkah laku ini? Untuk memahami perkara ini, mari ambil Animalkelas induk, yang mewakili haiwan, dan buat speakkaedah di dalamnya:
public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
Walaupun kami baru mula menulis program kami, anda mungkin dapat melihat masalah yang berpotensi: dunia ini penuh dengan banyak haiwan, dan mereka semua "bercakap" secara berbeza: kucing mengeong, itik cuak, ular mendesis, dsb. Matlamat kami adalah mudah: Cara mengatasi kaedah berfungsi - 2kami mahu mengelak daripada mencipta sekumpulan kaedah untuk bercakap. Daripada mencipta meow()kaedah mengeong, hiss()mendesis, dsb., kita mahu ular mendesis, kucing mengeong, dan anjing menyalak apabila speak()kaedah itu dipanggil. Kita boleh mencapai ini dengan mudah menggunakan kaedah mengatasi . Wikipedia menerangkan istilah seperti berikut: Kaedah mengatasi, dalam pengaturcaraan berorientasikan objek, ialah ciri bahasa yang membenarkan subkelas atau kelas kanak-kanak menyediakan pelaksanaan khusus kaedah yang telah disediakan oleh salah satu kelas super atau kelas induknya. Itu pada asasnya betul. Overriding membolehkan anda mengambil beberapa kaedah kelas induk dan menulis pelaksanaan anda sendiri dalam setiap kelas terbitan. Pelaksanaan baharu dalam kelas kanak-kanak "menggantikan" kelas dalam induk. Mari lihat bagaimana ini kelihatan dengan contoh. Mari kita cipta 4 keturunan Animalkelas kita:
public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
Berikut ialah peretasan kecil untuk masa hadapan: untuk mengatasi kaedah kelas induk, pergi ke kod kelas terbitan dalam IntelliJ IDE , tekan Ctrl+O , dan pilih Override kaedah... daripada menu. Biasakan menggunakan hotkey dari awal lagi. Mereka akan mempercepatkan pengekodan! Untuk mendapatkan tingkah laku yang diingini, kami melakukan beberapa perkara:
  1. Dalam setiap kelas keturunan, kami mencipta kaedah dengan nama yang sama dengan kaedah dalam kelas induk.
  2. Kami memberitahu pengkompil bahawa kami bukan sahaja memberikan kaedah nama yang sama seperti dalam kelas induk tetapi sebaliknya kami mahu mengatasi kelakuannya. "Mesej" ini kepada pengkompil disampaikan melalui anotasi @Override .
    Anotasi @Override di atas kaedah memberitahu pengkompil (serta pengaturcara lain membaca kod anda), "Jangan risau. Ini bukan kesilapan atau kelalaian. Saya sedar bahawa kaedah ini sudah wujud dan saya mahu membatalkannya .

  3. Kami menulis pelaksanaan yang kami perlukan untuk setiap kelas keturunan. Apabila speak()kaedah itu dipanggil, ular harus mendesis, beruang harus menggeram, dan sebagainya.
Mari lihat bagaimana ini berfungsi dalam program:
public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();

       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
Output konsol:

Woof! 
Meow! 
Growl! 
Hiss!
Hebat, semuanya berfungsi sebagaimana mestinya! Kami mencipta 4 pembolehubah rujukan yang jenisnya ialah Animalkelas induk, dan memberikan mereka 4 objek berbeza daripada kelas keturunan. Akibatnya, setiap objek berkelakuan berbeza. Bagi setiap kelas terbitan, speak()kaedah yang diganti menggantikan speak()kaedah kelas sedia ada Animal(yang hanya memaparkan "Bercakap: " pada konsol). Cara mengatasi kaedah berfungsi - 3Penggantian kaedah mempunyai beberapa batasan:
  1. Kaedah yang diganti mesti mempunyai hujah yang sama dengan kaedah dalam kelas induk.

    Jika speakkaedah kelas induk mengambil a Stringsebagai input, maka kaedah overridden dalam kelas turunan juga mesti mengambil a Stringsebagai input. Jika tidak, pengkompil akan menghasilkan ralat:

    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Speaking: " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }

  2. Kaedah yang diganti mesti mempunyai jenis pulangan yang sama seperti kaedah dalam kelas induk.

    Jika tidak, kami akan mendapat ralat penyusunan:

    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

  3. Pengubah suai akses kaedah yang diganti juga tidak boleh berbeza daripada yang asal:

    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void speak() {      // Error!
           System.out.println("Meow!");
       }
    }
Di Jawa, kaedah mengatasi adalah satu cara untuk melaksanakan polimorfisme. Ini bermakna kelebihan utamanya ialah fleksibiliti yang kita bincangkan sebelum ini. Kita boleh membina hierarki kelas yang mudah dan logik, masing-masing dengan gelagat tertentu (anjing menyalak, kucing mengeong) tetapi antara muka tunggal — kaedah tunggal speak()untuk semua orang dan bukannya sekumpulan kaedah yang berbeza, cth bark(), meow(), dsb.