Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Nested Class ใน Java มีกี่ประเภท?

ใน 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)

ตารางเปรียบเทียบ Static vs Non-Static Nested

ประเภทคำอธิบาย
Member Inner Classระดับ Member ของ Class (เหมือนตัวอย่างข้างต้น)
Local Inner Classประกาศใน Method/Block ใช้ได้เฉพาะใน Scope นั้น
Anonymous Inner Classไม่มีชื่อ ใช้ทันที implements Interface/extends Class
คุณสมบัติStatic Nested ClassInner Class (Non-Static)
Outer Instance Referenceไม่มีมี (Implicit)
เข้าถึง Outer Instance Membersไม่ได้ได้ (ทั้ง private)
เข้าถึง Outer Static Membersได้ได้
สร้าง Instancenew Outer.Nested()outer.new Inner()
Static Membersได้ไม่ได้ (ยกเว้น Constants)
Memory Overheadน้อยกว่ามากกว่า (เก็บ Outer Ref)