Method overriding (Saat program berjalan)
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 29 dari 87.
Overloading method diselesaikan saat kompilasi, sedangkan overriding method menunjukkan polimorfisme saat runtime. Di sini, Java menentukan method mana yang akan dijalankan saat program benar-benar berjalan, berdasarkan tipe aktual object, bukan tipe yang dideklarasikan untuk variabel.
Kamu sudah mempelajari tentang method overriding di bab Inheritance. Yang membuatnya bersifat polimorfik adalah cara Java menanganinya saat reference milik parent menunjuk ke object milik child:
public class Animal {
public void speak() {
System.out.println("Some sound");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("Bark!");
}
}
public class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow!");
}
}Sekarang, amati apa yang terjadi saat kita menggunakan referensi bertipe induk:
Animal myPet = new Dog();
myPet.speak(); // output: Bark!
myPet = new Cat();
myPet.speak(); // output: Meow!Meskipun myPet dideklarasikan sebagai Animal, Java memanggil method yang telah dioverride berdasarkan tipe object sebenarnya saat program berjalan. Ini disebut dynamic method dispatch. JVM melihat tipe object yang sebenarnya, bukan tipe yang dinyatakan variabel.
Ini memungkinkan pola yang kuat seperti memproses berbagai object secara seragam:
Animal[] pets = {new Dog(), new Cat(), new Dog()};
for (Animal pet : pets) {
pet.speak(); // Setiap object memanggil versinya sendiri
}Polimorfisme saat program dijalankan memungkinkan kamu menulis kode fleksibel yang bekerja dengan tipe induk sambil otomatis menggunakan perilaku turunan yang tepat.
Tantangan
MudahMari bangun sistem notifikasi yang menunjukkan polimorfisme saat runtime. Kamu akan membuat hierarki jenis notifikasi dengan pemanggilan method yang sama menghasilkan output berbeda, bergantung pada jenis object sebenarnya saat runtime.
Kamu akan menyusun kodemu dalam empat file:
Notification.java: Buat class dasar yang digunakan bersama oleh semua notifikasi. Setiap notifikasi memiliki fieldrecipient(String). Sertakan constructor untuk menginisialisasinya, method getter, dan methodsend()yang mencetak:Sending notification to [recipient]EmailNotification.java: Buat class yang mewarisi Notification. Notifikasi email menambahkan fieldsubject. Gunakansuperuntuk inisialisasi induk. Override methodsend()agar mencetak:Emailing [recipient]: [subject]SMSNotification.java: Buat class lain yang mewarisi Notification. Notifikasi SMS menambahkan fieldphoneNumber. Overridesend()agar mencetak:Texting [phoneNumber] for [recipient]Main.java: Di sinilah polimorfisme saat runtime terlihat! Kamu akan menerima tiga input: nama penerima, subjek email, dan nomor telepon. Buat array berisi referensiNotificationyang memuat tiga object dalam urutan ini: Notification dasar, EmailNotification, dan SMSNotification (semuanya menggunakan penerima yang sama). Lalu, lakukan perulangan pada array dan panggilsend()pada setiap elemennya. Perhatikan bagaimana Java otomatis memanggil versi yang di-override dengan benar berdasarkan jenis sebenarnya dari setiap object!
Kamu akan menerima tiga input: nama penerima (String), subjek email (String), dan nomor telepon (String).
Output-mu harus menampilkan tiga baris. Setiap pemanggilan send() menghasilkan output yang berbeda, meskipun kamu memanggil method yang sama pada referensi Notification. Itulah cara kerja dispatch method dinamis!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String recipient = scanner.nextLine();
String subject = scanner.nextLine();
String phoneNumber = scanner.nextLine();
// TODO: Buat array berisi referensi Notification dengan 3 elemen
// Array tersebut harus berisi, sesuai urutan ini:
// 1. object Notification dasar
// 2. object EmailNotification
// 3. object SMSNotification
// Semuanya menggunakan penerima yang sama
// TODO: Lakukan perulangan pada array dan panggil send() untuk setiap elemen
// Ini menunjukkan polimorfisme saat program berjalan!
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online