Kotlin筆記四,類和繼承

2021-09-28 16:38:33 字數 3592 閱讀 4370

kotlin 中使用關鍵字 class 宣告類

class animal
類宣告由類名、類頭(指定其型別引數、主建構函式等)以及由花括號包圍的類體構成。類頭與類體都是可選的;

如果乙個類沒有類體,可以省略花括號。

class animal
在 kotlin 中的乙個類可以有乙個主建構函式以及乙個或多個次建構函式。

主建構函式

主建構函式是類頭的一部分:它跟在類名(與可選的型別引數)後。

class man constructor(name: string)
如果主建構函式沒有任何註解或者可見性修飾符,可以省略這個 constructor 關鍵字。

class man (name: string)
可見性修飾符

kotlin 中有這四個可見性修飾符:private、 protected、 internal 和 public。

如果建構函式有註解或可見性修飾符,這個 constructor 關鍵字是必需的,並且這些修飾符在它前面:

class man public constructor(name: string)
函式、屬性和類、物件和介面可以在頂層宣告,即直接在包內

如果你不指定任何可見性修飾符,預設為 public,這意味著你的宣告將隨處可見;

如果你宣告為 private,它只會在宣告它的檔案內可見;

如果你宣告為 internal,它會在相同模組內隨處可見;

protected 不適用於頂層宣告。

對於類內部宣告的成員:

private   意味著只在這個類內部(包含其所有成員)可見;

protected 和 private一樣 + 在子類中可見。

internal 能見到類宣告的 本模組內 的任何客戶端都可見其 internal 成員;

public 能見到類宣告的任何客戶端都可見其 public 成員。

初始化的**可以放到以 init 關鍵字作為字首的初始化塊(initializer blocks)中。

class animal 

} var animal = animal()

println("animal ---"+animal.name)

//this is animal!

//animal ---動物

可以寫多個init{},會按順序執行

次建構函式

類也可以宣告字首有 constructor的次建構函式:

class man 

constructor(name :string)

constructor(name :string,age :int)

constructor(name :string,age :int,score :int)

} val man = man("辯護人")

val xiuman = man("泰秀",18)

val zhongman = man("一中",18,88)

輸出system.out: init ---

system.out: name --- 辯護人

system.out: init ---

system.out: name ---泰秀 ---- age : 18

system.out: init ---

system.out: name ---一中 ---- age : 18 ----- score : 88

init {}**塊會優先於次建構函式執行

建立類的例項

直接呼叫建構函式即可。kotlin 中沒有 new 關鍵字

val man  = man("辯護人")
在 kotlin 中所有類都有乙個共同的超類 any,這對於沒有超型別宣告的類是預設超類:

class example        //從 any 隱式繼承
any 有三個方法:equals()、 hashcode() 與 tostring()

/**

* the root of the kotlin class hierarchy. every kotlin class has [any] as a superclass.

*/public open class any

宣告乙個顯式的超型別,在類頭中把超型別放到冒號之後即可:

如果派生類有乙個主建構函式,其基型別必須用基類的主構造函式引數就地初始化。

open class an(

var name :string

)class person(name: string):an(name)

如果派生類沒有主建構函式,那麼每個次建構函式必須使用 super 關鍵字初始化其基型別,

class customview : view
覆蓋方法

對於可覆蓋的成員(我們稱之為開放)以及覆蓋後的成員需要顯式修飾符:

open class animal()

fun eat()

}class horse() : animal()

}

horse.run() 函式上必須加上 override 修飾符。不加會報錯。

eat()方法子類不可以重寫。

open 修飾符對新增了final的類不起作用。

派生類中的**可以使用 super 關鍵字呼叫其超類的函式與屬性訪問器的實現:

open class animal()

fun eat()

open var total : int = 100;

var age :int = 18

}class horse() : animal()

override var total = 99

var horseage = super.age

}

覆蓋規則

如果乙個類從它的直接超類繼承相同成員的多個實現, 它必須覆蓋這個成員並提供其自己的實現。

為了表示採用從哪個超型別繼承的實現,我們使用由尖括號中超型別名限定的 super:

open class pen()

}//介面成員預設就是「open」的

inte***ce colourpen

}class *****() : pen(),colourpen

}

抽象類

類以及其中的某些成員可以宣告為 abstract。

可以用乙個抽象成員覆蓋乙個非抽象的開放成員。

open class pen()

}abstract class brushpen : pen()

派生類繼承時必須重寫draw()方法

class blackpen : brushpen()

}

《Inside C 》筆記 四 類

類是對資料結構和演算法的封裝。一 類成員 類成員包括以下幾類,作者在後面的章節會詳細講解。字段 用來儲存資料,可用static readonly const來修飾 方法 運算元據的 屬性 用來控制對類內部變數的訪問 常量 索引器 事件和運算子。二 訪問修飾符 public 可被外部的類和派生類訪問 ...

c 學習筆記(四) 類和結構

類的預設訪問許可權是private 結構是public 該關鍵字修飾的變數可以在類的const方法中修改 class node 建議使用如下方式 正確 constref constref int ii i ii ci ii ri ii 錯誤 constref constref int ii 原因 效...

C 練習(四)類和物件

構建乙個類book,其中含有兩個私有資料成員qu和price,建立乙個有5個元素的陣列物件,將qu初始化1 5,將price初始化為qu的10倍。顯示每個物件的qu price。標頭檔案book.h includeusing namespace std class book book成員函式.cpp...