คลาสภายใน
เข้าถึงขอบเขตภายนอก
คลาสภายใน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ