Hai! Anda sudah menggunakan metode Java dan tahu banyak tentangnya. Cara kerja metode overriding - 1Tentunya Anda telah menemukan kelas dengan banyak metode yang memiliki nama yang sama tetapi daftar argumen yang berbeda. Anda akan ingat bahwa dalam kasus tersebut kami menggunakan metode overloading. Hari ini kita akan melihat situasi yang berbeda. Bayangkan kita memiliki satu metode umum, tetapi harus melakukan hal yang berbeda tergantung pada kelas yang dipanggil. Bagaimana kita menerapkan perilaku ini? Untuk memahami ini, mari ambil Animalkelas induk, yang merepresentasikan hewan, dan buat speakmetode di dalamnya:
public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
Meskipun kami baru saja mulai menulis program kami, Anda mungkin dapat melihat masalah potensial: dunia ini penuh dengan banyak hewan, dan mereka semua "berbicara" berbeda: kucing mengeong, dukun bebek, ular mendesis, dll. Tujuan kami sederhana: Cara kerja metode overriding - 2kami ingin menghindari membuat banyak metode untuk berbicara. Alih-alih membuat meow()metode mengeong, hiss()mendesis, dll., kita ingin ular mendesis, kucing mengeong, dan anjing menggonggong saat metode speak()dipanggil. Kita dapat dengan mudah mencapainya dengan menggunakan metode overriding . Wikipedia menjelaskan istilah sebagai berikut: Metode overriding, dalam pemrograman berorientasi objek, adalah fitur bahasa yang memungkinkan subclass atau kelas anak menyediakan implementasi spesifik dari metode yang sudah disediakan oleh salah satu superclass atau kelas induknya. Itu pada dasarnya benar. Mengganti memungkinkan Anda mengambil beberapa metode kelas induk dan menulis implementasi Anda sendiri di setiap kelas turunan. Implementasi baru di kelas anak "menggantikan" yang ada di kelas induk. Mari kita lihat bagaimana ini terlihat dengan sebuah contoh. Mari buat 4 turunan dari 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!");
   }
}
Inilah lifehack kecil untuk masa depan: untuk mengganti metode kelas induk, masuk ke kode kelas turunan di IntelliJ IDE , tekan Ctrl+O , dan pilih Override methods... dari menu. Biasakan menggunakan hotkey sejak awal. Mereka akan mempercepat pengkodean! Untuk mendapatkan perilaku yang diinginkan, kami melakukan beberapa hal:
  1. Di setiap kelas turunan, kami membuat metode dengan nama yang sama dengan metode di kelas induk.
  2. Kami memberi tahu kompiler bahwa kami tidak hanya memberikan metode nama yang sama seperti di kelas induk tetapi kami ingin mengganti perilakunya. "Pesan" ke kompiler ini disampaikan melalui anotasi @Override .
    Anotasi @Override di atas metode memberi tahu kompiler (serta pemrogram lain yang membaca kode Anda), "Jangan khawatir. Ini bukan kesalahan atau kekeliruan. Saya sadar bahwa metode ini sudah ada, dan saya ingin menimpanya .

  3. Kami menulis implementasi yang kami butuhkan untuk setiap kelas keturunan. Saat speak()metode dipanggil, ular harus mendesis, beruang menggeram, dan seterusnya.
Mari kita lihat bagaimana ini bekerja dalam sebuah 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();
   }
}
Keluaran konsol:

Woof! 
Meow! 
Growl! 
Hiss!
Hebat, semuanya berfungsi sebagaimana mestinya! Kami membuat 4 variabel referensi yang tipenya adalah Animalkelas induk, dan menugaskan mereka 4 objek berbeda dari kelas turunan. Akibatnya, setiap objek berperilaku berbeda. Untuk setiap kelas turunan, speak()metode yang diganti menggantikan speak()metode kelas yang ada Animal(yang hanya menampilkan "Berbicara: " di konsol). Cara kerja metode overriding - 3Pengesampingan metode memiliki beberapa keterbatasan:
  1. Metode yang diganti harus memiliki argumen yang sama dengan metode di kelas induk.

    Jika speakmetode dari kelas induk menggunakan a Stringsebagai masukan, maka metode yang ditimpa pada kelas turunan juga harus mengambil a Stringsebagai masukan. Jika tidak, kompiler akan menghasilkan kesalahan:

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

    Jika tidak, kami akan mendapatkan kesalahan kompilasi:

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

    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, metode overriding adalah salah satu cara untuk mengimplementasikan polimorfisme. Itu berarti keunggulan utamanya adalah fleksibilitas yang kita bicarakan sebelumnya. Kita dapat membangun hierarki kelas yang sederhana dan logis, masing-masing dengan perilaku tertentu (anjing menggonggong, kucing mengeong) tetapi antarmuka tunggal — satu speak()metode untuk semua orang daripada sekelompok metode yang berbeda, misalnya bark(), meow(), dll.