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 เราอาจยังไม่เห็นประโยชน์ของมันในตอนนี้
แต่เราจะได้พบในการเขียนโปรแกรมในระดับสูงขึ้นต่อไป ซึ่งจำเป็นต้องรู้พื้นฐานให้
เข้าใจนะครับ
ไม่มีความเห็น