kotlin的 類,繼承,過載,抽象類,建構函式
主要內容
- 類宣告
- 建構函式宣告
- 例項化
- 繼承
- 方法過載
- 抽象類
一、類宣告
使用class關鍵字宣告類,檢視其宣告格式:
: modifiers ("class" | "interface") SimpleName
typeParameters?
primaryConstructor?
(":" annotations delegationSpecifier{","})?
typeConstraints
(classBody? | enumClassBody)
最簡略的類宣告至少包括 modifiers class SimpleName,如:
class Empty
modifiers
包括 classModifier 和_accessModifier_:
-
classModifier: 類屬性修飾符,標示類本身特性。
abstract //抽象類標示 final //標示類不可繼承,預設屬性 enum //標示類為列舉 open //類可繼承,類預設是final的 annotation //註解類
-
accessModifier: 訪問許可權修飾符
private //僅在同一個檔案中可見 protected //同一個檔案中或子類可見 public //所有呼叫的地方都可見 internal //同一個模組中可見
二、建構函式宣告
可以宣告一個主建構函式(primary constructor)
primary constructor宣告
作為類宣告的頭部存在,類宣告結構:
class User constructor(name:String)
當constructor前無修飾符(如:private)時,constructor可以省略:
class User(name:String)
當是無參建構函式時,整個建構函式部分也可以省略,省略的建構函式預設是public的:
class User
primary constructor 初始化
由於primary constructor不能包含任何程式碼,因此使用 init
class User(name:String){
init{
//初始化..
}
}
可以類中初始化屬性:
class User(name:String){
var customName = name.toUpperCase() //初始化屬性
}
secondary constructor宣告
使用constructor字首宣告,且必須呼叫primary constructor,使用this關鍵字:
class User(name:String){
/**secondary constructor**/
constructor(name:String,age:Int):this(name){
//初始化...
}
}
宣告建構函式時,允許指定引數預設值,若所有引數都被指定預設值然後編譯,編譯器會生成一個額外的無參建構函式來使用初始化屬性為初始值。
class User(name:String = "")
作為校驗,上述宣告方式允許如下呼叫:
var user = User()
var anotherUser = User("jason")
若建構函式中並非所有引數都有預設值,則不會生成預設無參建構函式:
class User(name:String = "",age = Int)
var user = User() //將無法編譯通過
var anotherUser = User("jason",18) //合法宣告
三、例項化
無需new關鍵字,即可例項化物件:
var user = User()
四、繼承(Inheritance)
Any
所有類都繼承該類,提供預設的三個函式:
equals()
hashCode()
toString()
繼承宣告
在類的建構函式之後使用 : 標示繼承:
class Student(name:String,age:Int):User(name,age){
}
當類未宣告建構函式時,繼承其他類時,也不需要在primary constructor中顯示的宣告建構函式,必須在secondary constructor中顯示呼叫父類建構函式,若父類有多個建構函式,可選擇其一進行呼叫:
/**使用者基類**/
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 關鍵詞:
open class User{
open fun study(){}
fun run(){}
}
class Student:User{
override fun study(){}
}
override修飾的方法,預設是可以被繼承的。若希望不被繼承,可以使用 final 關鍵詞修飾。
final override fun study(){}
過載規則
當類同時繼承類和實現介面,且有相同方法,且相同方法都有實現時,需要在過載方法中呼叫所繼承的方法,使用關鍵詞 super<T> ,T表示所繼承或實現的介面:
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方法,不需要呼叫所繼承的方法:
interface Reading{
fun study()
}
class Student:User(),Reading{
override fun study(){
//do nothing
}
}
抽象類
Kotlin中的抽象類允許有abstract修飾的成員方法,非抽象類不允許有抽象方法;
abstract class User{
abstract fun study()
}
class Person{
abstract fun study() // 編譯錯誤
}
抽象類預設是可被繼承的,介面是特殊的抽象類,允許有抽象方法:
interface Reading{
abstract fun reading()
}