繼承
Kotlin的類預設都是封閉的,要讓某個類開放繼承,必須使用open關鍵字修飾它。
open class Product(val name: String) {}
class LuxuryProduct(name: String, private val price:Double):Product(name){}

方法重寫和重載
父類的函數也要通過open關鍵字修飾才可以被子類重寫。
open class Product(val name: String) {
fun description() = "Product:$name"
//方法重載
open fun load() {
"Nothing..."
}
open fun load(name: String) {
println("$name is very expensive")
}
}
class LuxuryProduct(name: String, private val price: Double) : Product(name) {
//方法重寫
override fun load() {
super.load()
println("${super.description()},Price:$price")
}
}
fun main() {
val luxuryProduct: Product = LuxuryProduct("LV", 19800.00)
println(luxuryProduct.description())
luxuryProduct.load()
luxuryProduct.load("LV")
}
類型檢測
Kotlin的is運算符是一個不錯的工具,可以用來檢查某個對象的類型,其實就相當于Java中的instanceof關鍵字。
println(luxuryProduct is Product)
println(luxuryProduct is LuxuryProduct)
println(luxuryProduct is File)
類型轉換
通過as操作符完成類型轉換,而且轉換一次,後面再使用時無需轉換。
open class Product0(val name: String) {
fun special() = "Product0 special function"
}
class LuxuryProduct0 : Product0("Luxury") {}
fun main() {
val lp = LuxuryProduct0()
println((lp as Product0).special())
//隻需要轉換一次,後面無需轉換,也不需要用臨時變量去存
println(lp.special())
println(lp.special())
}
Kotlin編譯器很聰明,隻要能确定any is父類條件檢查屬實,就會将any當做子類類型對待,是以編譯器允許我們不經類型轉換直接使用。
open class Product2(val name: String) {
fun load() {
println(name)
}
}
fun sale(p: Product2) {
p.load()
}
class LuxuryProduct2(name: String, private val price: Double) : Product2(name) {}
fun main() {
val lp2 = LuxuryProduct2("LV", 19800.00)
//傳入的參數是Product2的子類對象lp2
//sale(lp2 as Product2)
sale(lp2)
}
Any
無須在代碼裡顯示指定,每一個類都會繼承一個共同的叫做Any的超類。
Object
使用Object關鍵字,我們可以定義一個隻能産生一個執行個體的類 ———— 單例。
使用Object有三種方式:對象聲明、對象表達式、伴生對象。
對象聲明
object ApplicationConfig{
init {
println("ApplicationConfig loading...")
}
fun doSomething(){
println("doSomething")
}
}
fun main() {
//ApplicationConfig既是類名,也是執行個體名
ApplicationConfig.doSomething()
println(ApplicationConfig)
println(ApplicationConfig)
}