Animal
kelas induk, yang merepresentasikan hewan, dan buat speak
metode 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: kami 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 Animal
kelas 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:
- Di setiap kelas turunan, kami membuat metode dengan nama yang sama dengan metode di kelas induk.
-
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 . - Kami menulis implementasi yang kami butuhkan untuk setiap kelas keturunan. Saat
speak()
metode dipanggil, ular harus mendesis, beruang menggeram, dan seterusnya.
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 Animal
kelas 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). Pengesampingan metode memiliki beberapa keterbatasan:
-
Metode yang diganti harus memiliki argumen yang sama dengan metode di kelas induk.
Jika
speak
metode dari kelas induk menggunakan aString
sebagai masukan, maka metode yang ditimpa pada kelas turunan juga harus mengambil aString
sebagai 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!"); } }
-
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!"; } }
-
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!"); } }
speak()
metode untuk semua orang daripada sekelompok metode yang berbeda, misalnya bark()
, meow()
, dll.
GO TO FULL VERSION