Menu
CoddyTech

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:

FiturAbstract ClassInterface
Variabel instanceYaHanya konstanta
KonstruktorYaTidak
Multiple inheritanceTidak (single extends)Ya (multiple implements)
Modifier aksesApa sajaHanya 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.

challenge icon

Tantangan

Mudah

Mari 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 field brand (String) dan field year (int). Sertakan constructor untuk menginisialisasi kedua field, method getter untuk masing-masing field, dan method abstrak startEngine() yang mengembalikan String. Tambahkan juga method konkret getInfo() 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() dan closeRoof(), yang keduanya mengembalikan String.
  • Car.java: Buat class yang mewarisi Vehicle dan mengimplementasikan Convertible. Car memiliki field tambahan numDoors (int). Gunakan super untuk menginisialisasi field yang diwarisi. Implementasikan startEngine() agar mengembalikan: [brand] car engine started. Implementasikan openRoof() agar mengembalikan: [brand] roof opening, dan closeRoof() agar mengembalikan: [brand] roof closing.
  • Motorcycle.java: Buat class yang mewarisi Vehicle, tetapi TIDAK mengimplementasikan Convertible: sepeda motor tidak memiliki atap! Motorcycle memiliki field hasSidecar (boolean). Implementasikan startEngine() 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 hasil startEngine() 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 cetak openRoof(), lalu closeRoof(), 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)
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online