Kelas Abstrak vs Antarmuka
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 38 dari 87.
Sekarang setelah kamu memahami abstract class dan interface, muncul pertanyaan umum: kapan sebaiknya kamu menggunakan yang satu daripada yang lain? Pilihannya bergantung pada hal yang ingin kamu modelkan.
Gunakan abstract class saat beberapa class memiliki dasar umum dengan state atau perilaku yang sama. Abstract class dapat memiliki variabel instance, konstruktor, serta gabungan method abstract dan konkret:
public abstract class Animal {
protected String name; // keadaan bersama
public Animal(String name) {
this.name = name;
}
public void sleep() { // perilaku bersama
System.out.println(name + " is sleeping");
}
public abstract void makeSound(); // harus diimplementasikan
}Gunakan interface saat kamu ingin mendefinisikan kemampuan yang dapat digunakan bersama oleh class yang tidak terkait. Interface berfokus pada apa yang dapat dilakukan object, bukan pada wujudnya:
public interface Flyable {
void fly();
}
// Class yang tidak saling terkait dapat memiliki kemampuan ini
class Bird extends Animal implements Flyable { ... }
class Airplane implements Flyable { ... }
class Drone implements Flyable { ... }Berikut perbandingan singkat:
| Fitur | Abstract Class | Interface |
|---|---|---|
| Variabel instance | Ya | Hanya konstanta |
| Konstruktor | Ya | Tidak |
| Multiple inheritance | Tidak (single extends) | Ya (multiple implements) |
| Modifier akses | Apa saja | Hanya public (untuk method abstrak) |
Pedoman praktis: jika kamu membuat class abstrak yang hanya memiliki method abstrak dan tidak memiliki keadaan, interface kemungkinan merupakan pilihan yang lebih baik.
Tantangan
MudahMari kita buat sistem kendaraan yang menunjukkan kapan harus menggunakan class abstrak dan kapan harus menggunakan antarmuka. Kamu akan memodelkan kendaraan yang memiliki state dan perilaku umum melalui class abstrak, serta menambahkan kemampuan opsional melalui antarmuka.
Kamu akan menyusun kodemu dalam lima file:
Vehicle.java: Buat class abstrak sebagai fondasi untuk semua kendaraan. Setiap kendaraan memiliki fieldbrand(String) dan fieldyear(int). Sertakan constructor untuk menginisialisasi kedua field, method getter untuk masing-masing field, dan method abstrakstartEngine()yang mengembalikan String. Tambahkan juga method konkretgetInfo()yang mengembalikan:[brand] ([year]). Ini adalah kasus penggunaan yang tepat untuk class abstrak: kendaraan memiliki state yang sama (brand, year) dan beberapa perilaku yang sama (getInfo), tetapi setiap kendaraan menyalakan mesin dengan cara berbeda.Convertible.java: Definisikan antarmuka untuk kendaraan yang bisa membuka dan menutup atap. Kemampuan ini tidak terkait dengan apa hakikat sebuah kendaraan, melainkan sesuatu yang bisa dilakukan oleh kendaraan tertentu. Deklarasikan dua method:openRoof()dancloseRoof(), yang keduanya mengembalikan String.Car.java: Buat class yang mewarisiVehicledan mengimplementasikanConvertible. Car memiliki field tambahannumDoors(int). Gunakansuperuntuk menginisialisasi field yang diwarisi. ImplementasikanstartEngine()agar mengembalikan:[brand] car engine started. ImplementasikanopenRoof()agar mengembalikan:[brand] roof opening, dancloseRoof()agar mengembalikan:[brand] roof closing.Motorcycle.java: Buat class yang mewarisiVehicle, tetapi TIDAK mengimplementasikanConvertible: sepeda motor tidak memiliki atap! Motorcycle memiliki fieldhasSidecar(boolean). ImplementasikanstartEngine()agar mengembalikan:[brand] motorcycle engine roaring.Main.java: Gabungkan semuanya untuk menunjukkan perbedaan antara class abstrak dan antarmuka. Kamu akan menerima empat input: merek mobil, tahun mobil, merek sepeda motor, dan tahun sepeda motor.Buat Car (dengan 4 pintu) dan Motorcycle (tanpa sespan). Pertama, tunjukkan perilaku class abstrak yang sama dengan mencetak
getInfo()untuk kedua kendaraan. Keduanya mewarisi perilaku ini dari Vehicle. Lalu, cetak hasilstartEngine()untuk masing-masing kendaraan. Perhatikan bagaimana setiap tipe kendaraan mengimplementasikan fungsi ini dengan cara berbeda.Terakhir, tunjukkan kemampuan dari antarmuka: karena hanya Car yang mengimplementasikan
Convertible, panggil dan cetakopenRoof(), lalucloseRoof(), hanya untuk Car.
Kamu akan menerima empat input: merek mobil (String), tahun mobil (int), merek sepeda motor (String), dan tahun sepeda motor (int).
Output-mu harus terdiri dari enam baris. Perhatikan bahwa kedua kendaraan memiliki state dan method getInfo() yang sama dari class abstrak, tetapi hanya Car yang memiliki kemampuan atap terbuka. Ini menunjukkan kapan sebaiknya menggunakan masing-masing pendekatan!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String carBrand = scanner.nextLine();
int carYear = scanner.nextInt();
scanner.nextLine(); // lewati karakter baris baru
String motorcycleBrand = scanner.nextLine();
int motorcycleYear = scanner.nextInt();
// TODO: Buat Car dengan 4 pintu
// TODO: Buat Motorcycle tanpa sespan (false)
// TODO: Cetak getInfo() untuk kedua kendaraan (menunjukkan perilaku class abstrak yang sama)
// TODO: Cetak startEngine() untuk kedua kendaraan (menunjukkan implementasi yang berbeda)
// TODO: Cetak openRoof() dan closeRoof() hanya untuk mobil (menunjukkan kemampuan antarmuka)
}
}
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