Animal
yang 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. 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:
- Kami mencipta kaedah dalam setiap kelas keturunan dengan nama yang sama dengan kaedah dalam kelas induk.
-
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." - Kami menulis pelaksanaan yang kami perlukan untuk setiap kelas keturunan. Apabila dipanggil, ular
voice()
harus mendesis, beruang harus menggeram, dsb.
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 Animal
dan 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). Mengatasi mempunyai beberapa had:
-
Kaedah yang diganti mesti mempunyai hujah yang sama dengan kaedah induk.
Jika kaedah
voice
dalam kelas induk menerima sebagai inputString
, kaedah ganti dalam kelas kanak-kanak juga mesti menerima sebagai inputString
, 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!"); } }
-
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!"; } }
-
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!"); } }
voice()
untuk semua dan bukannya sekumpulan kaedah voiceDog()
, voiceCat()
dsb.
GO TO FULL VERSION