類聲明
使用class關鍵字聲明類,查看其聲明格式:
1
2
3
4
5
6
|
: modifiers ( "class" | "interface" ) SimpleName typeParameters? primaryConstructor? ( ":" annotations delegationSpecifier{ "," })? typeConstraints (classBody? | enumClassBody) |
最簡略的類聲明至少包括 modifiers class SimpleName,如:
1
|
class Empty |
modifiers
包括 classModifier 和accessModifier:
1
2
3
4
5
6
|
classModifier: 類屬性修飾符,標示類本身特性。 abstract //抽象類標示 final //標示類不可繼承,默認屬性 enum //標示類為枚舉 open //類可繼承,類默認是final的 annotation //注解類 |
accessModifier: 訪問權限修飾符
1
2
3
4
|
private //僅在同一個文件中可見 protected //同一個文件中或子類可見 public //所有調用的地方都可見 internal //同一個模塊中可見 |
構造函數聲明
可以聲明一個主構造函數(primary constructor)和多個次級構造函數(secondary constructor),二者都是可選的。
primary constructor聲明
作為類聲明的頭部存在,類聲明結構:
1
|
class User constructor(name:String) |
當constructor前無修飾符(如:private)時,constructor可以省略:
1
|
class User(name:String) |
當是無參構造函數時,整個構造函數部分也可以省略,省略的構造函數默認是public的:
1
|
class User |
primary constructor 初始化
由于primary constructor不能包含任何代碼,因此使用 init 代碼塊對其初始化,同時可以在初始化代碼塊中使用構造函數的參數:
1
2
3
4
5
|
class User(name:String){ init{ //初始化.. } } |
可以類中初始化屬性:
1
2
3
|
class User(name:String){ var customName = name.toUpperCase() //初始化屬性 } |
secondary constructor聲明
使用constructor前綴聲明,且必須調用primary constructor,使用this關鍵字:
1
2
3
4
5
6
7
|
class User(name:String){ /**secondary constructor**/ constructor(name:String,age:Int): this (name){ //初始化... } } |
聲明構造函數時,允許指定參數默認值,若所有參數都被指定默認值然后編譯,編譯器會生成一個額外的無參構造函數來使用初始化屬性為初始值。
1
|
class User(name:String = “”) |
作為校驗,上述聲明方式允許如下調用:
1
2
|
var user = User() var anotherUser = User( "jason" ) |
若構造函數中并非所有參數都有默認值,則不會生成默認無參構造函數:
1
2
3
|
class User(name:String = "" ,age = Int) var user = User() //將無法編譯通過 var anotherUser = User( "jason" , 18 ) //合法聲明 |
實例化
無需new關鍵字,即可實例化對象:
1
|
var user = User() |
繼承(Inheritance)
Any
所有類都繼承該類,提供默認的三個函數:
1
2
3
|
equals() hashCode() toString() |
繼承聲明
在類的構造函數之后使用 : 標示繼承:
1
2
3
|
class Student(name:String,age:Int):User(name,age){ } |
當類未聲明構造函數時,繼承其他類時,也不需要在primary constructor中顯示的聲明構造函數,必須在secondary constructor中顯示調用父類構造函數,若父類有多個構造函數,可選擇其一進行調用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/**用戶基類**/ open class User(name:String){ /**secondary constructor**/ constructor(name:String,age:Int): this (name){ //初始化 } } /**子類繼承User類**/ class Student:User{ /**構造函數**/ constructor(name:String): super (name){ } /**另外一個構造函數**/ constructor(name:String,age:Int): super (name,age){ } } |
所有類定義時默認是final屬性,不可被繼承。若需要繼承,使用open關鍵字進行修飾。
方法重載
方法默認是final的,不可被子類重載,若需要被重載,使用關鍵詞 open 進行修飾,子類重載方法使用 override 關鍵詞:
1
2
3
4
5
6
7
8
9
10
|
open class User{ open fun study(){} fun run(){} } class Student:User{ override fun study(){} } |
override修飾的方法,默認是可以被繼承的。若希望不被繼承,可以使用 final 關鍵詞修飾。
1
|
final override fun study(){} |
重載規則
當類同時繼承類和實現接口,且有相同方法,且相同方法都有實現時,需要在重載方法中調用所繼承的方法,使用關鍵詞 super ,T表示所繼承或實現的接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
open class User{ open fun study(){} } interface Reading{ fun study(){} } class Student:User(),Reading{ override fun study(){ super <User>.study() super <Reading>.study() //與上者至少二選其一 } } |
當接口未實現方法時,默認為父類User的study方法,不需要調用所繼承的方法:
1
2
3
4
5
6
7
8
9
|
interface Reading{ fun study() } class Student:User(),Reading{ override fun study(){ //do nothing } } |
抽象類
Kotlin中的抽象類允許有abstract修飾的成員方法,非抽象類不允許有抽象方法;
1
2
3
4
5
6
7
|
abstract class User{ abstract fun study() } class Person{ abstract fun study() // 編譯錯誤 } |
抽象類默認是可被繼承的,接口是特殊的抽象類,允許有抽象方法:
1
2
3
|
interface Reading{ abstract fun reading() } |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!