Sabtu, 02 April 2016

PERBEDAAN ANTARA ABSTRACT CLASS DAN INTERFACE

4/02/2016 08:37:00 AM Posted by Adhitya Candra 2 comments

PERBEDAAN ANTARA ABSTRACT CLASS DAN INTERFACE


Kali ini saya akan memposting perbedaan antara abstract class dan interface,
sebelum masuk ke perbedaan kita pahami dulu apa itu INTERFACE DAN ABSTRACT CLASS.

Abstract Class merupakan Class yang khusus dibuat untuk keperluan inheritance. Tujuan dari pembuatan abstract class ini ialah untuk membuat definisi umum bagi class-class yang akan menjadi turunan darinya. Abstract Class dapat digunakan untuk mendefinisikan method yang nantinya akan diimplementasi di Derived Class (kelas turunan / inherit dari Abstract Class ).

 Interface adalah kumpulan method yang hanya memuat deklarasi dan struktur method, tanpa detail implementasinya. Sedangkan detail dari method berada pada class yang mengimplementasikan interface tersebut. Interface digunakan jika ingin mengaplikasikan suatu method yang spesifik, yang tidak diperoleh dari proses inheritance. Tipe data yang boleh pada interface hanya tipe data konstan.

Selanjutnya perbedaannya saya tidak akan menjabarkan lewat kalimat tetapi saya akan jabarkan menurut point pointnya agar mudah untuk dipahami oleh teman teman pembaca blog ini, mari diperhatikan ya... :)

Abstract ClassInterface
Bisa berisi abstract dan non-abstract method.Hanya boleh berisi abstract method.
Kita harus menuliskan sendiri modifiernya.Kita tidak perlu susah2 menulis public abstract di depan nama method. Karena secara implisit, modifier untuk method di interface adalah public danabstract.
Bisa mendeklarasikan constant dan instance variable.Hanya bisa mendeklarasikan constant.  Secara implisit variable yang dideklarasikan di interface bersifatpublicstatic dan final.
Method boleh bersifat static.Method tidak boleh bersifat static.
Method boleh bersifat final.Method tidak boleh bersifat final.
Suatu abstact class hanya bisa meng-extend satu abstract class lainnya.Suatu interface bisa meng-extend  satu atau lebih interface lainnya.
Suatu abstract class hanya bisa meng-extend satu abstract class dan meng-implement beberapa interface.Suatu interface hanya bisa meng-extend interface lainnya.  Dan tidak bisa meng-implement class atau interface lainnya.

Nah seperti penjelasan yang saya berikan mudahkan untuk dipahami apa perbedaan abstract class dan interface. Agar lebih paham kita melakukan pengamatan


Yang Pertama Tentang Abstract Class

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_") );
    }
}



Soal 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 Pengamatan 1 :

 1.     Tidak boleh karena method getValue dan method prefixValue adalah method abstract class
 2.     Error karena ada 1 method dari abstract class yang belum diturunkan ke concreteclass1, karena            penurunan method harus lengkap
 3.     Memiliki perbedeaan hak akses concreteclass1 getValuenya “ protected” maksutnya method ini          hanya bisa diakses di class concreteclass1/ class itu sendiri/subclassnya , tetapi di                                  concreteclass2 getValuenya “public” maksutnya methodnya dapat diakses di lain class                          concreteclass2.
 4.         Error, karena method getValue2() tidak dideklarasi di parentclassnya yaitu di AbstractClass
 5.     Karena class CocreteClass1 merupakan abstract class, Abstract class tidak bisa untuk membuat            object baru.



Yang Kedua Tentang Interface

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() );
    }
}



Soal Pengamatan 2

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!


Jawab Pengamatan 2

1.  Error, karena di class mobil2 Cuma ada 2 method yang dimasukkan yaitu setNoMesin dan              getNoMesin seharusnya setMerk dan getMerk juga dimasukkan, method tersebut adalah turunan dari class interface induknya.
2. Ganti koding ini di Class Mobil2

         class Mobil2 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;
   }

        }  

3    - Error, karena method yang ada di class interface harusnya method abstract yang tidak  mempunyai body “{}"
  -   Abstract class body programnya boleh selain method abstract(bebas), tetapi untuk interFace semua methodnya harus abstract
-    Jika di abstract class hanya boleh mengextends satu abstract class lainnya tetapi di interface bisa mengextends satu atau lebih interface


Nah Cukup sekian dulu Sharing dari saya, saya ucapkan terimakasihh ketemu dipost selanjutnya yaaa..Semoga bermanfaat, SELAMAT BELAJAR :D













2 komentar: