Rabu, 30 Maret 2016

Abstract Class vs Interface

Assalamu'alaikum kawan~
Lama tidak berjumpa hihi
Kali ini saya mau memposting materi kawan. Ada yang tau Abstract class dan interface dalam bahasa pemrograman java? Nah apakah kalian tau apa saja perbedaan mereka? Ok, kalau ingin tau simak dulu post berikut. Selamat membaca~

Sebelum ke materi kita adain pretest dulu yuk. Haha biar panas dan greget wkwkw
Pretest Abstract Class dan Inheritance
Soal:
1. Jelaskan apa itu abstract class dan interface!
2. Jelaskan menurut Anda apa saja perbedaan yang paling menonjol antara abstract class dan interface!
3. Jelaskan keyword-keyword berikut:
    a. abstract method
    b. extends
    c. implements
    d. override
    e. public
    f. protected
    g. private
    h. parent class
    i. child class
    j. this

Nah ini nih jawabannya 
Jawaban Pretest Abstract Class dan Inheritance
1. - Abstract class didefinisikan sebagai class yang tidak bisa digunakan untuk membuat object.
   - Interface adalah prototype kelas yang berisi definisi konstanta dan deklarasi method (hanya nama method tanpa definisi kode programnya).
2. Perbedaan
- Abstract Class : Bisa berisi abstract dan non-abstract method, kita harus menuliskan sendiri modifiernya, suatu abstact class hanya bisa meng-extend satu abstract class lainnya dan meng-implement beberapa interface, serta bisa mendeklarasikan constant dan instance variable.
- Interface : Hanya boleh berisi abstract method, ita tidak perlu susah2 menulis public abstract di depan nama method. Karena secara implisit, modifier untuk method di interface adalah public dan abstract, suatu interface hanya bisa meng-extend interface lainnya.  Dan tidak bisa meng-implement class atau interface lainnya serta Hanya bisa mendeklarasikan constant.  Secara implisit variable yang dideklarasikan di interface bersifat public, static dan final.
3.
a. Abstract method : method yang tidak memiliki body (hanya deklarasi method)
b. extends : sebuah Java Keyword yang digunakan dalam sebuah deklarasi kelas untuk menentukan superclass; digunakan dalam deklarasi interface untuk menentukan satu atau lebih superinterfaces.
c. implements : fitur bahasa yang memungkinkan subclass atau anak kelas untuk memberikan implementasi khusus dari metode yang sudah disediakan oleh salah satu superclasses atau kelas induk.ebuah Java Keyword yang termasuk dalam sebuah deklarasi kelas untuk menentukan satu atau lebih interface yang diimplementasikan oleh kelas saat ini.
d. override : fitur bahasa yang memungkinkan subclass atau anak kelas untuk memberikan implementasi khusus dari metode yang sudah disediakan oleh salah satu superclasses atau kelas induk.
e. public : sebuah Java Keyword yang digunakan dalam deklarasi metode, kelas, atau bidang, kelas umum, metode, dan bidang dapat diakses oleh anggota dari setiap kelas.
f. protected : sebuah Java Keyword yang digunakan dalam pembagian lapangan, metode, atau kelas batin; anggota yang dilindungi dan hanya dapat diakses oleh anggota kelas mereka sendiri, bahwa kelas itu subclass atau kelas yang sama.
g. private : sebuah Java Keyword yang digunakan dalam pembagian lapangan, metode, atau kelas batin; anggota swasta hanya dapat diakses oleh anggota lain dari kelas mereka sendiri.
h. parent class : Class yang mempunyai class turunan
i. child class : class turunan dari parent class
j. this : sebuah Java Keyword yang digunakan untuk mewakili sebuah instance dari kelas di mana ia muncul.

Oke untuk mengetahui dengan baik perbedaan antara abstract class dan interface, kita adain pengamatan dulu yuk..

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected String getValue();
    abstract protected String prefixValue(String prefix);

    // Common method
    public void printOut() {
        System.out.println( this.getValue() );
    }
}

class ConcreteClass1 extends AbstractClass
{   
    protected String getValue() {
        return "ConcreteClass1";
    }

    public String prefixValue(String prefix) {
        return prefix + "ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public String getValue() {
        return "ConcreteClass2";
    }

    public String prefixValue(String prefix) {
        return prefix + "ConcreteClass2";
    }
}

class Main
{
    public static void main(String args[]) {
        ConcreteClass1 class1 = new ConcreteClass1();
        class1.printOut();
        System.out.println( class1.prefixValue("FOO_") );
   
        ConcreteClass2 class2 = new ConcreteClass2();
        class2.printOut();
        System.out.println( class2.prefixValue("FOO_") );
    }
}

Pengamatan1:
1. Bolehkah ditambahkan body "{statement1; statement1;}" pada method getValue ataupun method prefixValue pada class abstract AbstractClass? Jelaskan!
2. Kembalikan program seperti semula, jelaskan error apa yang terjadi apabila method getValue() pada class ConcreteClass1 di hapus!
3. Kembalikan program seperti semula, selanjutnya perhatikan perbedaan hak akses method getValue() di child class ConcreteClass1 dan ConcreteClass2! Jelaskan apa maksudnya!
4. Buatlah abstract method yang bernama getValue2 pada class ConcreteClass1! Compile dan mengapa terjadi error?
5. Ikuti soal nomor 4, silahkan ubah class ConcreteClass1 menjadi abstract. Selajutnya jelaskan mengapa terjadi error?
6. Dengan mengikuti struktur kode program di atas serta ditambahkan satu abstract method bernama "gabung" TANPA PARAMETER pada parent class, hasilkan output berikut:
    Tatank
    Mr. Tatank
    Mr. Tatank hobi meloncat
   
    Kells
    Mrs. Kells
    Mrs. Kells hobi melet   

Jawaban Tugas Pengamatan1
1. Tidak boleh. Karena method getValue dan method prefikValue merupakan method abstract, yakni method yang tidak memiliki body method.
2. Eror. Karena getValue merupakan method abstract, sehingga wajib diturunkan/di-overriding ke class childnya.
3. Pada method getValue di class ConcreteClass1 memiliki hak akses "protected", ini artinya method ini hanya dapat diakses di class itu sendiri/subclassnya.
Sedangkan pada class ConcreteClass2 menggunakan hak akses "public" maka dapat  diakses oleh semua anggota di class
4. Karena method getValue2 tidak ada di parent class abstractnya (AbstractClass).
5. Karena suatu abstact class hanya bisa meng-extend satu abstract class lainnya. Disitu AbstractClass sudah meng-extend 2 kelas berbeda yakni abstract class ConcreteClass1 dan konkret class ConcreteClass2. Jika child class tersebut bukan abstract maka bisa.

interface Mobil
{
    public void setMerk(String merk);
    public String getMerk();
}

interface Mesin extends Mobil
{
    public void setNoMesin(String nomor_mesin);   
    public String getNoMesin();
}


// This will work
class Mobil1 implements Mesin
{
    private String merk, nomor_mesin;
   
    public void setMerk(String merk){
        this.merk = merk;
    }
   
    public String getMerk(){
        return merk;
    }
   
    public void setNoMesin(String nomor_mesin){
        this.nomor_mesin = nomor_mesin;
    }
   
    public String getNoMesin(){
        return nomor_mesin;
    }
}

// This will not work and result in a fatal error
class Mobil2 implements Mesin
{
    private String nomor_mesin;
   
    public void setNoMesin(String nomor_mesin){
        this.nomor_mesin = nomor_mesin;
    }
   
    public String getNoMesin(){
        return nomor_mesin;
    }
}

class Main{
    public static void main(String[] args){
        Mobil1 m1 = new Mobil1();
        m1.setMerk("Ford");
        m1.setNoMesin("01010");
        System.out.println( m1.getMerk() );
        System.out.println( m1.getNoMesin() );
    }
}

Pengamatan2:
1. Compile kode program diatas dan jelaskan sebab error yang terjadi!
2. Tambahkan method yang diperlukan untuk mengatasi error yang terjadi (No. 1)!
3. Perhatikan soal 1 (abstract) dan soal 2 ini (interface) dan lakukan poin-poin berikut:
    - Apa yang terjadi apabila ditambahkan method biasa yang mengandung body "{}" pada interface Mobil? Jelaskan!
    - Jelaskan perbedaan body program antara class abstract dan interface!
    - Jelaskan perbedaan penggunaan extends antara soal 1 dan soal 2!

Jawaban Tugas Pengamatan2
1. Eror pada class Mobil2. Karena Mobil2 tidak mengimplementasi semua method dari interface yang menjadi parent classnya. Hanya 2 method saja yang diimplementasi.
3.
- Eror. Karena semua method yang ada di interface haruslah method abstract, yakni yang tidak memiliki body of method "{}"
- Jika pada abstract class body programnya tidak harus semua methodnya abstract, konnkret boleh. Lalu di abstract class modifier abstract harus ditulis.
Jika di interface semua methodnya harus abstract, dan tak perlu ditulis manual modifier-nya. Karena akan secara otomatis tercatat di program javanya.
- Soal no 1 (abstract class) penggunaan extends hanya boleh dilakukan ke class konkret. Jika ingin meng-extend sesama class abstract maka hanya diperbolehkan satu.
Soal no 2 (interface) penggunaan extends dapat dilakukan ke sesama interface lebih dari satu.

Well, demikian materi yang bisa saya sampaikan. Semoga bermanfaat kawan. Jaa~
Wassalamu'alaikum