Saat kita membuat sebuah superclass, kita tahu bahwa kita dapat menurunkan semua metode yang dimilikinya pada class anaknya.
Atau kalau kita butuh metode tersebut diperbarui, kita tinggal rrelakukan override pada metode tersebut pada subclassnya.
Tapi ada kasus dimana ada satu/lebih metode saja yang harus dioverride.

inheritance
Misalkan method bersuara()
pada class Binatang (contoh pertemuan kemarin)
Method bersuara seharusnya dioverride karena tidak memiliki bentuk di class binatang (tergantung jenis binatangnya)
Untuk membuat method bersuara harus dioverrice, maka method tersebut perlu dibuat menjadi abstract.
Penulisan abstract method adalah sebagai berikut: public abstract String bersuara();
Untuk selanjutnya, method ini disebut sebagai abstract method atau prototype method
Dapat kita lihat bahwa method bersuara:
- tidak memiliki
tubuh / implementasi method
.
- menggunakan keyword abstract.
Jika kita paksa untuk memiliki tubuh program seperti ini:
public abstract String bersuara(){
System.out.println(“weee..”);
}
Maka akan terjadi error abstract methods cannot have a body
Bila abstract method bersuara tadi kita tambahkan ke class Binatang yang sudah kita buat, maka akan muncul error:
Binatang is not abstract and does not override abstract method bersuara() in binatang
Solusinya adalah dengan mengubah class Binatang menjadi sebuah abstract class. Bila ada abstract methods dalam satu class, maka class tersebut harus abstract juga.
abstract class Binatang{
public abstract String bersuara();
public voide makan(int x){
System.out.println(“Makan makan”);
}
}

Abstract class ini tidak bisa diinstansiasi (korena memiliki method yang abstract)
Questions:
- Apakah dalam sebuah abstract class boleh tak memiliki abstract methods sama sekali?
- Bagaimana iika sebuah abstract class memiliki constructor?
- Bagaimana fungsi dan pemakaian constructor tersebut?
Constructor Class Abstract
public abstract class TestEngine{
private String engineId;
private String engineName;
public TestEngine(String engineId, String engineName){
this.engineId = engineId;
this.engineName = engineName;
}
//getter & settter
public abstract void scheduleTest();
}
public class JavaTestEngine extends TestEngine{
private String typeName;
public JavaTestEngine(String engineId, String engineName, String typeName){
super(engineId, engineName);
this.typeName = typeName;
}
public void scheduleTest(){
//todo something
}
}
Setiap class dalam Java pasti memiliki konstruktor secara default!
Contoh Salah Implementasi Class Abstract
public abstract class KelasAbstract{
public KelasAbstract(){
tulis("Aku berada di "+this.getClass());
}
publicvoid tulis(String teks){
System.out.println(teks);
}
} //di kelas ini tidak ada method abstract
public class ImplementasiAbstract extends KelasAbstract{
public ImplementasiAbstract(){
super.tulis("Aku ada di kelas ImplementasiAbstract");
}
}
Contoh Benar Implementasi Class Abstract
public abstract class KelasAbstract{
public KelasAbstract(){
tulis("Aku berada di "+this.getClass());
}
publicvoid tulis(String teks){
System.out.println(teks);
}
abstract vlid methodAbstract();
}
public class ImplementasiAbstract extends KelasAbstract{
public ImplementasiAbstract(){
super.tulis("Aku ada di kelas ImplementasiAbstract");
}
public void methodAbstract(){
super.tulis("Method abstract kelas induk sudah didefinisikan ulang");
}
}
Ingat!
- Kelas yang memiliki method yang dideklarasikan sebagai abstract haruslah juga dideklarasikan sebagai Kelas abstract.
- Sebuah kelas dapat dideklarasikan abstract tanpa harus memiliki method abstract.
Contoh Lain
abstract class AAA{
//fungsi abstract "callme()" tanpa implementasi
abstract void callme();
//fungsi dengan implementasi tetap dibolehkan
//dalam kelas abstract
public void callmetoo(){
System.out.println("ini fungsi test")
}
}
class BBB extends AAA{
//implementasi dari fungsi callme() pada kelas abstract AAA
void callme(){
System.out.println("implementasi fungsi callme di kelas BBB");
}
}
class abstractdemo{
public static void main(String args[]){
BBB varBBB = new BBB();
varBBB.callme();
varBBB.callmetoo();
}
}
Interface bisa saja terdiri dari kumpulan fungsi atau konstanta yang tidak berisi implementasi
Contoh:
public interface Mp3Player{
public static final int STATUS; //deklarasi final dan static
List TRACKLIST;
void playTract();
void stopTract();
void volumeUp();
void volumeDown();
}
Mengapa dibutuhkan interface? dalam bahasa pemrograman lain seperti C++, dikenal istilah multiple-inheritance, artinya sebuah object bisa diturunkan dari dua atau lebih object berbeda. Misalnya, object X memiliki super kelas A dan B.
Pada Java, hal ini tidak dimungkinkan, karena object hanya bisa extends dari 1 object saja, dan disinilah interface Java menjadi solusinya.
Sebagaimana telah disebutkan sebelumnya bahwa class Interface bisa saja terdiri dari kumpulan deklarasi fungsi/method untuk diimplementasikan di class lain, jadi hanya deklarasi method tidak ada definisi method, artinya method tersebut tidak memiliki tubuh fungsi. Artinya semua method dalam class Interface adalah abstract. Tapi saat deklarasi tidak perlu menggunakan keyword abstract.
Tujuan dari abstraksi adalah untuk membuat suatu class bisa diimplementasikan ke class lainnya tanpa relasi sama sekali.
Contoh:
public interface Camera{
public void setPixel(float pixel);
public void ambilGambar();
}
Interface digunakan untuk mendukung multiple inheritance (satu class memiliki superclass lebih dari satu). Selain itu, bisa juga mendeklarasikan method abstract, di dalam interface juga dapat diberikan attribute final (konstanta). Konstanta ini juga diwariskan kepada class yang mengimplementasikan interface tersebut.
Suatu interface juga dapat mewarisi interface yang lain, seperti pewarisan biasa, Contoh.
public interface NamaInterface extends InterfaceA, InterfaceB{
//todo something
}
Class yang mengimplementasikan suatu interface harus mendeklarasikan seluruh method yang ada di interface, jika tidak maka class tersebut harus dideklarasikan sebagai sebuah abstract class.
Aturan Interface
Kelas yang mengimplementasikan interface, hanya mewarisi konstanta di kelas interface, tidak seperti kelas turunan yang menurunkan semuanya, entah itu variable maupun methodnya.
Kelas yang mengimplementasikan interface tidak mewarisi method yang bukan interface, yakni kelas yang memiliki implementasi pada kelas interface.
Pada kelas turunan, akan diwarisi semua fungsi yang ada baik yang abstract maupun yang ada implementasinya pada superclassnya.
Hirarki kelas independen, yaitu kelas interface dengan kelas yang mengimplementasikannya bisa saling tidak berelasi.
Interface vs Abstract
Penggunaan keyword extends dan implements adalah salah satu perbedaan dari keduanya.
Semua methods di Interface itu Abstract, tapi hanya beberapa atau mungkin hanya satu methods yang Abstract di Abstract class.
Abstract class bisa mengimplementasikan Interface, tapi Interface tidak bisa mewarisi Abstract class.
Abstract dapat mendeklarasikan variable instant, Interface hanya dapat berupa konstanta.