Abstract Class vs Interface di Java
Dalam pemrograman Java, terdapat dua konsep yang sering digunakan untuk mencapai abstraksi, yaitu abstract class dan interface. Kedua konsep ini memiliki kemiripan, namun memiliki perbedaan yang signifikan.
Abstract Class
Abstract Class adalah kelas yang tidak dapat diinstansiasi (tidak dapat dibuat objeknya). Abstract class dapat berisi method abstract (method yang hanya memiliki deklarasi tanpa implementasi) dan method konkrit (method yang memiliki implementasi).
Kegunaan Abstract Class:
- Menyediakan template untuk kelas turunan: Abstract class mendefinisikan struktur dan perilaku dasar yang dapat digunakan oleh kelas turunan.
- Mempromosikan reusability: Kelas turunan dapat mewarisi method dan variabel dari abstract class.
- Membatasi instansiasi: Abstract class tidak dapat diinstansiasi, memaksa kelas turunan untuk mengimplementasikan method abstract.
Contoh Abstract Class:
abstract class Shape {
int sides;
abstract double calculateArea();
void display() {
System.out.println("Ini adalah bentuk geometri.");
}
}
class Square extends Shape {
int side;
Square(int side) {
this.side = side;
this.sides = 4;
}
@Override
double calculateArea() {
return side * side;
}
}
public class Main {
public static void main(String[] args) {
Square square = new Square(5);
System.out.println("Luas persegi: " + square.calculateArea());
}
}
Interface
Interface adalah tipe data yang mendefinisikan serangkaian method abstract tanpa implementasi. Interface tidak dapat diinstansiasi dan tidak memiliki variabel anggota (instance variable).
Kegunaan Interface:
- Mendefinisikan kontrak: Interface mendefinisikan kontrak yang harus diimplementasikan oleh kelas yang mengimplementasikannya.
- Mencapai polymorphism: Interface memungkinkan untuk menggunakan berbagai implementasi dari kelas yang berbeda dengan cara yang sama.
- Multiple inheritance: Sebuah kelas dapat mengimplementasikan beberapa interface, memungkinkan kelas tersebut mewarisi perilaku dari berbagai sumber.
Contoh Interface:
interface Drawable {
void draw();
}
class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Menggambar lingkaran.");
}
}
class Rectangle implements Drawable {
@Override
public void draw() {
System.out.println("Menggambar persegi panjang.");
}
}
public class Main {
public static void main(String[] args) {
Drawable circle = new Circle();
Drawable rectangle = new Rectangle();
circle.draw();
rectangle.draw();
}
}
Perbedaan Utama:
Fitur | Abstract Class | Interface |
---|---|---|
Instansiasi | Tidak dapat diinstansiasi | Tidak dapat diinstansiasi |
Method | Dapat berisi method abstract dan konkrit | Hanya berisi method abstract |
Variabel anggota | Dapat memiliki variabel anggota | Tidak memiliki variabel anggota |
Pewarisan | Diwariskan menggunakan keyword extends |
Diimplementasikan menggunakan keyword implements |
Multiple Inheritance | Tidak mendukung multiple inheritance | Mendukung multiple inheritance |
Konstruktor | Dapat memiliki konstruktor | Tidak dapat memiliki konstruktor |
Kapan Menggunakan Abstract Class vs Interface:
- Gunakan abstract class jika Anda ingin memberikan template dasar dan beberapa implementasi untuk kelas turunan.
- Gunakan interface jika Anda ingin mendefinisikan kontrak untuk kelas yang berbeda dan mencapai polymorphism.
Pilihlah abstract class atau interface berdasarkan kebutuhan dan tujuan desain Anda.