Entri Populer

Selasa, 01 November 2011

Pertemuan 4


Abstract Class, Interface, Inner Class
A.   Abstrak Class
Abstract class adalah kelas yang terletak pada posisi tertinggi pada hierarki kelas. Kelas ini digunakan sebagai basis bagi penurunan kelas lainnya, sehingga abstract class tidak dapat diinstansiasi secara langsung menjadi object. Suatu abstract class bisa mengandung method kongkrit dan/atau method abstract. Abstract method meruapakan suatu method yang tidak mempunyai badan method. Hanya berupa nama method dan parameter inputan method. Ketika suatu abstract class diturunkan/ di-extends, maka subclass harus mengimplementasikan semua method abstract pada parent/ base class. Jika tidak mengimplementasikan semua method abstract maka subclass harus dideklarasikan sebagai abstract class.

B.   Interface
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 bila Anda ingin mengaplikasikan suatu method yang spesifik, yang tidak diperoleh dari proses inheritance. Tipe data yang boleh pada interface hanya tipe datakonstan. Setelah mengetahui apa itu interface. Timbul pertanyaan Mengapa membutuhkan interface?
·         Memecahkan bagian yang rumit dan spesifik. Dengan menggunakan class atau interface oleh vendor maka dalam pembuatan perangkat lunak menjadi lebih cepat.
·         Keterbatasan inheritance pada Java. Interface menjawab kebutuhan untuk melakukan multiple inheritance
Apakah Interface = Abstract class ?
Ya menurut saya sih antara keduanya memiliki kemiripan, tapi tidak sama. Mirip bukan berarti sama kan? Terdapat beberapa perbedaan antara keduanya yaitu
·         Abstract class dapat memiliki tipe data dengan semua tipe data, sedangkan interface tipe datanya hanya berupa konstanta
·         Method pada abstract class dapat berupa method kongkrit dan method abstract. Sedangkan pada interface semua method harus berupa method abstract.
Contoh
GraphicObject.java
abstract class GraphicObject {
int x,y;
void moveTo(int newValueX, int newValueY)
{
x = newValueX;
y = newValueY;
}
abstract void drawShape();
abstract void resize();
}
Circle.java
public class Circle extends GraphicObject {
void resize()
{
System.out.println(“Circle Resize”);
}
void drawShape()
{
System.out.println(“Circle Shape”);
}
void posisition()
{
System.out.println(this.x+this.y);
}
}
Main.java
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Circle Lingkaran = new Circle();
Lingkaran.moveTo(5,5);
Lingkaran.drawShape();
Lingkaran.resize();
Lingkaran.posisition();
}
}








C.     INNER CLASS
Innerclass adalah class yang di sisipkan didalam kelas yang lain. Fungsi kelas sisip ini adalah mendukung suatu proses yang akan dijalankan oleh kelas utama
  
  • Inner class adalah suatu class yang berada di dalam class lainnya. [1]
  • Di buku [2], disebutkan ada 4 jenis inner class, yaitu :
            1. “Regular” Inner class
2. Method-local inner class
3. Anonymous inner class
4. Static nested classes

1. “Regular” Inner class
  • Kata “Regular” di atas memiliki maksud bahwa inner class yang dibahas di sini adalah inner class yang bukan static / method-local / anonymous. [2]
  • Inner class didefinisikan (ditulis) di dalam kurung kurawal dari outer class. [2]
  • Bila ada kode java sebagai berikut : [2]
Program 01

class MyOuter {
      class MyInner {
      }
}

Dan kemudian dicompile dengan perintah :
%java MyOuter.java
Maka akan tercipta 2 buah file .class, yaitu : MyOuter.class dan MyOuter$MyInner.class.
  • Instance inner class memiliki akses ke semua member dari outer class (termasuk member outer class yang ber access modifier private). [2]
Contoh : [1]
Program 02

class A {
    private int x = 101;
    class B {
        void lakukanSesuatu() {
            System.out.print("x = " + x);
        }
    }
}

public class BelajarInnerClass02 {
    public static void main(String[] args) {
        A a = new A();
        A.B b = a.new B();
        b.lakukanSesuatu();
    }
}

  • Sebuah inner class tidak dapat memiliki member static. [2]
Contoh : [1]
Program 03

class A {
    class B {
        static int a = 10; //error!!!
    }
}

  • Untuk membuat instance dari inner class, kita harus memiliki instance dari outer class terlebih dahulu. Tidak ada  pengecualisan untuk aturan ini. [2]
  • Untuk membuat instance dari inner class, terdapat 2 cara, yaitu :
1.      Dari dalam outer class
2.      Dari luar outer class
·         Contoh membuat instance inner class dari dalam outer class : [1]
Program 04

class A {
    void buatInstanceKelasB() {
        B b = new B();
    }
    class B {
    }
}

Dari contoh di atas, untuk dapat menjalankan method buatInstanceKelasB, harus terdapat instance dari kelas A terlebih dahulu. Dengan kata lain, untuk membuat instance inner class, harus terdapat instance dari outer class terlebih dahulu.

Maksud dari membuat instance inner class dari dalam outer  class tidak termasuk membuat instance dari dalam method static. Sebab method static tidak dapat menunjuk sesuatu yang tidak static. Untuk membuat instance inner class dari dalam method static, maka dipergunakan cara seperti ketika membuat instance inner class dari luar outer class.

  • Contoh membuat instance inner class dari luar outer class  : [1]
Program 05

class A {
    class B {
        void sesuatuDiKelasB() {
            System.out.println("Hello, ini di method kelas B");
        }
    }
}

public class Contoh {
    public static void main(String[] args) {
        A a = new A();
        A.B b = a.new B();
        b.sesuatuDiKelasB();
    }
}


Program 05 di atas dapat disingkat menjadi : [1]
Program 06

class A {f
    class B {
        void sesuatuDiKelasB() {
            System.out.println("Hello, ini di method kelas B");
        }
    }
}

public class BelajarInnerClass04 {
    public static void main(String[] args) {
        A.B b = new A().new B();
        b.sesuatuDiKelasB();
    }
}

Ketika kita ingin membuat instance dari method static dari outer class, maka cara di ataslah yang digunakan. Hal ini karena method static tidak memiliki reference this.
  • Aturan inner class dalam hal mereferensi dirinya sendiri atau instance dari outer class adalah sebagai berikut : [2]
1.      Untuk merujuk pada dirinya sendiri (instance dari inner class) dari dalam inner class, dapat digunakan referensi this atau NamaOuterClass.NamaInnerClass.this.
2.      Untuk merujuk pada instance dari outer classnya dari dalam inner class, dapat digunakan referensi NamaOuterClass.this.
Contoh : [1]
Program 07

class A {
    int i = 10;
    class B {
        int i = 11;
        class C {
            int i = 12;
            void lakukanSesuatu() {
                System.out.println("A.this.i     = " + A.this.i);
                System.out.println("A.B.this.i   = " + A.B.this.i);
                System.out.println("A.B.C.this.i = " + A.B.C.this.i);
                System.out.println("this.i       = " + this.i);
            }
        }
    }
}
public class BelajarInnerClass05 {
    public static void main(String[] args) {
        A.B.C c = new A().new B().new C();
        c.lakukanSesuatu();
    }
}
  • Modifier-modifier berikut dapat diberikan pada inner class : [2]
1.  final
2.  abstract
3.  public
4.  protected
5.  private
6.      static (tapi dengan modifier ini, maka akan menjadi static nested class, bukan inner class).
7.  strictfp

2. Method-Local Inner Class
·         Method-local inner class adalah inner class yang dideklarasikan di dalam method [2].
·         Mendeklarasikan method-local inner class tidak berarti kita membuat instance dari class tersebut. Jadi, sebelum kita menggunakan inner class tersebut, kita harus membuat instancenya dari suatu tempat di dalam method dan setelah definisi inner class tersebut. [2].
Contoh :
Program 08

class A { //1
    void myMethod() { //2
        class B { //3
            int i = 10;
            void lakukanSesuatu() { //4
                System.out.println(" i = " + i);
            } //4
        } //3
       
        B b = new B();
        b.lakukanSesuatu();
    } //2
} //1


  • Method-local inner class hanya dapat diinstansiasi dari dalam method yang mendefinisikan method-local inner class tersebut.
  • Instance method-local inner class memiliki akses ke semua member dari outer class (termasuk member outer class yang ber access modifier private). [2]
Contoh : [1]
Program 09

class A { //1
    private int i = 10;
    void lakukanSesuatu() { //2
        class B { //3
            void aksesMemberOuterClass() { //4
                System.out.println("i = " + i);
            } //4
        } //3
       
        B b = new B();
        b.aksesMemberOuterClass();
    } //2
} //1


  • Instance dari method-local inner class tidak dapat mengakses local variabel (termasuk parameter) dari method dimana method-local inner class tersebut didefinisikan. Kecuali bila variabel tersebut bermodifier final.[2]
Contoh : [2]
Program 10

class A { //1
    void lakukanSesuatu() { //2
        int nonFinalVar = 10;
        final int finalVar = 11;
        class B { //3
            void aksesLocalVar() { //4
                //ERROR
                System.out.println("nonFinalVar = " + nonFinalVar);
                //TIDAK ERROR
                System.out.println("finalVar = " + finalVar);
            } //4
        } //3
       
        B b = new B();
        b.aksesLocalVar();
    } //2
} //1


  • Method-local inner class yang didefinisikan di dalam static method tidak dapat mengakses non-static member dari outer classnya [2].
  • Modifier-modifier yang dapat diberikan pada method-local inner class adalah : [2]
1.      abstract (tidak dapat digabung dengan final)
2.      final (tidak dapat digabung dengan abstract)


3. Anonymous Inner Class
·         Anonymous inner class adalah suatu inner class yang dideklarasikan tanpa nama kelas. [2]
·         Anonymous inner class pasti adalah salah satu dari 2 hal berikut :
1.      Subclass dari suatu class yang telah dideklarasikan
2.      Kelas implementasi dari suatu interface
·         Suatu anonymous inner class tidak dapat secara bersamaan menjadi subclass dari class yang telah dideklarasikan dan juga sebagai kelas implementasi dari suatu interface. [2]
·         Tujuan utama dari anonymous inner class adalah mengoverride satu atau lebih method dari super classnya atau mengimplement semua method dari suatu interface. [2]

·         Anonymous inner class tidak dapat mengimplement lebih dari sebuah interface. [2]
·         Anonymous inner class selalu dibuat sebagai bagian dari suatu statement. [2]
·         Contoh Anonymous inner class sebagai subclass : [1]
Program 11

class A {
    int i = 10;
    void lakukanSesuatu() {
        i--;
        System.out.println("i = " + i);
    }
}

public class BelajarAnonymous1 {    //1
    public static void main(String[] args) {    //2
        A a = new A() {   //3
            void lakukanSesuatu() { //4
                i++;
                System.out.println("i = " + i);
            }   //4
        };  //3
       
        a.lakukanSesuatu();
    }   //2
}   //1

Note: variabel referensi a di atas mereferensi ke suatu instance anonymous inner class yang merupakan subclass dari class A. Jadi, variabel referensi a bukan mereferensi ke instance dari kelas A.

  • Contoh anonymous inner class sebagai implementasi suatu interface : [1]
Program 12

interface A {
    public void doA();
}

interface B extends A {
    public void doB();
}

public class BelajarAnonymous2 {
    public static void main(String[] args) {
        B b = new B() {
            public void doA() {
                System.out.println("Ini method doA()");
            }
           
            public void doB() {
                System.out.println("Ini method doB()");
            }
        };
       
        b.doA();
        b.doB();
    }
}


  • Anonymous inner class adalah salah satu bentuk dari polymorphisme, oleh karena itu, method yang dapat dipanggil dari anonymous inner class adalah method yang dideklarasikan di super class atau interfacenya (meskipun di dalam anonymous inner class dapat dideklarasikan method-method yang tidak ada di super class atau interfacenya).
Contoh : [1]
Program 13

class A {
    int i = 10;
    void lakukanSesuatu() {
        i--;
        System.out.println("i = " + i);
    }
}

public class BelajarAnonymous1 {
    public static void main(String[] args) {
        A a = new A() {
            void lakukanSesuatu() {
                i++;
                System.out.println("i = " + i);
            }
           
            //Di bawah ini adalah method yang tidak ada di class A
            void newMethod() {
                System.out.println("Hallo, nama saya Anton");
            }
        };
       
        a.lakukanSesuatu(); //Tidak error
        a.newMethod(); //ERROR !!!!!!!
    }
}


  • Anonymous inner class dapat diletakkan sebagai argument dari suatu method. Contoh : [1]
Program 14

class A {
    void lakukanSesuatu() {
        System.out.println("Ini isi aslinya");
    }
}

class B {
    static void demoAnonymousInnerClassSebagaiArgument(A a) {
        a.lakukanSesuatu();
    }
}

public class BelajarAnonymous3 {
    public static void main(String[] args) {
        B.demoAnonymousInnerClassSebagaiArgument(new A() {
            void lakukanSesuatu() {
                System.out.println("Ini method di anonymous inner class");
            }
        });
    }
}


4. Static nested class
  • Static nested class adalah inner class dengan modifier static[2]
  • Static nested class sebenarnya bukan inner class, static nested class hanyalah top-level class yang di sarangkan di dalam class lain. [2]
  • Karena static, maka untuk membuat instance dari static nested class tidak diperlukan instance dari outer classnya. [2] (tidak seperti regular inner class ataupun method-local inner class [1]).
Contoh : [1]
Program 15

class A {
    static class B {
        void lakukanSesuatu() {
            System.out.println("Hallo");
        }
    }
}

public class StaticNestedClass {
    public static void main(String[] args) {
        A.B b = new A.B(); //cara instansiasi static nested class
        b.lakukanSesuatu();
    }
}


  • Cara instansiasi static nested inner class adalah : [2]
NamaOuterClass.NamaStaticNestedClass varRef = new NamaOuterClass.NamaStaticNestedClass()

  • Static nested class tidak dapat mengakses non-static member dari outer classnya. [2]
Contoh : [1]
Program 16

class A {
    int i = 10;
    static class B {
        void lakukanSesuatu() {
            System.out.println("i = " + i);
        }
    }
}

public class StaticNestedClass2 {
    public static void main(String[] args) {
        A.B b = new A.B();
        b.lakukanSesuatu();
    }
}














LANGKAH-LANGKAH PRKTIKUM

A.           MakhlukHidup.java
public abstract class MakhlukHidup {
   protected boolean BisaTerbang = false;
   protected String Nama;
   protected int JLHKaki;
   public MakhlukHidup(String Nama1, int JLHKaki1,boolean BisaTerbang1) {
         this.Nama = Nama1;
         this.JLHKaki = JLHKaki1;
         this.BisaTerbang = BisaTerbang1;
   }

   abstract void bernafas();

   public void status() {
          System.out.println("Nama : " +Nama);
          System.out.println("Jumlah kaki : " +JLHKaki);
          System.out.println("Bisa terbang : " +BisaTerbang);
   }
 }


Pada program di atas tidak dapat di eksekusi karna tidak ada fungsi utama
public abstract class MakhlukHidup { = adalah kelas yang di deklarasikan dengan abstark

B.            Manusia.java
public class Manusia extends MakhlukHidup {
 Manusia(String nama) {
super(nama, 2,false);
   }
public void bernafas() {
System.out.println(nama+" bernafas dengan menghirup 02");
 }
 public static void main(String [] args) {
Manusia m = new Manusia("Sayuti");
m.status();
  m.bernafas();
   }
 }
Hasil Eksekusi dari perogram di atas:


Pada baris berikut:
Manusia m = new Manusia("Sayuti");            : untuk Membuat objek baru dari kelas manusia
m.status();                   =  untuk memanggil method status
m.bernafas();               = untuk memanggil method m dari kelas manusia


C.           Tumbuhan.java
public class Manusia extends MakhlukHidup {
   Manusia(String nama) {
       super(nama, 2,false);
   }
   public void bernafas() {
       System.out.println(nama+" bernafas dengan menghirup 02");
   }
   public static void main(String [] args) {
       Manusia m = new Manusia("Sayuti");
       m.status();
       m.bernafas();
   }
 }
Hasil Eksekusi Dari progam di atas:
             
D.      Pekerjaan.java
interface Pekerjaan {
   public void namaPekerjaan();
   public void gaji();
}
Program di tas tidak menghasilkan out put krna tidak memiliki fungsi utama

E.                 Sasya.java
public class Sasya extends Manusia implements Pekerjaan {
   public Sasya() {
      super("Sasya");
   }
  
   public void namaPekerjaan() {
      System.out.println("Pekerjaan :Sekretaris");
   }
  
   public void gaji() {
      System.out.println("PGaji : Rp. 3.000.000");
   }
  
   public static void main(String [] args) {
      Sasya s = new Sasya();
      s.status();
      s.bernafas();
      s.namaPekerjaan();
      s.gaji();
   }
}
Hasil eksekusi program di atas:

F.                  JantungManusia.java

Jantung Manuisa
class Orang {
  private int jumlKaki = 2;
  public void dengarBunyiJantung() {
      Jantung j = new Jantung() {
      j.bunyijantung();
  }
    public void tahanNafas()
      System.out.println("Jantung berhenti berdetak!");
  } 
  //inner class
  Class Jantung {
      public void bunyiJantung() {
         System.out.println("Silahkan ke "+jumlKaki+" kaki.");
         tahanNafas();
     
  }
}
Class JantungManusia {
  public static void main(String[] args) {
      Orang o = new Orang();
      Orang.Jantung p = o.new Jantung();
      o.dengarBunyiJantung();
      p.istirahat();
  }
}
Hasil Eksekusi dari program di atas:





















Tidak ada komentar:

Posting Komentar