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

คลาสภายใน

เข้าถึงขอบเขตภายนอก

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

คีย์เวิร์ดสำหรับคลาสภายใน

การกำหนดให้คลาส Nested เป็น inner จะทำให้คลาสนั้นมีการอ้างอิงไปยัง อินสแตนซ์ภายนอก จึงสามารถเข้าถึงสมาชิกของคลาสภายนอกได้

class Outer {
    val msg = "Hello"
    inner class Inner {
        fun show() = msg
    }
}

fun main() {
    println(Outer().Inner().show())
}

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

เนื่องจากคลาสภายในต้องใช้อินสแตนซ์ภายนอก คุณจึงต้องสร้างคลาสนี้จากอินสแตนซ์ดังกล่าว: Outer().Inner()

class Engine {
    val power = 100
    inner class Turbo {
        fun boosted() = power * 2
    }
}

fun main() {
    println(Engine().Turbo().boosted())
}

การเข้าถึงพร็อพเพอร์ตีภายนอก

คลาสภายในสามารถอ่านและใช้พร็อพเพอร์ตีของคลาสภายนอกได้โดยตรง ราวกับว่าพร็อพเพอร์ตีเหล่านั้นเป็นของคลาสภายในเอง

class Counter {
    var count = 0
    inner class Stepper {
        fun step() { count++ }
    }
}

fun main() {
    val c = Counter()
    c.Stepper().step()
    println(c.count)
}

การเรียกเมธอดภายนอก

คลาสภายในสามารถเรียกเมธอดของอินสแตนซ์ที่ครอบคลุมอยู่ได้เช่นกัน

class Printer {
    fun line(s: String) = println(s)
    inner class Job {
        fun run() = line("printing")
    }
}

fun main() {
    Printer().Job().run()
}

ไวยากรณ์ this@Outer

หากต้องการอ้างถึงอินสแตนซ์ภายนอกอย่างชัดเจน เช่น เมื่อชื่อเกิดซ้ำกัน ให้ใช้ this@Outer

class Outer {
    val value = 10
    inner class Inner {
        val value = 20
        fun outerValue() = this@Outer.value
    }
}

fun main() {
    println(Outer().Inner().outerValue())
}

เหตุใดจึงใช้คลาสภายใน

ใช้ inner เมื่อชนิดข้อมูล Nested จำเป็นต้องทำงานร่วมกับอินสแตนซ์ภายนอกที่ระบุอย่างแท้จริง และใช้สถานะร่วมกับอินสแตนซ์นั้น

class Wallet {
    var balance = 50
    inner class Transaction(val amount: Int) {
        fun apply() { balance += amount }
    }
}

fun main() {
    val w = Wallet()
    w.Transaction(25).apply()
    println(w.balance)
}

คลาสภายในแต่ละตัวผูกกับคลาสภายนอกหนึ่งตัว

อินสแตนซ์ของคลาสภายในจะผูกกับอินสแตนซ์ภายนอกตัวเดียวกับที่สร้างมันขึ้นมา การเปลี่ยนแปลงจึงส่งผลต่อออบเจ็กต์นั้นโดยตรง

class Box(var size: Int) {
    inner class Resizer {
        fun grow() { size += 1 }
    }
}

fun main() {
    val b = Box(3)
    b.Resizer().grow()
    println(b.size)
}

คลาสภายในเทียบกับคลาส Nested

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

class Outer {
    val tag = "X"
    inner class A { fun get() = tag }
}

fun main() {
    println(Outer().A().get())
}

ข้อควรระวังด้านหน่วยความจำ

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

class Service {
    val id = 1
    inner class Worker { fun who() = id }
}

fun main() {
    println(Service().Worker().who())
}

ตัววนซ้ำที่ใช้ได้จริง

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

class Stack {
    private val items = mutableListOf(1, 2, 3)
    inner class Reader {
        fun all() = items.joinToString()
    }
}

fun main() {
    println(Stack().Reader().all())
}

การรวมแนวคิดเข้าด้วยกัน

คลาสภายในสามารถใช้สถานะของคลาสภายนอกและแยกความกำกวมด้วย this@Outer ได้

class Outer {
    val n = 5
    inner class Inner {
        fun doubled() = this@Outer.n * 2
    }
}

fun main() {
    println(Outer().Inner().doubled())
}

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

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

สรุปทบทวน

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

  • inner ทำให้เข้าถึงอินสแตนซ์ภายนอกและสมาชิกของอินสแตนซ์นั้นได้
  • สร้างผ่านอินสแตนซ์ภายนอก: Outer().Inner()
  • ใช้ this@Outer เพื่ออ้างอิงอินสแตนซ์ที่ครอบคลุมอยู่
  • อินสแตนซ์ของคลาสภายในจะทำให้อินสแตนซ์ภายนอกยังคงอยู่ในหน่วยความจำ
class Outer {
    val v = 1
    inner class Inner { fun get() = v }
}

fun main() {
    println(Outer().Inner().get())
}

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

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

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

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

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

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

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

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

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

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

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

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

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