【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )
文章目錄
- I . 類繼承基本方式
- II . 使用 final 禁止類繼承 / 方法重寫
- III . 父類沒有主構造函數
- IV . 父類有主構造函數
- V . 父類構造函數與子類構造函數總結
I . 類繼承基本方式
0 . 類繼承格式 : 使用 " : " 繼承父類 ; 如果該父類有主構造函數 , 那么子類必須至少有一個主構造函數或次構造函數 , 子類的構造函數下面會根據不同情況詳細解析 ;
//注意這里的父類構造函數需要實際調用 class 子類 : 父類 {//子類函數體override fun 被重寫的父類方法名 ( 被重寫的父類方法參數 ){//要執行的函數內容} }1 . 類繼承限制 : 子類使用 : 父類 ( 父類構造函數參數列表 )
① 類繼承限制 : 只有被 open 修飾的類 , 才能有子類繼承該類 , 普通的類不允許被繼承 ;
② 類方法被重寫限制 : 只有被 open 修飾的方法 , 才能被子類重寫 , 被重寫的子類函數 , 必須使用 override 修飾 ;
③ open 修飾類限制 : open 關鍵字不能修飾 final 類 , 給 final 類添加 open 修飾編譯報錯 ;
2 . 類繼承代碼示例 :
//定義父類 , 必須被 open 修飾 , 需要子類重寫的方法也要被 open 修飾 open class Father{open fun action(){ println("Father")} }//定義子類 , 子類重寫父類方法必須添加 override 修飾函數 class Son : Father() {override fun action() { println("Son") } }II . 使用 final 禁止類繼承 / 方法重寫
final 修飾類 : 如果類被 final 關鍵字修飾 , 那么該類無法被 open 關鍵字修飾 , 也就無法被繼承 ;
final 修飾方法 : 如果類中的函數被 final 關鍵字修飾 , 那么該類無法被 override 重寫 ;
III . 父類沒有主構造函數
1 . 父類沒有主構造函數 : 準確的說是 , 父類的主構造函數沒有參數 , 省略了 constructor 關鍵字和空的括號 () ;
2 . 省略 constructor 和 () 的代碼示例 : 下面的兩個類是等價的 , 只是第一個是類定義的標準形式 , 第二個省略了 constructor 關鍵字和空的括號 ;
open class Father constructor(){open fun action(){ println("Father")} }open class Father{open fun action(){ println("Father")} }3 . 子類有主構造函數 : 父類必須在主構造函數中初始化 , 子類的 constructor() 可以省略 ; " : " 后的 Father() 相當于調用了父類的主構造函數 , 將子類的主構造函數委托給父類的主構造函數執行 ;
open class Father{open fun action(){ println("Father")} }//constructor() 可以省略 class Son constructor() : Father() {override fun action() { println("Son") } }//與上面的 Son 是等價的 , 省略了 constructor() class Son : Father() {override fun action() { println("Son") } }4 . 子類沒有主構造函數 : 此時子類的每個次構造函數都必須委托父類的主構造函數執行 ;
open class Father{open fun action(){ println("Father")} }class Son : Father {constructor() : super(){}constructor(age : Int) : super(){}override fun action() { println("Son") } }IV . 父類有主構造函數
1 . 如果父類有主構造函數 : 其中的 constructor 如果沒有注解與可見性操作符 , 可以省略 ;
open class Father constructor(var name : String , var age : Int){open fun action(){ println("Father")} }2 . 子類有主構造函數 : 子類需要在主構造函數中定義需要的變量 , 其中的參數 , 可以直接傳遞給后面委托調用的主構造函數 ;
class Son constructor (name : String, age: Int) : Father(name, age) {override fun action() { println("Son") } }3 . 子類沒有主構造函數 : 如果沒有主構造函數 , 那么子類必須有次構造函數 , 子類需要在次構造函數中定義需要的變量 , 其中的參數 , 可以直接傳遞給后面 super ( ) 委托調用的主構造函數 ;
class Son : Father {constructor (name : String, age: Int) : super(name, age){}override fun action() { println("Son") } }V . 父類構造函數與子類構造函數總結
子類構造函數最終委托 : 子類的構造函數歸根到底都要委托給父類的主構造函數 ;
① 子類主構造函數 : 假如子類有主構造函數 , 該主構造函數肯定要委托父類的主構造函數執行 ;
② 子類次構造函數 : 此時子類的次構造函數都要委托子類的主構造函數執行 , 相當于間接委托父類主構造函數執行 ;
總結
以上是生活随笔為你收集整理的【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】Kotlin 构造函数
- 下一篇: 【Kotlin】Kotlin 类的继承