使用class關(guān)鍵字聲明類,查看其聲明格式:
:modifiers("class"|"interface") SimpleName
typeParameters?
primaryConstructor??
(":"annotations delegationSpecifier{","})?
typeConstraints(classBody? | enumClassBody)modifiers
包括classModifier和accessModifier:
classModifier:類屬性修飾符,標示類本身特性
//抽象類標示 abstract //標示類不可繼承,默認屬性 final //標示類為枚舉 enum //類可繼承,類默認是final的 open //注解類 annotation
accessModifier:訪問權(quán)限標識符
//僅在同一個文件中可見 private //同一個文件中或子類可見 protected //所有調(diào)用的地方都可見 public //同一個模塊中可見 internal
類的聲明
類聲明由類名、類頭(指定其類型參數(shù)、主 構(gòu)造函數(shù)等)和由大括號包圍的類體構(gòu)成。類頭和類體都是可選的; 如果一個類沒有類體,可以省略話括號。
class Empty
構(gòu)造函數(shù)
可以包含一個主構(gòu)造函數(shù)和一個或者多個次構(gòu)造函數(shù)。主構(gòu)造函數(shù)是類頭的一部分,它跟在類名(和可選的類型參數(shù))后。
class Person constructor(firstName: String){
}如果主構(gòu)造函數(shù)有任何注解或者可見性修飾符,需要增加constructor關(guān)鍵字
class Person public @Inject constructor(firstName: String){
}1:主構(gòu)造函數(shù)(Primary constructor)
主構(gòu)造函數(shù)不能包含任何的代碼,初始化的代碼可以放到以 init 為前綴的初始化塊(initializer blocks)中:
1.1:聲明:
作為類聲明的頭部存在,類聲明結(jié)構(gòu)如下:
class Person constructor(name: String){
}當constructor前無修飾符如(private)時,可以省略constructor
class Person(name: String){
}當是無參構(gòu)造函數(shù)時,整個構(gòu)造函數(shù)部分也可以省略,省略的構(gòu)造函數(shù)默認是public的:
class Person{
}
1.2:初始化
由于primary constructor不能包含任何代碼,因此使用 init 代碼塊進行初始化,同時可以在代碼塊中使用構(gòu)造函數(shù)的參數(shù):
class Person(name: String){
init {
// 初始化...
}
}
可以類中初始化屬性:
class Person(name: String){
? ? var customName = name.toUpperCase()
}
2:次構(gòu)造函數(shù)(Secondary Constructor)
2.1:聲明
使用constructor進行聲明,必須調(diào)用主構(gòu)造函數(shù)(Primary Constructor),使用this關(guān)鍵字:
/**
* Primary constructor
*/
class Person(name: String) {
? ? // secondary constructor
? ? //使用constructor前綴聲明,且必須調(diào)用primary constructor,使用this關(guān)鍵字:
? ? constructor(name: String,age: Int) :this(name) {
? ? ? ? //初始化...
? ? }
}
需要注意的地方:聲明構(gòu)造函數(shù)時,允許指定參數(shù)默認值,若所有參數(shù)都被指定默認值然后編譯,編譯器會生成一個額外的無參構(gòu)造函數(shù)來使用初始化屬性為初始值。
class User(name: String="") {
}
若構(gòu)造函數(shù)中并非所有參數(shù)都有默認值,則不會生成默認無參構(gòu)造函數(shù):
class User(name: String="", age: Int) {
}
3:實例化
無需new關(guān)鍵字,即可實例化對象:
var User = User()