一、類的聲明
1、關鍵字
聲明類的關鍵字為class
二、類的構(gòu)造函數(shù)
- 在Kotlin中,允許有一個主構(gòu)造函數(shù)和多個二級構(gòu)造函數(shù)(次構(gòu)造函數(shù))。其中主構(gòu)造函數(shù)是類頭的一部分。
- 關鍵字或者構(gòu)造函數(shù)名:constructor(參數(shù))
主構(gòu)造器
主構(gòu)造器中不能包含任何代碼,初始化代碼可以放在初始化代碼段中,初始化代碼段使用 init 關鍵字作為前綴。
class Person constructor(firstName: String) {
init {
println("FirstName is $firstName")
}
}
次構(gòu)造函數(shù)
類也可以有二級構(gòu)造函數(shù),需要加前綴 constructor:
class Person {
constructor(parent: Person) {
parent.children.add(this)
}
}
如果類有主構(gòu)造函數(shù),每個次構(gòu)造函數(shù)都要,或直接或間接通過另一個次構(gòu)造函數(shù)代理主構(gòu)造函數(shù)。在同一個類中代理另一個構(gòu)造函數(shù)使用 this 關鍵字:
class Person(val name: String) {
constructor (name: String, age:Int) : this(name) {
// 初始化...
}
}
抽象類
抽象是面向?qū)ο缶幊痰奶卣髦?,類本身,或類中的部分成員,都可以聲明為abstract的。抽象成員在類中不存在具體的實現(xiàn)。
注意:無需對抽象類或抽象成員標注open注解。
open class Base {
open fun f() {}
}
abstract class Derived : Base() {
override abstract fun f()
}
嵌套類
嵌套類使用 Nested 關鍵字來表示。
class Outer { // 外部類
private val bar: Int = 1
class Nested { // 嵌套類
fun foo() = 2
}
}
fun main(args: Array<String>) {
val demo = Outer.Nested().foo() // 調(diào)用格式:外部類.嵌套類.嵌套類方法/屬性
println(demo) // == 2
}
內(nèi)部類
- 內(nèi)部類使用 inner 關鍵字來表示。
- 內(nèi)部類會帶有一個對外部類的對象的引用,所以內(nèi)部類可以訪問外部類成員屬性和成員函數(shù)。
class Outer {
private val bar: Int = 1
var v = "成員屬性"
/**嵌套內(nèi)部類**/
inner class Inner {
fun foo() = bar // 訪問外部類成員
fun innerTest() {
var o = this@Outer //獲取外部類的成員變量
println("內(nèi)部類可以引用外部類的成員,例如:" + o.v)
}
}
}
fun main(args: Array<String>) {
val demo = Outer().Inner().foo()
println(demo) // 1
val demo2 = Outer().Inner().innerTest()
println(demo2) // 內(nèi)部類可以引用外部類的成員,例如:成員屬性
}
類的修飾符
類屬性修飾符,標示類本身特性。
abstract // 抽象類
final // 類不可繼承,默認屬性
enum // 枚舉類
open // 類可繼承,類默認是final的
annotation // 注解類
訪問權限修飾符
private // 僅在同一個文件中可見
protected // 同一個文件中或子類可見
public // 所有調(diào)用的地方都可見
internal // 同一個模塊中可見