Java - Mengganti
Pada bab sebelumnya, kita telah membahas tentang superclass dan subclass. Jika suatu kelas mewarisi metode dari superkelasnya, maka ada peluang untuk menimpa metode tersebut asalkan tidak ditandai sebagai final.
Manfaat dari override adalah:kemampuan untuk mendefinisikan perilaku yang spesifik untuk tipe subclass, yang berarti subclass dapat mengimplementasikan metode parent class berdasarkan kebutuhannya.
Dalam istilah berorientasi objek, mengesampingkan berarti mengesampingkan fungsionalitas metode yang ada.
Contoh
Mari kita lihat sebuah contoh.
Demo Langsung
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
}
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
Animals can move
Dogs can walk and run
Pada contoh di atas, Anda dapat melihat bahwa meskipun b adalah jenis Hewan yang menjalankan metode pindah di kelas Anjing. Alasannya adalah:Pada waktu kompilasi, pemeriksaan dilakukan pada tipe referensi. Namun, dalam runtime, JVM mengetahui tipe objek dan akan menjalankan metode yang dimiliki objek tersebut.
Oleh karena itu, pada contoh di atas, program akan dikompilasi dengan benar karena kelas Hewan memiliki metode pindah. Kemudian, pada saat runtime, ia menjalankan metode khusus untuk objek tersebut.
Perhatikan contoh berikut
Contoh
Demo Langsung
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
public void bark() {
System.out.println("Dogs can bark");
}
}
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 memberikan kesalahan waktu kompilasi karena jenis referensi b Hewan tidak memiliki metode dengan nama kulit.
Aturan untuk Penggantian Metode
-
Daftar argumen harus sama persis dengan metode yang diganti.
-
Tipe pengembalian harus sama atau subtipe dari tipe pengembalian yang dideklarasikan dalam metode asli yang diganti di superclass.
-
Tingkat akses tidak boleh lebih ketat daripada tingkat akses metode yang diganti. Sebagai contoh:Jika metode superclass dideklarasikan publik maka metode overridding di subclass tidak dapat berupa private atau protected.
-
Metode instance dapat diganti hanya jika diwarisi oleh subkelas.
-
Metode yang dinyatakan final tidak dapat diganti.
-
Metode yang dideklarasikan statis tidak dapat diganti tetapi dapat dideklarasikan ulang.
-
Jika suatu metode tidak dapat diwariskan, maka metode tersebut tidak dapat diganti.
-
Subkelas dalam paket yang sama dengan superkelas instance dapat mengganti metode superkelas apa pun yang tidak dinyatakan pribadi atau final.
-
Subkelas dalam paket yang berbeda hanya dapat menimpa metode non-final yang dideklarasikan publik atau dilindungi.
-
Metode override dapat membuang pengecualian apa pun yang tidak dicentang, terlepas dari apakah metode yang diganti melempar pengecualian atau tidak. Namun, metode override tidak boleh membuang pengecualian yang dicentang yang baru atau lebih luas daripada yang dideklarasikan oleh metode yang diganti. Metode penggantian dapat membuang pengecualian yang lebih sempit atau lebih sedikit daripada metode yang diganti.
-
Konstruktor tidak dapat diganti.
Menggunakan Kata Kunci super
Saat memanggil versi superclass dari metode yang diganti, super kata kunci digunakan.
Contoh
Demo Langsung
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
super.move(); // invokes the super class method
System.out.println("Dogs can walk and run");
}
}
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
Animals can move
Dogs can walk and run