Kotlin從入門到放棄(五) 類和對象
本篇主要記錄Kotlin對類和對象的具體用法,實現(xiàn)類的繼承和定義特殊的類骗卜。
1.類的構(gòu)造
1.1類的簡單定義
我們先來看看Android開發(fā)中見過多次的MainActivity類季二,在Java 中寫法如下:
public class MainActivity extend AppCompatActivity {
...
}
對應(yīng)的Kotlin代碼是下面這樣的:
class MainActivity : AppCompatActivity() {
...
}
Kotlin類對應(yīng)的寫法和Java之間有下面幾點區(qū)別:
- Kotlin省略關(guān)鍵字public竿滨,默認(rèn)它是開放的嘉抒。
- Kotlin用冒號“:”代替exdents迹鹅,也就是通過冒號表示繼承關(guān)系炼绘。
- Kotlin進(jìn)行繼承時织盼,父類后面多了括號“()”
我們從簡單的類定義開始巫财,下面是Animal動物類的定義
class Animal{
init{
println("這是個動物的類")
}
}
tx.setOnClickListener{
var animal = Animal()
}
- Kotlin對類進(jìn)行初始化的函數(shù)叫做init
- Kotlin在創(chuàng)建實例的時候省略了關(guān)鍵字new
1.2類的構(gòu)造函數(shù)
構(gòu)造函數(shù)的輸入?yún)?shù)直接加到類名后面盗似,init方法進(jìn)表示創(chuàng)建類實例的初始化函數(shù)。
class Animal constructor(context: Context, name: String){
init{
print("這是類的$name")
}
}
Kotlin設(shè)定主構(gòu)造函數(shù)不是必需的平项,我們可以把幾個構(gòu)造函數(shù)都放在類內(nèi)部的定義赫舒,從而都變成二級構(gòu)造函數(shù),去掉主構(gòu)造函數(shù)葵礼。
class Animal {
constructor(context: Context, name: String) {
print("這是$name")
}
constructor(context: Context, name: String, sex:Int) {
print("這是$name")
}
}
二級構(gòu)造函數(shù)與普通函數(shù)相比有下面幾個區(qū)別:
- 二級構(gòu)造函數(shù)沒有函數(shù)名稱号阿,只用關(guān)鍵字constructor表示這是一個構(gòu)造函數(shù)
- 二級構(gòu)造函數(shù)需要調(diào)用主構(gòu)造函數(shù)。
1.3帶默認(rèn)參數(shù)的構(gòu)造函數(shù)
Kotlin可以寫成帶默認(rèn)參數(shù)的構(gòu)造函數(shù)鸳粉,新的主構(gòu)造函數(shù)既能輸入兩個參數(shù)扔涧,又能輸入三個參數(shù)。
class Animal (context: Context, name: String, sex:Int = 0){
init {
}
}
2.類的成員
2.1成員屬性
Kotlin的屬性聲明代碼如下
class Animal (var context: Context, var name: String, val sex:Int = 0){
init {
}
}
- 在命名參數(shù)前面加“var”届谈,表示同時聲明與該參數(shù)同名的可變屬性并自動賦值
- 在命名參數(shù)前面加“val”枯夜,表示同時聲明與該參數(shù)同名的不可變屬性并自動賦值
但是如果某個字段并非入?yún)⒌耐麑傩裕托枰陬惖膬?nèi)部顯式聲明該屬性字段艰山。
class Animal (var context: Context, var name: String, val sex:Int = 0){
var sexName:String = "Kotlin"
init {
}
}
非空的成員屬性必須在聲明時賦值或者在構(gòu)造函數(shù)中賦值湖雹。
2.2成員方法
類的成員函數(shù)聲明和前面講解的函數(shù)聲明沒什么差異。
調(diào)用方式同Java曙搬。
2.3伴生對象
Kotlin取消了關(guān)鍵字static摔吏,無法直接聲明靜態(tài)類和靜態(tài)成員鸽嫂、方法。但是Kotlin引入了半生對象的概念征讲。利用伴生對象可以間接實現(xiàn)靜態(tài)成員的功能据某。
class Animal (var context: Context, var name: String, val sex:Int = 0){
var sexName:String = "Kotlin"
init {
}
//在類加載時就運(yùn)行伴生對象的代碼塊,相當(dāng)于Java里面的static{...}代碼塊
//companion表示伴生诗箍,object表示對象癣籽, AnimalCompany表示伴生對象的名稱
companion object AnimalCompany{
fun judgeSex(sexName: String):Int {
var sex:Int = when(sexName) {
"公" -> 1
"母" -> 0
else -> -1
}
return sex
}
}
}
2.4靜態(tài)屬性
在伴生對象中增加常量字段的定義即可。
companion object AnimalCompany{
val MALE = 0
val FEMALE = 1
fun judgeSex(sexName: String):Int {
var sex:Int = when(sexName) {
"公" -> MALE
"母" -> FEMALE
else -> -1
}
return sex
}
}
3.類的繼承
3.1開放修飾符
Kotlin默人每個類都不能被繼承滤祖,如果想要某個類成為基類筷狼,就需要把此類開放出來,也就是添加關(guān)鍵字open作為修飾符匠童。
open class Animal (var context: Context, var name: String, val sex:Int = 0){
var sexName:String = "Kotlin"
init {
}
}
開放修飾符 | 說明 |
---|---|
public | 對所有人開放埂材,默認(rèn)就是public類型 |
internal | 只對模塊內(nèi)部開放,模塊一般指一個App汤求,軟件或者系統(tǒng)本身 |
protected | 自己和子類 |
private | 自己 |
open不控制訪問權(quán)限楞遏,只是決定能不能被繼承。
3.2抽象類
Kotlin中也存在抽象類首昔。用法同Java。
3.3接口
在實現(xiàn)接口時候直接把接口名放在冒號后面
//定義接口
interface Behavior {
var name:String
fun fly():String
}
//實現(xiàn)接口
class Animal (var context: Context, var name: String, val sex:Int = 0): Behavior{
var sexName:String = "Kotlin"
init {
}
override fun fly(): String {
return behavior
}
override var behavior:String = "Kotlin"
}