Java Inner Classes
Java Inner Classes
ใน Java ยังสามารถซ้อนคลาสได้ (คลาสภายในคลาส) จุดประสงค์ของคลาสที่ซ้อนกันคือเพื่อจัดกลุ่มคลาสที่อยู่ด้วยกัน ซึ่งทำให้โค้ดของคุณสามารถอ่านและบำรุงรักษาได้มากขึ้น
เมื่อต้องการเข้าถึงชั้นใน ให้สร้างวัตถุของชั้นนอก แล้วสร้างวัตถุของชั้นใน:
ตัวอย่าง
class OuterClass {
int x = 10;
class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
// Outputs 15 (5 + 10)
ชั้นในส่วนตัว
ไม่เหมือนกับคลาส "ปกติ" คลาสภายในสามารถเป็นprivate
หรือprotected
. หากคุณไม่ต้องการให้วัตถุภายนอกเข้าถึงคลาสภายใน ให้ประกาศคลาสเป็นprivate
:
ตัวอย่าง
class OuterClass {
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
หากคุณพยายามเข้าถึงคลาสส่วนตัวภายในจากคลาสภายนอก จะเกิดข้อผิดพลาด:
Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
ชั้นในคงที่
คลาสชั้นในสามารถเป็นได้static
ซึ่งหมายความว่าคุณสามารถเข้าถึงได้โดยไม่ต้องสร้างวัตถุของคลาสภายนอก:
ตัวอย่าง
class OuterClass {
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
// Outputs 5
หมายเหตุ:เช่นเดียวกับstatic
แอตทริบิวต์และเมธอดstatic
คลาสภายในไม่สามารถเข้าถึงสมาชิกของคลาสภายนอกได้
เข้าถึงชั้นนอกจากชั้นใน
ข้อดีอย่างหนึ่งของคลาสชั้นในคือพวกเขาสามารถเข้าถึงแอตทริบิวต์และเมธอดของคลาสภายนอกได้:
ตัวอย่าง
class OuterClass {
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
// Outputs 10