ใน Java สามารถ定义 Class ภายใน Class อีกตัว (Nested Class) ใช้ Access Modifier: private, public, protected, default สำหรับ Inner Class, public, default สำหรับ Outer Class
มี 2 ประเภทหลัก:
- Static Nested Class (Static Member Class)
- Non-Static Nested Class (Inner Class)
1. Static Nested Class
- ประกาศด้วย static keyword
- ไม่ผูกติดกับ Instance ของ Outer Class (ไม่มี this reference)
- เข้าถึง Static Members ของ Outer Class ได้ (private static ด้วย)
- ไม่เข้าถึง Instance Members ของ Outer Class ได้โดยตรง
- สร้าง Instance ได้:
OuterClass.NestedClass obj = new OuterClass.NestedClass();
ตัวอย่าง
class Car {
static class Wheel {
public void rotate() {
System.out.println("The wheel is rotating");
}
}
}
public class Test {
public static void main(String args[]) {
Car.Wheel wheel = new Car.Wheel();
wheel.rotate();
}
}
2. Non-Static Nested Class (Inner Class)
- ไม่มี static keyword
- ผูกติดกับ Instance ของ Outer Class (มี Outer Class Reference อยู่ภายใน)
- เข้าถึง ทั้ง Static และ Instance Members ของ Outer Class ได้ (รวม private)
- ไม่สามารถประกาศ Static Members ได้ (ยกเว้น Constant/Compile-time Constants)
- สร้าง Instance ต้องมี Outer Instance ก่อน:
OuterClass.InnerClass inner = outer.new InnerClass();
ตัวอย่าง
public class OuterClassTest {
private int a = 10; // Instance Variable
public void innerClassInstance() {
InnerClassTest inner = new InnerClassTest();
inner.outerObject();
}
public static void main(String args[]) {
OuterClassTest outer = new OuterClassTest();
outer.innerClassInstance();
}
class InnerClassTest {
public void outerObject() {
System.out.println("Outer Value of a is: " + a); // เข้าถึง Outer Instance Var
}
}
}
ผลลัพธ์
Outer Value of a is: 10
ประเภทย่อยของ Inner Class (Non-Static)
| ประเภท | คำอธิบาย | |
|---|---|---|
| Member Inner Class | ระดับ Member ของ Class (เหมือนตัวอย่างข้างต้น) | |
| Local Inner Class | ประกาศใน Method/Block ใช้ได้เฉพาะใน Scope นั้น | |
| Anonymous Inner Class | ไม่มีชื่อ ใช้ทันที implements Interface/extends Class |
| คุณสมบัติ | Static Nested Class | Inner Class (Non-Static) |
|---|---|---|
| Outer Instance Reference | ไม่มี | มี (Implicit) |
| เข้าถึง Outer Instance Members | ไม่ได้ | ได้ (ทั้ง private) |
| เข้าถึง Outer Static Members | ได้ | ได้ |
| สร้าง Instance | new Outer.Nested() | outer.new Inner() |
| Static Members | ได้ | ไม่ได้ (ยกเว้น Constants) |
| Memory Overhead | น้อยกว่า | มากกว่า (เก็บ Outer Ref) |