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

Java
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}
Keluaran
persegi panjang dengan luas 15.0
segitiga dengan luas 12.0
  • Kelas abstract tidak bisa dibuat objeknya langsung: new Bentuk("x") ditolak kompiler.
  • Metode abstract tidak 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.

Java
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}
Keluaran
Tunai: Dibayar Rp85000 dari tagihan Rp85000
DompetDigital: Dibayar Rp76500 dari tagihan Rp85000
  • Metode di interface secara bawaan bersifat public dan abstrak, sehingga implementasinya juga harus public.
  • Metode default punya 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 atau interface?
Kelas abstrakInterface
Banyak indukHanya satu extendsBoleh banyak implements
Atribut dan konstruktorBolehHanya konstanta, tanpa konstruktor
Kapan dipakaiSubclass berbagi data dan kode yang samaKelas-kelas berbeda jenis yang perlu kemampuan sama
ContohBentuk dengan atribut namaPembayaran, 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.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Java online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi