Pewarisan dan Polimorfisme · Pelajaran 7 dari 10
Kelas abstrak dan interface
10 menit baca · BelajarCode
Pada pelajaran sebelumnya, Bentuk.luas() mengembalikan 0, padahal luas "bentuk" tanpa jenis tidak bermakna. Sebenarnya kita ingin berkata: setiap bentuk wajib punya cara menghitung luas, tetapi caranya ditentukan oleh subclass.
Kelas abstrak
1abstract class Bentuk {2 private final String nama;34 Bentuk(String nama) {5 this.nama = nama;6 }78 abstract double luas();910 String deskripsi() {11 return nama + " dengan luas " + luas();12 }13}1415class PersegiPanjang extends Bentuk {16 private final double p, l;1718 PersegiPanjang(double p, double l) {19 super("persegi panjang");20 this.p = p;21 this.l = l;22 }2324 @Override25 double luas() {26 return p * l;27 }28}2930class Segitiga extends Bentuk {31 private final double alas, tinggi;3233 Segitiga(double alas, double tinggi) {34 super("segitiga");35 this.alas = alas;36 this.tinggi = tinggi;37 }3839 @Override40 double luas() {41 return alas * tinggi / 2;42 }43}4445public class Main {46 public static void main(String[] args) {47 Bentuk[] daftar = {new PersegiPanjang(5, 3), new Segitiga(6, 4)};48 for (Bentuk b : daftar) {49 System.out.println(b.deskripsi());50 }51 }52}persegi panjang dengan luas 15.0 segitiga dengan luas 12.0
- Kelas
abstracttidak bisa dibuat objeknya langsung:new Bentuk("x")ditolak kompiler. - Metode
abstracttidak punya isi. Setiap subclass yang tidak abstrak wajib mengisinya. - Kelas abstrak tetap boleh punya atribut, konstruktor, dan metode biasa seperti
deskripsi().
Interface
Interface adalah kontrak murni: daftar metode yang harus dimiliki sebuah kelas. Sebuah kelas boleh mengimplementasikan banyak interface.
1interface Pembayaran {2 long bayar(long total);34 default String struk(long total) {5 return "Dibayar Rp" + bayar(total) + " dari tagihan Rp" + total;6 }7}89class Tunai implements Pembayaran {10 @Override11 public long bayar(long total) {12 return total;13 }14}1516class DompetDigital implements Pembayaran {17 private final int persenCashback;1819 DompetDigital(int persenCashback) {20 this.persenCashback = persenCashback;21 }2223 @Override24 public long bayar(long total) {25 return total - total * persenCashback / 100;26 }27}2829public class Main {30 public static void main(String[] args) {31 Pembayaran[] cara = {new Tunai(), new DompetDigital(10)};32 for (Pembayaran p : cara) {33 System.out.println(p.getClass().getSimpleName() + ": " + p.struk(85000));34 }35 }36}Tunai: Dibayar Rp85000 dari tagihan Rp85000 DompetDigital: Dibayar Rp76500 dari tagihan Rp85000
- Metode di interface secara bawaan bersifat
publicdan abstrak, sehingga implementasinya juga haruspublic. - Metode
defaultpunya isi dan otomatis dimiliki semua kelas yang mengimplementasikan interface. - Kode kasir cukup mengenal
Pembayaran. Menambah metode pembayaran baru tidak perlu mengubah kode kasir.
| Kelas abstrak | Interface | |
|---|---|---|
| Banyak induk | Hanya satu extends | Boleh banyak implements |
| Atribut dan konstruktor | Boleh | Hanya konstanta, tanpa konstruktor |
| Kapan dipakai | Subclass berbagi data dan kode yang sama | Kelas-kelas berbeda jenis yang perlu kemampuan sama |
| Contoh | Bentuk dengan atribut nama | Pembayaran, Comparable |
Cek pemahaman
Apa yang terjadi jika sebuah kelas implements Pembayaran tetapi tidak menulis metode bayar?
Latihan
Interface Dapat Diskon
Buat interface DapatDiskon dengan metode long hargaSetelahDiskon(). Implementasikan pada kelas ProdukBiasa (diskon 0) dan ProdukPromo (diskon persen tertentu). Hitung total keranjang berisi beberapa produk.
Pembahasan
1interface DapatDiskon {2 long hargaSetelahDiskon();3}45class ProdukBiasa implements DapatDiskon {6 private final long harga;78 ProdukBiasa(long harga) {9 this.harga = harga;10 }1112 @Override13 public long hargaSetelahDiskon() {14 return harga;15 }16}1718class ProdukPromo implements DapatDiskon {19 private final long harga;20 private final int persen;2122 ProdukPromo(long harga, int persen) {23 this.harga = harga;24 this.persen = persen;25 }2627 @Override28 public long hargaSetelahDiskon() {29 return harga - harga * persen / 100;30 }31}3233public class Main {34 public static void main(String[] args) {35 DapatDiskon[] keranjang = {new ProdukBiasa(25000), new ProdukPromo(80000, 25), new ProdukPromo(12000, 50)};36 long total = 0;37 for (DapatDiskon d : keranjang) {38 total += d.hargaSetelahDiskon();39 }40 System.out.println("Total belanja: Rp" + total);41 }42}Total belanja: Rp91000
25.000 + 60.000 + 6.000 = 91.000.
Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Java online.