- Kotlin系列
0.【翻譯】Using Kotlin for Android Development
1.Kotlin入門(一):變量的聲明和使用
2.Kotlin入門(二):方法的定義和使用
3.Kotlin入門(三):if, when, for, while
4.Kotlin入門(四):null安全(“?”键畴,“?:”,“!!”)
5.Kotlin入門(五):類與繼承
6.Kotlin入門(六):內聯方法
7.Kotlin入門(七):enum,data诈唬,sealed鞋喇,object
類的創(chuàng)建
與Java一樣窃页,Kotlin也是用class關鍵字聲明類啤覆。
class User{}
Kotlin中一個類可以有一個主構造方法(primary constructor)和一個或多個次構造方法( secondary constructors)徙鱼。
主構造方法
主構造方法通過在類名后面添加constructor和參數實現:
class User private constructor(name: String) {}
如果沒有注解和可見的修飾符宅楞,constructor關鍵字可以省略:
class User(name: String) {}
-
初始化順序
類內部的init模塊和變量的初始化順序按照他們出現的順序進行
fun main(args: Array<String>) {
User("mao")
}
class User(name: String) {
val firstProperty = "First property".also(::println)
init {
println("First initializer")
}
val secondProperty = "Second property".also(::println)
init {
println("Second initializer")
}
}
輸出:
First property
First initializer
Second property
Second initializer
- 成員變量和init模塊在初始化時可直接使用主構造方法中的參數
class User(name: String) {
var mName = name
init {
var mName = name
}
}
次構造方法
- 次構造方法也使用constructor實現
class User {
var name: String = ""
constructor(name: String) {
this.name = name
}
}
- 當類聲明了主構造方法,所有次構造方法必須直接或間接調用主構造方法
class User() {
constructor(name: String) : this() {
print("conconstructor")
}
constructor(name: String, age: Int) : this(name) {}
}
- 類中的變量初始化和init模塊初始化都是主構造方法的一部分袱吆,所以都在次構造方法之前執(zhí)行
fun main(args: Array<String>) {
User("mao")
}
class User() {
constructor(name: String) : this() {
print("conconstructor")
}
var name = "property".also(::println)
init{
println("init")
}
}
輸出:
property
init
conconstructor
- 當一個類沒有任何構造方法時傍菇,默認生成一個public類型的無參主構造方法褐奥,如果不希望這個默認構造方法存在强胰,可以主動聲明一個主構造方法
class User private constructor() {}
繼承
- Kotlin中的類默認是final類型的侨歉,想要被繼承,得用“open”關鍵字修飾处铛。
open class Shape {}
class Rectangle : Shape {}
- 子類的所有構造構造方法必須直接或間接調用一個父類的構造方法
open class Shape {
constructor(name: String) {
print(name)
}
}
class Rectangle : Shape {
constructor(name: String) : super(name) {}
constructor(name: String, age: Int) : this(name) {}
}
-
方法重寫
繼承過程中饲趋,只有open修飾的方法才能被重寫,重寫時要用override修飾撤蟆。
open特性也能被繼承奕塑,想要斷了open特性,只需用final修飾即可家肯。
open class Shape {
open fun method() {}
}
open class Rectangle : Shape() {
override fun method() {}
}
class Square : Rectangle() {
final override fun method() {}
}
-
成員變量重寫
與方法重寫相同龄砰,只有open修飾的變量才能被重寫,open同樣可以繼承,也可以用final中斷换棚。
重寫過程中式镐,變量可由val類型變?yōu)関ar類型,反之則不行固蚤。
open class Shape {
open val name: String = "Shape"
}
open class Rectangle : Shape() {
override var name: String = "Rectangle"
}
class Square : Rectangle() {
final override var name = "Square"
}
-
調用父類方法和成員變量
可通過“super”關鍵字調用父類的方法和成員變量
open class Shape {
open val name: String = "Shape"
open fun draw() {}
}
open class Rectangle : Shape() {
override var name: String = super.name
override fun draw() {
super.draw()
}
}
-
內部類調用外部類父類的方法
使用“super@Outer”方式:
open class Sup {
open fun method() { println("Sup.method") }
}
class Sub:Sup(){
inner class Inner{
fun test(){
super@Sub.method()
}
}
}
- 當繼承的類和接口當中出現相同的方法(方法名和參數都相同)娘汞,通過類似泛型的方法明確調用哪個方法
interface Action {
fun eat() {
println("Action")
}
}
open class Animal {
open fun eat() {
println("Animal")
}
}
class Human() : Animal(), Action {
override fun eat() {
super<Action>.eat()
super<Animal>.eat()
}
}