JavaRush /Java Blog /Random-ID /Mekanisme penggantian metode atau Override di Java

Mekanisme penggantian metode atau Override di Java

Dipublikasikan di grup Random-ID
Halo! Anda sudah menggunakan metode di Java dan mengetahui banyak tentangnya. Anda mungkin pernah menghadapi situasi di mana ada banyak metode dalam satu kelas dengan nama yang sama tetapi argumennya berbeda. Jika Anda ingat, dalam kasus tersebut kami menggunakan metode mekanisme kelebihan beban. Hari ini mari kita lihat situasi yang berbeda. Bayangkan kita mempunyai satu metode yang umum, tetapi metode tersebut harus melakukan hal yang berbeda tergantung pada kelas mana metode tersebut dipanggil. Bagaimana cara menerapkan perilaku ini? Untuk mengetahuinya, mari kita ambil kelas induk Animalyang menunjukkan hewan dan membuat metode di dalamnya voice- “ suara ”:
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
Meskipun kami baru saja mulai menulis programnya, kemungkinan besar Anda dapat melihat potensi masalahnya: ada banyak hewan di dunia, dan mereka semua “berbicara” dengan cara yang berbeda: kucing mengeong, bebek berkuak, ular mendesis. Cara kerja mekanisme penggantian metode - 2 Tujuan kami sederhana: menghindari pembuatan banyak metode untuk memberikan suara. Daripada membuat metode voiceCat()untuk mengeong, voiceSnake()mendesis, dll., kita ingin voice()ular mendesis, kucing mengeong, dan anjing menggonggong ketika metode tersebut dipanggil. Kita dapat dengan mudah mencapai ini menggunakan mekanisme metode overriding (Override in Java) . Wikipedia memberikan penjelasan mengenai istilah “overriding” sebagai berikut: Method overriding dalam pemrograman berorientasi objek adalah salah satu fitur bahasa pemrograman yang memungkinkan subclass atau kelas anak menyediakan implementasi spesifik dari metode yang sudah diimplementasikan di salah satu superclass. atau kelas orang tua. Secara umum, hal ini benar. Overriding memungkinkan Anda mengambil metode dari kelas induk dan menulis implementasi Anda sendiri atas metode ini di setiap kelas turunannya. Implementasi baru akan "menggantikan" induk di kelas anak. Mari kita lihat seperti apa ini dengan sebuah contoh. Mari kita buat 4 kelas penerus untuk kelas kita 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("Ш-ш-ш!");
   }
}
Sebuah peretasan kecil untuk masa depan: untuk mengganti metode kelas induk, buka kode kelas turunan di Intellij IDE a, tekan Ctrl+O dan pilih “ Ganti metode... ” dari menu. Biasakan menggunakan hotkey dari awal, ini akan mempercepat penulisan program! Untuk menetapkan perilaku yang kami inginkan, kami melakukan beberapa hal:
  1. Kami membuat metode di setiap kelas turunan dengan nama yang sama dengan metode di kelas induk.
  2. Kami memberi tahu kompiler bahwa kami menamai metode tersebut sama dengan kelas induk karena suatu alasan: kami ingin mengganti perilakunya. Untuk “pesan” ini kepada kompiler, kami memberikan anotasi @Override pada metode tersebut .
    Anotasi @Override yang ditempatkan di atas suatu metode memberi tahu kompiler (dan pemrogram yang juga membaca kode Anda): “Semuanya baik-baik saja, ini bukan kesalahan atau kelupaan saya. Saya ingat metode seperti itu sudah ada, dan saya ingin menggantinya."

  3. Kami menulis implementasi yang kami butuhkan untuk setiap kelas turunan. Saat dipanggil, ular voice()akan mendesis, beruang menggeram, dan seterusnya.
Mari kita lihat cara kerjanya dalam program ini:
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();
   }
}
Keluaran konsol: Guk! Meong! rrrr! Ssst! Hebat, semuanya berjalan sebagaimana mestinya! Kami membuat 4 variabel referensi dari kelas induk Animal, dan menugaskannya ke 4 objek berbeda dari kelas turunannya. Akibatnya, setiap objek berperilaku berbeda. Untuk masing-masing kelas turunan, metode yang diganti voice()menggantikan metode “asli” voice()dari kelas Animal(yang hanya mengeluarkan “Voice!” ke konsol). Cara kerja mekanisme penggantian metode - 3 Penggantian memiliki sejumlah keterbatasan:
  1. Metode yang diganti harus mempunyai argumen yang sama dengan metode induk.

    Jika suatu metode voicedi kelas induk menerima sebagai input String, metode yang diganti di kelas anak juga harus menerima sebagai input String, jika tidak, kompilator akan memunculkan kesalahan:

    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. Metode yang diganti harus memiliki tipe kembalian yang sama dengan metode induk.

    Jika tidak, kami akan menerima kesalahan kompilasi:

    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 akses dari metode yang diganti juga tidak dapat berbeda dari metode “asli”:

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void voice() {      //error!
           System.out.println("Meow!");
       }
    }
Metode overriding di Java adalah salah satu alat untuk mengimplementasikan ide polimorfisme (prinsip OOP yang kita bahas pada kuliah terakhir). Oleh karena itu, keuntungan utama menggunakannya adalah fleksibilitas yang sama seperti yang kita bicarakan sebelumnya. Kita dapat membangun sistem kelas yang sederhana dan logis, yang masing-masing akan memiliki perilaku spesifik (anjing menggonggong, kucing mengeong), tetapi dengan satu antarmuka - satu metode voice()untuk semua, bukan sekumpulan metode voiceDog(), voiceCat()dll.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION