
Animal
kelas induk, yang mewakili haiwan, dan buat speak
kaedah 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: 
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 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!");
}
}
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:
- Dalam setiap kelas keturunan, kami mencipta kaedah dengan nama yang sama dengan kaedah dalam kelas induk.
-
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 . - Kami menulis pelaksanaan yang kami perlukan untuk setiap kelas keturunan. Apabila
speak()
kaedah itu dipanggil, ular harus mendesis, beruang harus menggeram, dan sebagainya.
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 Animal
kelas 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). 
-
Kaedah yang diganti mesti mempunyai hujah yang sama dengan kaedah dalam kelas induk.
Jika
speak
kaedah kelas induk mengambil aString
sebagai input, maka kaedah overridden dalam kelas turunan juga mesti mengambil aString
sebagai 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!"); } }
-
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!"; } }
-
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!"); } }
speak()
untuk semua orang dan bukannya sekumpulan kaedah yang berbeza, cth bark()
, meow()
, dsb.
GO TO FULL VERSION