เรียน Java เพื่อนำไปสร้าง Application ระดับโลก [5]


Inner, Local และ Anonymous Class

เราสามารถประกาศ Inner class ได้ดังนี้

class A {

class B {}

}

จากตัวอย่างนี้ B จะเป็น Inner class ของ A และ A จะเป็น Outer class ของ B
เมื่อ compile แล้วเราจะได้ A.class และ A$B.class

การนำไปใช้

class A {

     class B{}

     void test() {

            B b = new B();

     }

}

class C {

     public static void main(String[]args) {

           A.B b = new A().new B();

     }

}

โดยที่ Inner Class ก็สามารถประกาศให้เป็น static หรือใส่ public modifier ได้เช่นกันดังนี้

class A {

     public static class B{}

}

class C {

     public static void main(String[]args) {

              A.B b = A.new B();//สามารถ new โดยที่ไม่ต้อง new Outer class

     }

}

Inner class ที่ไม่ใช่ static สามารถอ้างอิงถึง this ของ Outer class ได้เพราะ
Outer ต้องถูก new instance ก่อนถึงจะ สร้าง instance ของ Inner ได้ จากตัวอย่าง

class A {

       class B {

               void test() {

                      A a = A.this;//สามารถทำได้

               }

       }

}

ลองดูอีกตัวอย่างหนึ่งครับ

class A {

       static class B {

               void test() {

                      A a = A.this;//Compile Error!

               }

       }

}

Inner class ที่เป็น static ไม่สามารถอ้างอิงถึง this ของ Outer class ได้ก็เพราะ
เราสามารถสร้าง instance ของ B โดยที่ไม่ต้อง new A() ขึ้นมาดังนี้

A.B = A.new B();

ทำให้ไม่มี instance ของ A เกิดขึ้น this จึงไม่สามารถถูกอ้างอิงได้เช่นเดียวกันกับ
การอ้างอิงถึง inner class โดย static method ของ outer class เช่น

class A {

       class B{}

       static class C{}

       public static void main(String[]args) {

                B b = new B();//Compile Error เนื่องจาก class B เกิดขึ้นได้ตอน new A() แล้วเท่านั้น แต่ static void main เกิดขึ้นมาตั้งแต่ตอน load class แล้ว

                B b2 = new A().new B();//สามารถทำได้

                C c = new C();//สามารถทำได้ เพราะ class C เป็น static

       }

Local Class

เราสามารถประกาศ local class ได้ดังนี้

class A {

       void test() {

              class B {

              }

       }

}

ซึ่งเมื่อ compile แล้วเราจะได้ A.class และ A$1B.class ซึ่งถ้าหากมี local class B
หลายที่ตัวเลขหลัง $ ก็จะเพิ่มขึ้นเรื่อยๆ ส่วนการนำไปใช้จะใช้ได้หลังจากมีการประกาศ
และภายใน scope นั้นเท่านั้นเช่น

class A {

       void test() {

              B b = new B();//Compile Error

              class B {

              }

              B b = new B();//Ok

       }

}

เราไม่สามารถประกาศ static หรือ public กับ local class ได้แต่เราสามารถสร้าง inner
class ภายใน local class ได้เช่น

class A {

       void test() {

             class B {

                     class C {}

             }

             B.C c = new B().new C();

       }

}

ซึ่งผลลัพท์ที่ได้หลังจาก compile คือ A.class, A$1B.class และ A$1B$C.class

Anonymous Class

Anonymous Class หรือคลาสที่ไม่มีชื่อแต่จำเป็นต้อง extends มาจาก class ใดๆเสมอ
เราสามารถประกาศ Anonymous Class ได้ดังนี้

class B{}
public class A {
    void test() {
        new B(){};//เราจะได้ Anonymous Class ซึ่ง extends มาจาก B
    }
}

จากตัวอย่างเมื่อ compile แล้วจะได้ A.class, B.class และ AnonymousA$1.class 
ซึ่งจะเห็นว่าไม่มีชื่อ

Inner, Local, และ Anonymous Class เราอาจยังไม่เห็นประโยชน์ของมันในตอนนี้
แต่เราจะได้พบในการเขียนโปรแกรมในระดับสูงขึ้นต่อไป ซึ่งจำเป็นต้องรู้พื้นฐานให้
เข้าใจนะครับ

 

คำสำคัญ (Tags): #java
หมายเลขบันทึก: 386142เขียนเมื่อ 19 สิงหาคม 2010 12:36 น. ()แก้ไขเมื่อ 22 พฤศจิกายน 2023 14:39 น. ()สัญญาอนุญาต: ครีเอทีฟคอมมอนส์แบบ แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกันจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท