0Pricing
Kotlin Academy · บทเรียน

คลาสซ้อนภายใน

คลาสที่อยู่ภายในคลาสอื่น

คลาสซ้อนภายใน เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คลาสภายในคลาส

Kotlin อนุญาตให้คุณประกาศคลาสภายในคลาสอื่น โดยค่าเริ่มต้น คลาสดังกล่าวจะเป็นคลาสซ้อนกันและจะไม่เก็บการอ้างอิงไปยังอินสแตนซ์ภายนอก

class Outer {
    class Nested {
        fun hello() = "Hi from Nested"
    }
}

fun main() {
    println(Outer.Nested().hello())
}

การสร้างอินสแตนซ์ของคลาสซ้อนกัน

เนื่องจากคลาสซ้อนกันเป็นอิสระจากคลาสภายนอก คุณจึงสร้างคลาสนี้ผ่านชื่อคลาสภายนอกโดยไม่ต้องมีอินสแตนซ์ภายนอก: Outer.Nested()

class Computer {
    class Cpu {
        val cores = 8
    }
}

fun main() {
    val cpu = Computer.Cpu()
    println(cpu.cores)
}

ไม่สามารถเข้าถึงสมาชิกของคลาสภายนอก

คลาสซ้อนกันไม่สามารถมองเห็นสมาชิกอินสแตนซ์ของคลาสภายนอกได้ เพราะไม่มีการอ้างอิงไปยังคลาสภายนอก คลาสนี้ทำงานเหมือนคลาสระดับบนสุดที่อยู่ภายใต้ขอบเขตของชื่อหนึ่ง

class Bank {
    val name = "ACME"
    class Branch {
        fun describe() = "A branch"
    }
}

fun main() {
    println(Bank.Branch().describe())
}

เหตุใดจึงใช้คลาสซ้อนกัน

การซ้อนคลาสช่วยสื่อถึง การจัดกลุ่มเชิงตรรกะ: ชนิดข้อมูลภายในมีความเกี่ยวข้องเชิงแนวคิดกับชนิดข้อมูลภายนอก ทำให้การจัดระเบียบและการจัดพื้นที่ชื่อดีขึ้น

class Http {
    class Request(val url: String)
}

fun main() {
    val r = Http.Request("/home")
    println(r.url)
}

คลาส Nested ที่มีพร็อพเพอร์ตี

คลาส Nested เป็นคลาสทั่วไป โดยสามารถมีตัวสร้าง พร็อพเพอร์ตี และเมธอดได้

class Garage {
    class Car(val model: String) {
        fun honk() = "$model: beep"
    }
}

fun main() {
    println(Garage.Car("Tesla").honk())
}

การเข้าถึงสมาชิกแบบคอมแพเนียนหรือคล้ายสมาชิกแบบคงที่

สามารถอ้างอิงคลาส Nested จากที่ใดก็ได้โดยใช้ชื่อของคลาสภายนอก ซึ่งคล้ายกับคลาส Nested แบบคงที่ใน Java

class Config {
    class Defaults {
        val timeout = 30
    }
}

fun main() {
    println(Config.Defaults().timeout)
}

คลาส Nested หลายคลาส

คลาสภายนอกสามารถมีคลาส Nested ได้หลายคลาส เพื่อจัดกลุ่มชนิดข้อมูลที่เกี่ยวข้องกัน

class Shapes {
    class Circle(val r: Int)
    class Square(val side: Int)
}

fun main() {
    println(Shapes.Circle(5).r)
    println(Shapes.Square(4).side)
}

Nested ซ้อนใน Nested

คุณสามารถซ้อนคลาสได้มากกว่าหนึ่งระดับ แต่การซ้อนลึกเกินไปอาจทำให้อ่านโค้ดได้ยาก

class A {
    class B {
        class C {
            val value = 42
        }
    }
}

fun main() {
    println(A.B.C().value)
}

Nested เทียบกับระดับบนสุด

ในด้านการทำงาน คลาส Nested ก็เหมือนคลาสระดับบนสุด ความแตกต่างเพียงอย่างเดียวคือชื่อแบบระบุคุณสมบัติ เลือกใช้การซ้อนเมื่อความสัมพันธ์ดังกล่าวช่วยให้โค้ดชัดเจนขึ้น

class Order {
    class Item(val price: Int)
}

fun main() {
    val total = Order.Item(10).price + Order.Item(5).price
    println(total)
}

การจัดกลุ่มที่ใช้ได้จริง

การจัดกลุ่มชนิดข้อมูลผลลัพธ์ของ Builder ไว้ภายใต้เจ้าของทำให้อ่านได้อย่างเป็นธรรมชาติ

class Parser {
    class Result(val ok: Boolean, val message: String)

    fun parse(text: String) = Result(text.isNotEmpty(), "parsed")
}

fun main() {
    val res = Parser().parse("data")
    println("${res.ok} ${res.message}")
}

กฎสำคัญที่ควรจำ

คีย์เวิร์ดที่ทำให้คลาสเก็บการอ้างอิงไปยังคลาสภายนอกคือ inner หากไม่มีคีย์เวิร์ดนี้ คลาส Nested จะมีลักษณะคล้ายคลาสคงที่และแยกเป็นอิสระ

class Box {
    class Lid
}

fun main() {
    println(Box.Lid() != null)
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับคลาส Nested ของคุณ

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับ คลาส Nested:

  • ประกาศไว้ภายในคลาสอื่น โดยค่าเริ่มต้นคือ class (คลาส Nested)
  • ไม่มีการอ้างอิงไปยังอินสแตนซ์ภายนอก จึงไม่สามารถเข้าถึงสมาชิกของคลาสภายนอกได้
  • สร้างโดยใช้ชื่อของคลาสภายนอก: Outer.Nested()
  • เหมาะสำหรับการจัดกลุ่มตามตรรกะและการจัดขอบเขตชื่อ
class Outer {
    class Nested { val x = 1 }
}

fun main() {
    println(Outer.Nested().x)
}

คำถามที่พบบ่อย

บทเรียน “คลาสซ้อนภายใน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คลาสซ้อนภายใน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คลาสซ้อนภายใน”

คลาสที่อยู่ภายในคลาสอื่น คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “คลาสซ้อนภายใน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คลาสซ้อนภายใน
  2. คลาสภายใน
  3. ออบเจ็กต์นิรนาม
  4. คลาสภายในฟังก์ชัน
← กลับไปที่ Kotlin Academy