KotLin--類和繼承

這篇文章,主要介紹kotlin中如何創(chuàng)建類,以及類的繼承等等。在介紹這個(gè)類之前。不得不介紹一下kotlin中的超類了,我們都知道java中的超類是Object,那么kotlin中的超類是什么?其實(shí)是Any,看到這個(gè)單詞我們也能聯(lián)想到就是任何的意思。應(yīng)該就是超類。但是這個(gè)超類, 它除了 equals()、hashCode()和toString()外沒有任何成員。這也跟Object有些不同。
  介紹完超類后,我們開始介紹普通類。kotlin中的類關(guān)鍵字 也是 class ,所有的類如果不指明超類的話,那么它默認(rèn)的超類就是Any。

類的創(chuàng)建

class people{
}

那么kotlin 中的類的構(gòu)造如何使用呢?在kotlin 中類可以有一個(gè)主構(gòu)造和多個(gè)次構(gòu)造。主構(gòu)造跟在類名后。構(gòu)造的關(guān)鍵字為constructor ,如果該構(gòu)造沒有修飾符的話。則可以省略constructor 關(guān)鍵字

class people  constructor(name: String){
}
---or---
class  people (name : String){
}

在kotlin中主構(gòu)造函數(shù)是不能有代碼的,所以初始化的代碼,可以放在init 關(guān)鍵字的初始化代碼塊中

class people (name: String){
         init{
            //=初始化代碼 
      }
}

需要注意的是。如果我們的類有一個(gè)主構(gòu)造函數(shù)。那么其他的次構(gòu)造函數(shù)需要調(diào)用這個(gè)主構(gòu)造函數(shù)?;蛘唛g接通過其他次構(gòu)造函數(shù)調(diào)用主構(gòu)造函數(shù),調(diào)用主構(gòu)造函數(shù)的關(guān)鍵字是this,這個(gè)可能有點(diǎn)繞。我下面寫個(gè)例子大家就明白了。

class people  constructor(name:  String){
           constructor( name: String , age: Int) :this(name) {
            }
           constructor(name: String ,age: Int ,sex: Int) : this(name,age){
            }
}

如果一個(gè)非抽象類沒有聲明任何(主或次)構(gòu)造函數(shù),它會(huì)有一個(gè)生成的不帶參數(shù)的主構(gòu)造函數(shù)。
  介紹完了 類的創(chuàng)建,下面介紹下類如何創(chuàng)建實(shí)例的。和java不同的是,kotlin中創(chuàng)建類的實(shí)例。不用new 。

     val   peo=people(" xxx")

類的繼承

kotlin 里關(guān)于類的繼承。如我文章開始所說,超類是Any,如果沒有指定超類那么默認(rèn)的超類就是Any,繼承則用: 來指定超類是誰,kotlin 中 所有的類默認(rèn)都是final 的 也就是 不能繼承的,如果你創(chuàng)建的類作為超類的話,必須要用open 關(guān)鍵字表示可以公開 可以繼承。
  并且子類繼承了父類,如果子類有主構(gòu)造函數(shù),那么子類需要在主構(gòu)造函數(shù)后初始化調(diào)用父類的構(gòu)造函數(shù)。類似于java

class Base (name : String)

class child (name : String) : Base(name) 

若子類沒有主構(gòu)造函數(shù),那么可以在次構(gòu)造函數(shù)后 來調(diào)用父類的構(gòu)造函數(shù)。但需要使用super 關(guān)鍵字來表示

class child{
         constructor(name: String) : super(name)
}
抽象類

抽象類,使用abstract 關(guān)鍵字來修飾。類和其中的某些成員可以聲明為 abstract。 抽象成員在本類中可以不用實(shí)現(xiàn)。 需要注意的是,我們并不需要用 open 標(biāo)注一個(gè)抽象類或者函數(shù),因?yàn)?抽象就是為了其他類來繼承的。

abstrat class peopel{
    abstract fun f()
}
方法的覆蓋(重寫)

kotlin中子類若想重寫父類方法。那么就要將父類的方法 用open 關(guān)鍵字來修飾。否則子類是不可以與父類聲明相同方法的。除了父類要用open 關(guān)鍵字修飾。子類重寫的方法 也要用override 關(guān)鍵字來修飾。如果使用了override 關(guān)鍵字的方法默認(rèn)是與open 相同就是也可以接受子類來重寫。 如果 不想子類 重寫 則在override 關(guān)鍵字前 使用final 來修飾。

  class parent{
       open fun sum(a: Int, b: Int){ }
}

class child :parent {
      override fun  sum(a: Int, b: Int){ }
      ---or -----
      final override  fun sum(a: Int ,b: Int){}
}
覆蓋的規(guī)則

kotlin 中也支持類有多個(gè)超類, 而且多個(gè)超類有相同的方法 或者成員,那么 子類必須 覆蓋 該相同的成員或方法并提供自己的實(shí)現(xiàn) ,這是由于無法區(qū)分子類到底如何處理相同的有沖突的成員或方法, 所以 為了表示采用從哪個(gè)超類型繼承的實(shí)現(xiàn),我們使用由尖括號(hào)中超類型名限定的 super,如 super<xxx>:下面舉個(gè)栗子

open class A {
    open fun f() { print("A") }
}

interface B {
    fun f() { print("B") } // 接口成員默認(rèn)就是“open”的

}

class C() : A(), B {
    // 編譯器要求覆蓋 f(): 這里可以寫子類自己的實(shí)現(xiàn)。若要調(diào)用父類的可以用super 來調(diào)用。
    override fun f() {
        super<A>.f() // 調(diào)用 A.f()
        super<B>.f() // 調(diào)用 B.f()
  }
}

以上關(guān)于 kotlin 中的類的創(chuàng)建 以及 介紹了 類的繼承 規(guī)則 包括 子類如何覆蓋 父類的方法做了介紹。下一篇將會(huì)進(jìn)一步來介紹類的成員屬性等其他有關(guān)部分的使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址 Classes 類在Kotlin中使用class關(guān)鍵字被聲明 類聲明由類名和類頭組成(指定它的類型參數(shù),...
    CyrusChan閱讀 656評(píng)論 0 3
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,699評(píng)論 9 118
  • Kotlin最簡單的入門教程——環(huán)境Kotlin最簡單的入門教程——基礎(chǔ)類型(一)Kotlin最簡單的入門教程——...
    next_discover閱讀 3,547評(píng)論 0 1
  • 本文是學(xué)習(xí)Kotlin的類和繼承相關(guān),嵌套類相關(guān),接口相關(guān)。 類 Kotlin的類的聲明與Java一樣,使用cla...
    叫我旺仔閱讀 14,312評(píng)論 4 14
  • 一定是很多生活中的細(xì)節(jié),人情之間的細(xì)節(jié),你沒有注意到。否則,你不可能錯(cuò)過那么多東西的。
    生姜27閱讀 171評(píng)論 0 0

友情鏈接更多精彩內(nèi)容