Pelajaran modul (1/2)
Antarmuka
Meskipun kelas abstrak dapat berisi kode yang diimplementasikan sebagian dan bidang instance, antarmuka di Java adalah kontrak perilaku murni. Sebuah antarmuka mendefinisikan apa yang harus dapat dilakukan suatu kelas, tetapi tidak mendefinisikan bagaimana ia melakukannya.
Hal ini memungkinkan pemisahan menyeluruh antara definisi operasi dan implementasi aktualnya.
Mendefinisikan Antarmuka (interface)
Kami menggunakan kata kunci interface. Semua metode yang dideklarasikan dalam antarmuka secara implisit adalah public dan abstract (tidak perlu ditentukan):
interface Drivable {
void startEngine();
void stopEngine();
}Menerapkan Antarmuka (implements)
Sebuah kelas mengimplementasikan antarmuka menggunakan kata kunci implements dan diharuskan menyediakan implementasi (dengan isi) untuk semua metode yang ditentukan:
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}Keuntungan Antarmuka
- Pewarisan Berganda: Di Java, sebuah kelas dapat memperluas hanya satu kelas induk (warisan tunggal), namun dapat mengimplementasikan beberapa antarmuka secara bersamaan.
Java
class HybridCar implements Drivable, Chargeable { ... } - Decoupling: Anda dapat mendefinisikan variabel menggunakan tipe antarmuka. Objek apa pun yang mengimplementasikan antarmuka tersebut dapat ditugaskan ke variabel tersebut.
Java
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
Konstanta di Antarmuka
Di antarmuka, dimungkinkan untuk mendeklarasikan bidang. Bidang ini secara implisit adalah public static final (artinya konstanta kelas), meskipun Anda tidak menentukan pengubah ini. Oleh karena itu, mereka harus diinisialisasi segera setelah deklarasi:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitly public static final
}Metode Bawaan (default)
Mulai dari Java 8, dimungkinkan untuk mendefinisikan metode dengan implementasi default di dalam antarmuka menggunakan kata kunci default. Metode ini tidak memaksa kelas pelaksana untuk menimpanya, sehingga memberikan perilaku fallback:
interface Logger {
void log(String message);
// Default method with a body
default void logError(String message) {
log("ERROR: " + message);
}
}Cobalah sendiri
Buat antarmuka Flyable dengan metode void fly(). Kemudian implementasikan kelas Bird yang mengimplementasikan Flyable dan mencetak Flying ke layar.
Tunjukkan petunjuk
Di Flyable, tulis `void fly();`. Di kelas Bird, implementasikan metode yang menandainya dengan `@Override public void fly() { System.out.println('Flying'); }`.
Solusi tersedia setelah 3 upaya
Tentukan antarmuka Drawable dengan metode void draw(). Kemudian implementasikan kelas Rectangle yang mengimplementasikan Drawable dan mencetak Drawing Rectangle.
Tunjukkan petunjuk
Tentukan `void draw();` di antarmuka. Di Rectangle, gunakan `@Override public void draw() { System.out.println('Drawing Rectangle'); }`.
Solusi tersedia setelah 3 upaya
Lengkapi antarmuka Swimmable dengan mendefinisikan metode void swim(). Kemudian, selesaikan kelas Duck sehingga mengimplementasikan Flyable dan Swimmable, mencetak metode Flying in the fly() dan Swimming in the swim() metode.
Tunjukkan petunjuk
Deklarasikan `void swim();` di dalam Swimmable. Deklarasikan `kelas Bebek mengimplementasikan Flyable, Swimmable` dan mengimplementasikan kedua metode untuk mencetak string yang diminta.
Solusi tersedia setelah 3 upaya