kotlin
支持面向對象編程,也有雷和對象的概念
要聲明一個類需要使用class
關鍵字
class Customer
屬性(Properties)
- 可以在類名后邊添加
()
,在()
里邊聲明屬性
class Contact(val id: Int, var email: String)
聲明了不可變屬性
id
和可變屬性
- 可以在
()
后邊添加{}
,在{}
中聲明屬性
class Contact(val id: Int, var email: String) {val category: String = ""
}
聲明了不可變屬性
id
、可變屬性category
。category
設默認值""
建議聲明不可變屬性,除非在創建對象后需要修改它
()
內的一般稱為頭文件
在
()
內聲明屬性時可以不使用val
和var
,但是類實例化后該屬性不可見。見實例化
實例化(Create instance)
可以使用構造函數創建一個實例
默認情況下kotlin
會使用頭文件中定義的參數創建一個構造函數
fun main(){val contact1 = Contact(1, "123@mail.com", 0)val contact2 = Contact(2, order = 1)println(contact1.email) // 123@mail.comprintln(contact1.id) // 1println(contact1.category) // 122
// println(contact.order) // Unresolved reference: ordeprintln(contact2.email) // abc@mail.comprintln(contact2.id) // 2println(contact2.category) // 122
}
訪問屬性(Access properties)
實例化
中contact1.email
等方式就屬于訪問屬性
模板字符串可以拼接實例的屬性,注意使用
${}
println("郵箱是${contact2.email}") //郵箱是abc@mail.com
成員方法(Member functions)
成員函數要定義在類中,調用方法和訪問屬性類似
class Contact(val id: Int, var email: String = "abc@mail.com", order: Int) {val category: String = "122"fun printEmail() {println("郵箱是${email}")}
}fun main() {val contact = Contact(1, "123@mail.com", 0)contact.printEmail() // 郵箱是123@mail.com
}
數據類(Data classes)
數據類和普通類相似,但是會額外生成一些成員函數,這些成員函數格式化輸出格式,對比實例,復制實例等。
使用`data class``聲明一個數據類
data class User(val name: String, val id: Int)
方法 | 說明 |
---|---|
.toString() | 格式化輸出實例的屬性 |
.equals() or == | 對實例作比較 |
.copy() | 通過一個實例創建里一個實例 |
toString
data class User(val name: String, val id: Int)fun main(){val user = User("王老吉",1)println(user.toString()) // User(name=王老吉, id=1)
}
equals / ==
data class User(val name: String, val id: Int)fun main(){val user1 = User("王老吉",1)val user2 = User("王老吉",1)val user3 = User("王老吉",2)println(user1.equals(user2)) // trueprintln(user1 == user2) // trueprintln(user1.equals(user3)) // falseprintln(user1.equals("王老吉")) // false
}
copy
data class User(val name: String, val id: Int)fun main(){val user = User("王老吉",1)println(user.copy()) // User(name=王老吉, id=1)println(user.copy("加多寶")) // User(name=加多寶, id=1)println(user.copy(id=2)) // User(name=王老吉, id=2)
}
創建一個新的實例比修改原始實例更安全,因為原始實例的屬性不會改變