Pengoverridan Metode Java: Menyesuaikan Perilaku Superkelas
Dalam bab sebelumnya, kita membahas tentang superkelas dan subclass. Jika sebuah kelas mewarisi metode dari superkelasnya, maka ada kesempatan untuk mengganti metode selama itu tidak ditandai sebagai final.
Manfaat mengganti adalah: kemampuan untuk mendefinisikan perilaku yang spesifik untuk tipe subclass, yang berarti subclass dapat mengimplementasikan metode kelas induk berdasarkan kebutuhannya.
Dalam istilah berorientasi objek, mengganti berarti mengganti fungsionalitas metode yang ada.
Contoh
Mari kita lihat contohnya.
Live Demo
class Animal { public void move() { System.out.println("Hewan dapat bergerak"); } } class Dog extends Animal { public void move() { System.out.println("Anjing dapat berjalan dan berlari"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class } } Ini akan menghasilkan hasil berikut:
Keluaran
Hewan dapat bergerak Anjing dapat berjalan dan berlari
Dalam contoh di atas, Anda dapat melihat bahwa meskipun b adalah tipe Animal, ia menjalankan metode move di kelas Dog. Alasannya adalah: Pada waktu kompilasi, pemeriksaan dilakukan pada tipe referensi. Namun, pada waktu runtime, JVM mengetahui tipe objek dan akan menjalankan metode yang termasuk dalam objek tertentu.
Oleh karena itu, dalam contoh di atas, program akan dikompilasi dengan benar karena kelas Animal memiliki metode move. Kemudian, pada waktu runtime, ia menjalankan metode yang spesifik untuk objek tersebut.
Pertimbangkan contoh berikut:
Contoh
Live Demo
class Animal { public void move() { System.out.println("Hewan dapat bergerak"); } } class Dog extends Animal { public void move() { System.out.println("Anjing dapat berjalan dan berlari"); } public void bark() { System.out.println("Anjing dapat mengeong"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class b.bark(); } } Ini akan menghasilkan hasil berikut:
Keluaran
TestDog.java:26: error: cannot find symbol b.bark(); ^ symbol: method bark() location: variable b of type Animal 1 error
Program ini akan melempar error waktu kompilasi karena tipe referensi b Animal tidak memiliki metode dengan nama bark.
Aturan Pengoverridan Metode
Daftar argumen harus sama persis dengan metode yang diganti.
Tipe pengembalian harus sama atau subjenis dari tipe pengembalian yang dideklarasikan dalam metode asli yang diganti di superkelas.
Tingkat akses tidak boleh lebih restriktif daripada tingkat akses metode yang diganti. Misalnya: Jika metode superkelas dideklarasikan public, maka metode pengganti di subclass tidak boleh private atau protected.
Metode instance hanya dapat diganti jika diwarisi oleh subclass.
Metode yang dideklarasikan final tidak dapat diganti.
Metode yang dideklarasikan static tidak dapat diganti tetapi dapat dideklarasikan ulang.
Jika metode tidak dapat diwarisi, maka tidak dapat diganti.
Subclass dalam paket yang sama dengan superkelas instance dapat mengganti setiap metode superkelas yang tidak dideklarasikan private atau final.
Subclass dalam paket yang berbeda hanya dapat mengganti metode non-final yang dideklarasikan public atau protected.
Metode pengganti dapat melempar pengecualian yang tidak diperiksa, terlepas dari apakah metode yang diganti melempar pengecualian atau tidak. Namun, metode pengganti tidak boleh melempar pengecualian yang diperiksa yang baru atau lebih luas daripada yang dideklarasikan oleh metode yang diganti. Metode pengganti dapat melempar pengecualian yang lebih sempit atau lebih sedikit daripada metode yang diganti.
Konstruktor tidak dapat diganti.
Menggunakan Kata Kunci super
Saat memanggil versi superkelas dari metode yang diganti, kata kunci super digunakan.
Contoh
Live Demo
class Animal { public void move() { System.out.println("Hewan dapat bergerak"); } } class Dog extends Animal { public void move() { super.move(); // memanggil metode superkelas System.out.println("Anjing dapat berjalan dan berlari"); } } public class TestDog { public static void main(String args[]) { Animal b = new Dog(); // Animal reference but Dog object b.move(); // runs the method in Dog class } } Ini akan menghasilkan hasil berikut:
Keluaran
Hewan dapat bergerak Anjing dapat berjalan dan berlari