Pewarisan dan Polimorfisme · Pelajaran 6 dari 10
Polimorfisme dan override
9 menit baca · BelajarCode
Polimorfisme artinya "banyak bentuk". Variabel bertipe superclass bisa menyimpan objek subclass apa pun, dan saat metodenya dipanggil, Java menjalankan versi milik objek sebenarnya.
Override
Subclass bisa mengganti (override) metode yang diwarisinya.
1class Bentuk {2 String nama() {3 return "bentuk";4 }56 double luas() {7 return 0;8 }9}1011class Persegi extends Bentuk {12 private double sisi;1314 Persegi(double sisi) {15 this.sisi = sisi;16 }1718 @Override19 String nama() {20 return "persegi";21 }2223 @Override24 double luas() {25 return sisi * sisi;26 }27}2829class Lingkaran extends Bentuk {30 private double r;3132 Lingkaran(double r) {33 this.r = r;34 }3536 @Override37 String nama() {38 return "lingkaran";39 }4041 @Override42 double luas() {43 return Math.round(Math.PI * r * r * 100) / 100.0;44 }45}4647public class Main {48 public static void main(String[] args) {49 Bentuk[] daftar = {new Persegi(4), new Lingkaran(3), new Persegi(2.5)};50 double total = 0;51 for (Bentuk b : daftar) {52 System.out.println(b.nama() + ": " + b.luas());53 total += b.luas();54 }55 System.out.println("Total luas: " + Math.round(total * 100) / 100.0);56 }57}persegi: 16.0 lingkaran: 28.27 persegi: 6.25 Total luas: 50.52
- Array bertipe
Bentuk[]berisi objek Persegi dan Lingkaran. b.luas()memanggil versi Persegi atau Lingkaran sesuai objeknya. Pemilihan ini terjadi saat program berjalan dan disebut dynamic dispatch.- Anotasi
@Overridememinta kompiler memeriksa bahwa metode itu memang mengganti metode induk. Salah ketik nama metode langsung ketahuan. Math.round(x * 100) / 100.0membulatkan ke dua angka desimal. Total luas juga dibulatkan, karena penjumlahan bilangan pecahan bisa menghasilkan angka seperti 50.519999999999996 akibat cara komputer menyimpan desimal.
Override atau overload?
| Override | Overload | |
|---|---|---|
| Di mana | Subclass mengganti metode superclass | Di kelas yang sama |
| Tanda tangan metode | Sama persis | Nama sama, parameter berbeda |
| Dipilih saat | Program berjalan | Kompilasi |
| Contoh | luas() di Persegi dan Lingkaran | cetak(int x) dan cetak(String s) |
Mengganti toString
Setiap kelas mewarisi toString() dari Object. Jika di-override, objek bisa langsung dicetak dengan println.
1class Mahasiswa {2 private String nama;3 private double ipk;45 Mahasiswa(String nama, double ipk) {6 this.nama = nama;7 this.ipk = ipk;8 }910 @Override11 public String toString() {12 return "Mahasiswa[" + nama + ", IPK " + ipk + "]";13 }14}1516public class Main {17 public static void main(String[] args) {18 System.out.println(new Mahasiswa("Sinta", 3.81));19 }20}Mahasiswa[Sinta, IPK 3.81]
Cek pemahaman
Variabel Bentuk b = new Lingkaran(3); lalu dipanggil b.luas(). Versi metode mana yang dijalankan?
Latihan
Hewan bersuara
Buat kelas Hewan dengan metode suara() yang mengembalikan "...". Buat subclass Kucing, Anjing, dan Ayam yang meng-override suara(). Simpan beberapa hewan dalam satu array dan cetak suaranya.
Pembahasan
1class Hewan {2 String suara() {3 return "...";4 }5}67class Kucing extends Hewan {8 @Override9 String suara() {10 return "Meong";11 }12}1314class Anjing extends Hewan {15 @Override16 String suara() {17 return "Guk guk";18 }19}2021class Ayam extends Hewan {22 @Override23 String suara() {24 return "Kukuruyuk";25 }26}2728public class Main {29 public static void main(String[] args) {30 Hewan[] kandang = {new Kucing(), new Ayam(), new Anjing(), new Hewan()};31 for (Hewan h : kandang) {32 System.out.println(h.getClass().getSimpleName() + ": " + h.suara());33 }34 }35}Kucing: Meong Ayam: Kukuruyuk Anjing: Guk guk Hewan: ...
Perulangan tidak perlu tahu jenis hewan masing-masing. Menambah jenis hewan baru cukup dengan membuat subclass baru, tanpa mengubah perulangannya.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Java online.