巢狀類是在另一個類中建立的類。 在Kotlin中,巢狀類預設是靜態的,因此可以在不建立類物件的情況下存取其資料成員和成員函式。 巢狀類無法存取外部類的資料成員。
class outerClass{
//outer class code
class nestedClass{
//nested class code
}
}
Kotlin巢狀類範例
class outerClass{
private var name: String = "Ashu"
class nestedClass{
var description: String = "code inside nested class"
private var id: Int = 101
fun foo(){
// print("name is ${name}") // cannot access the outer class member
println("Id is ${id}")
}
}
}
fun main(args: Array<String>){
// nested class must be initialize
println(outerClass.nestedClass().description) // accessing property
var obj = outerClass.nestedClass() // object creation
obj.foo() // access member function
}
執行上面範例程式碼,得到以下結果 -
code inside nested class
Id is 101
內部類是一個使用關鍵字inner
在一個類中建立的類。 換句話說,可以說標記為inner
的巢狀類稱為內部類。
內部類不能在介面或非內部巢狀類中宣告。
class outerClass{
//outer class code
inner class innerClass{
//nested class code
}
}
內部類優於巢狀類的優點是,即使它是私有的,它也能夠存取外部類的成員。 內部類保持對外部類的物件的參照。
Kotlin內部類範例
class outerClass{
private var name: String = "Maxsu"
inner class innerClass{
var description: String = "code inside inner class"
private var id: Int = 10010
fun foo(){
println("姓名:${name}") // access the outer class member even private
println("編號:${id}")
}
}
}
fun main(args: Array<String>){
println(outerClass().innerClass().description) // accessing property
var obj = outerClass().innerClass() // object creation
obj.foo() // access member function
}
執行上面範例程式碼,得到以下結果 -
code inside inner class
姓名:Maxsu
編號:10010