# 1. 類的定義
類的定義和`Java`中類似,比如下面的案例:
~~~
class Person {
private var name: String? = null
private var age: Int? = null
constructor(){
this.name = "張三"
this.age = 20
}
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
override fun toString(): String {
return "Person(name=$name, age=$age)"
}
}
fun main() {
var person: Person = Person()
println(person)
}
~~~
結果:
```
Person(name=張三, age=20)
```
需要注意的是,上面的兩種構造函數的寫法都是**次構函數**。`constructor`關鍵字定義,只不過次構函數位于類體中。對應的還有一類叫做**主構函數**,如下:
~~~
class Person constructor(){
private var name: String? = null
private var age: Int? = null
init {
this.name = "張三"
this.age = 20
}
override fun toString(): String {
return "Person(name=$name, age=$age)"
}
}
~~~
從上面的案例可以看出,**主構函數**定義在類聲明的這一行代碼,且需要結合`init`代碼塊進行執行。不妨在下一個案例中我們將主構函數和次構函數均定義在類中:
~~~
class Person constructor(){
private var name: String? = null
private var age: Int? = null
init {
this.name = "張三"
this.age = 20
}
constructor(name: String, age: Int): this() {
this.name = name
this.age = age
}
override fun toString(): String {
return "Person(name=$name, age=$age)"
}
}
fun main() {
var person: Person = Person("李四", 23)
println(person)
}
~~~
需要注意的是,在次構函數定義的時候,次構造函數必須調用主構造函數,也就是`次構函數:this(參數列表)`。
# 2. 繼承
- 如果想聲明一個類繼承另一個類,則需要使用英文冒號“`:`”;
- `Kotlin`中的所有類都默認使用`final`關鍵字修飾,不能被繼承,因此,當繼承某個類時,需要在這個類的前面加上`open`關鍵字;
比如下面的案例:
~~~
open class Person constructor(){
protected var name: String? = null
protected var age: Int? = null
init {
this.name = "張三"
this.age = 20
}
constructor(name: String, age: Int): this() {
this.name = name
this.age = age
}
override fun toString(): String {
return "Person(name=$name, age=$age)"
}
}
class Student constructor(name: String, age: Int): Person() {
init {
this.name = name
this.age = age
}
}
fun main() {
var person: Student = Student("李四", 23)
println(person)
}
~~~
結果:
```
Person(name=李四, age=23)
```
但是我們期望最終輸出的信息為`Student`的信息,故而這里我們需要對`toString`進行重寫。在`Kotlin`中被重寫的屬性或者方法前邊需要使用“`override`”關鍵字標識。且在父類中需要被重寫的屬性和方法前面必須使用`open`關鍵字來修飾。比如:
~~~
open class Person constructor(){
protected open var name: String? = null
protected var age: Int? = null
init {
this.name = "張三"
this.age = 20
}
constructor(name: String, age: Int): this() {
this.name = name
this.age = age
}
open override fun toString(): String {
return "Person(name=$name, age=$age)"
}
}
class Student constructor(name: String, age: Int): Person() {
protected override var name: String? = null
init {
this.name = name
this.age = age
}
override fun toString(): String {
return "Student(name=$name, age=$age)"
}
}
fun main() {
var person: Student = Student("李四", 23)
println(person)
}
~~~
# 3. 嵌套類
嵌套類和`Java`中內部類類似,但是該類不能訪問外部類的成員,內部類指的是可以用`inner`標記以便能夠訪問外部類的成員。
# 4. 枚舉類
比如:
~~~
enum class Option{
GET, PUT, DELETE
}
~~~
當然可以寫一個構造函數,并設置對應的值:
~~~
enum class Option(number: Int){
GET(0), PUT(1), DELETE(2)
}
fun main() {
var opt = Option.PUT
println(opt.name)
println(opt.ordinal)
}
~~~
結果:
```
PUT
1
```
# 5. 數據類
在`Java`程序中,一般會用一些類來保存一些數據或者對象的狀態,習慣上將這些類稱為`bean`類或`entity`類或`model`類。在`Kotlin`中,專門處理這些數據的類被稱為數據類,用關鍵字`data`進行標記。需要注意的是:
- 數據類中的主構造函數中傳遞的參數必須用`val`或`var`來修飾。
- 數據類不可以用`abstract`、`open`、`sealed`或`inner`關鍵字來修飾。
- 數據類的主構造函數至少有一個參數,如果需要一個無參的構造函數,可以將構造函數中的參數都設置為默認值。
~~~
data class Option(var number: Int){
}
fun main() {
var opt = Option(2)
println(opt) // Option(number=2)
println(opt.number) // 2
}
~~~
# 6. 單例類
在`Kotlin`中,單例模式是通過`object`關鍵字來完成的,通過`object`修飾的類即為單例類,單例類在程序中有且僅有一個實例。
~~~
object Singleton{
var name = "Hello"
fun getName(){
println(name)
}
}
fun main() {
Singleton.getName() //Hello
}
~~~
這里沒有創建`Singleton`對象的實例,而是采用類似`Java`中靜態方法的調用。且注意到這里使用`object`關鍵字修飾即可,不需要`Java`中那么麻煩。
> 直接通過“類名.成員名”的形式調用類中的屬性與函數,不需要創建該類的實例對象,這是因為通過object關鍵字創建單例類時,默認創建了該類的單例對象。
# 7. 伴生對象
在`Kotlin`中沒有靜態變量,取而代之的是伴生對象。伴生對象是在類加載時初始化,生命周期與該類的生命周期一致。
定義伴生對象是通過“`companion`”關鍵字標識的,由于每個類中有且僅有一個伴生對象,因此也可以不指定伴生對象的名稱,并且其他對象可以共享伴生對象。
在調用伴生對象時分兩種情況,具體如下。
(1)有名稱:調用方式為“`類名.伴生對象名.成員名`”或“`類名.成員名`”。
(2)無名稱:調用方式為“`類名.Companion.成員名`”或“`類名.成員名`”。
比如:
~~~
class Person{
var name = "Hello"
companion object UUID{
fun generateUUID(): Int {
return LocalDateTime.now().second
}
}
fun getName(){
println("UserName:${name}, UUID: ${Person.UUID.generateUUID()}")
}
}
fun main() {
Person().getName()
}
~~~
- Kotlin語言基礎
- Kotlin的簡介
- Kotlin的變量和常見數據類型
- Kotlin的區間
- Kotlin的位運算
- Kotlin的容器
- Kotlin類型檢查
- Kotlin的空值處理
- Kotlin的函數
- Kotlin的類
- Kotlin的委托
- Kotlin的延遲加載
- Kotlin的異常
- Kotlin的Lambda表達式
- Kotlin的高階函數
- Kotlin的標準庫中的高階函數
- Kotlin的泛型
- Kotlin的表達式
- Kotlin的解構
- Kotlin的運算符重載
- Kotlin語言中級
- Kotlin的擴展函數
- Kotlin的擴展屬性
- Kotlin的infix關鍵字
- Kotlin的DSL
- Kotlin的一些注解(和Java互調用)
- Kotlin的lateinit和by lazy
- Kotlin的反射
- Kotlin的匿名接口
- 安卓中的Kotlin
- 數據庫操作Room