INNER CLASS

 

 

 

            1. “Regular” Inner class

2. Method-local inner class

3. Anonymous inner class

4. Static nested classes

 

1. “Regular” Inner class

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.

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

    }

}

 

Contoh : [1]

Program 03

 

class A {

    class B {

        static int a = 10; //error!!!

    }

}

 

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.

 

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.

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

    }

}

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

 

 

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

 

 

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

 

 

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.

 

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

    }

}

 

 

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 !!!!!!!

    }

}

 

 

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

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

    }

}

 

 

NamaOuterClass.NamaStaticNestedClass varRef = new NamaOuterClass.NamaStaticNestedClass()

 

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

    }

}

 

 

 

 

 

 


[1] M. Desdrianton Islamy.

[2] Sun Certified Programmer for Java 5 Study Guide, by Katherine Sierra and Bert Bates.

 

Document versi 1 : Akhir Mei 2006