JavaRush /Blog Java /Random-MS /Mekanisme mengatasi kaedah atau Override dalam Java

Mekanisme mengatasi kaedah atau Override dalam Java

Diterbitkan dalam kumpulan
hello! Anda sudah menggunakan kaedah dalam Java dan tahu banyak tentangnya. Anda mungkin menghadapi situasi di mana terdapat banyak kaedah dalam satu kelas dengan nama yang sama tetapi hujah yang berbeza. Jika anda masih ingat, dalam kes tersebut kami menggunakan kaedah mekanisme beban lampau. Hari ini mari kita lihat situasi yang berbeza. Bayangkan bahawa kita mempunyai satu kaedah biasa, tetapi ia harus melakukan perkara yang berbeza bergantung pada kelas mana ia dipanggil. Bagaimana untuk melaksanakan tingkah laku ini? Untuk mengetahuinya, mari kita ambil kelas induk Animalyang menandakan haiwan dan buat kaedah di dalamnya voice- “ suara ”:
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
Walaupun kami baru mula menulis program ini, kemungkinan besar anda dapat melihat potensi masalah: terdapat banyak haiwan di dunia, dan mereka semua "bercakap" secara berbeza: kucing mengeong, itik berdesis, ular mendesis. Bagaimana mekanisme mengatasi kaedah berfungsi - 2 Matlamat kami adalah mudah: elakkan membuat sekumpulan kaedah untuk membuang undi. Daripada mencipta kaedah voiceCat()untuk mengeong, voiceSnake()mendesis, dsb., kita mahu voice()ular mendesis, kucing mengeong, dan anjing menyalak apabila kaedah itu dipanggil. Kita boleh mencapai ini dengan mudah menggunakan mekanisme mengatasi kaedah (Override in Java) . Wikipedia memberikan penjelasan berikut tentang istilah "overriding": Kaedah mengatasi dalam pengaturcaraan berorientasikan objek ialah salah satu ciri bahasa pengaturcaraan yang membolehkan subkelas atau kelas kanak-kanak menyediakan pelaksanaan khusus kaedah yang telah dilaksanakan dalam salah satu superclass. atau kelas ibu bapa. Ia, secara umum, betul. Overriding membolehkan anda mengambil kaedah kelas induk dan menulis pelaksanaan anda sendiri bagi kaedah ini dalam setiap kelas keturunan. Pelaksanaan baharu akan "menggantikan" ibu bapa dalam kelas anak. Mari lihat rupanya dengan contoh. Mari buat 4 kelas pengganti untuk kelas kami Animal:
public class Bear extends Animal {
   @Override
   public void voice() {
       System.out.println("Р-р-р!");
   }
}
public class Cat extends Animal {

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

public class Dog extends Animal {

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


public class Snake extends Animal {

   @Override
   public void voice() {
       System.out.println("Ш-ш-ш!");
   }
}
Penggodaman hayat kecil untuk masa hadapan: untuk mengatasi kaedah kelas induk, pergi ke kod kelas keturunan dalam Intellij IDE a, tekan Ctrl+O dan pilih “ Override kaedah... ” daripada menu. Biasakan menggunakan hotkey dari awal, ia akan mempercepatkan penulisan program! Untuk menetapkan tingkah laku yang kami mahu, kami melakukan beberapa perkara:
  1. Kami mencipta kaedah dalam setiap kelas keturunan dengan nama yang sama dengan kaedah dalam kelas induk.
  2. Kami memberitahu pengkompil bahawa kami menamakan kaedah yang sama seperti dalam kelas induk atas sebab: kami ingin mengatasi kelakuannya. Untuk "mesej" ini kepada pengkompil, kami meletakkan anotasi @Override pada kaedah .
    Anotasi @Override yang diletakkan di atas kaedah memberitahu pengkompil (dan pengaturcara membaca kod anda juga): "Semuanya ok, ini bukan kesilapan atau kealpaan saya. Saya masih ingat bahawa kaedah sedemikian sudah wujud, dan saya mahu mengatasinya."

  3. Kami menulis pelaksanaan yang kami perlukan untuk setiap kelas keturunan. Apabila dipanggil, ular voice()harus mendesis, beruang harus menggeram, dsb.
Mari lihat bagaimana ini akan 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.voice();
       animal2.voice();
       animal3.voice();
       animal4.voice();
   }
}
Output konsol: Woof! Meow! Rrrr! Shhh! Hebat, semuanya berfungsi sebagaimana mestinya! Kami mencipta 4 pembolehubah rujukan kelas induk Animaldan menugaskannya kepada 4 objek berbeza bagi kelas keturunan. Akibatnya, setiap objek berkelakuan berbeza. Untuk setiap kelas keturunan, kaedah yang diganti voice()menggantikan kaedah "asli" voice()daripada kelas Animal(yang hanya mengeluarkan "Suara!" kepada konsol). Bagaimana mekanisme mengatasi kaedah berfungsi - 3 Mengatasi mempunyai beberapa had:
  1. Kaedah yang diganti mesti mempunyai hujah yang sama dengan kaedah induk.

    Jika kaedah voicedalam kelas induk menerima sebagai input String, kaedah ganti dalam kelas kanak-kanak juga mesti menerima sebagai input String, jika tidak, pengkompil akan membuang ralat:

    public class Animal {
    
       public void voice(String s) {
    
           System.out.println("Voice! " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override//error!
       public void voice() {
           System.out.println("Meow!");
       }
    }

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

    Jika tidak, kami akan menerima ralat penyusunan:

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String voice() {         //error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

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

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void voice() {      //error!
           System.out.println("Meow!");
       }
    }
Kaedah overriding di Jawa adalah salah satu alat untuk melaksanakan idea polimorfisme (prinsip OOP, yang kita bincangkan dalam kuliah lepas). Oleh itu, kelebihan utama menggunakannya adalah fleksibiliti yang sama seperti yang kita bincangkan sebelum ini. Kita boleh membina sistem kelas yang mudah dan logik, setiap satunya akan mempunyai tingkah laku tertentu (anjing menyalak, kucing mengeong), tetapi dengan antara muka tunggal - satu kaedah voice()untuk semua dan bukannya sekumpulan kaedah voiceDog(), voiceCat()dsb.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION