Kotlin入門
轉載自:https://www.cnblogs.com/jaymo/articles/6924144.html
創建類的實例
要創建一個類的實例,我們就像普通函數一樣調用構造函數:
1 2 3 |
val invoice = Invoice()
val customer = Customer( "Joe Smith" )
|
註意 Kotlin 並沒有 new 關鍵字。
繼承
在 Kotlin 中所有類都有一個共同的超類 Any
,這對於沒有超類型聲明的類是默認超類
1 |
class Example // 從 Any 隱式繼承
|
Any
不是 java.lang.Object
;尤其是,它除了 equals()
、hashCode()
和toString()
外沒有任何成員。
要聲明一個顯式的超類型,我們把類型放到類頭的冒號之後:
1 2 3 |
open class Base(p: Int)
class Derived(p: Int) : Base(p)
|
類上的 open 標註與 Java 中 final 相反,它允許其他類 從這個類繼承。默認情況下,在 Kotlin 中所有的類都是 final, 對應於 Effective Java書中的 第 17 條:要麽為繼承而設計,並提供文檔說明,要麽就禁止繼承。
覆蓋方法
我們之前提到過,Kotlin 力求清晰顯式。與 Java 不同,Kotlin 需要顯式 標註可覆蓋的成員(我們稱之為開放)和覆蓋後的成員:
1 2 3 4 5 6 7 |
open class Base {
open fun v () {}
fun nv() {}
}
class Derived() : Base() {
override fun v () {}
}
|
標記為 override 的成員本身是開放的,也就是說,它可以在子類中覆蓋。如果你想禁止再次覆蓋,使用 final 關鍵字:
1 2 3 |
open class AnotherDerived() : Base() {
final override fun v () {}
}
|
覆蓋屬性
屬性覆蓋與方法覆蓋類似;在超類中聲明然後在派生類中重新聲明的屬性必須以 override 開頭,並且它們必須具有兼容的類型。每個聲明的屬性可以由具有初始化器的屬性或者具有 getter 方法的屬性覆蓋。
1 2 3 4 5 6 7 |
open class Foo {
open val x: Int get { …… }
}
class Bar1 : Foo() {
override val x: Int = ……
}
|
你也可以用一個 var
屬性覆蓋一個 val
屬性,但反之則不行。這是允許的,因為一個 val
屬性本質上聲明了一個 getter 方法,而將其覆蓋為 var
只是在子類中額外聲明一個 setter 方法。
伴生對象
與 Java 或 C# 不同,在 Kotlin 中類沒有靜態方法。在大多數情況下,它建議簡單地使用 包級函數。
如果你需要寫一個可以無需用一個類的實例來調用、但需要訪問類內部的 函數(例如,工廠方法),你可以把它寫成該類內對象聲明 中的一員。
更具體地講,如果在你的類內聲明了一個伴生對象, 你就可以使用像在 Java/C# 中調用靜態方法相同的語法來調用其成員,只使用類名 作為限定符。
屬性和字段
聲明一個屬性的完整語法是
1 2 3 |
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
|
幕後字段
接口
Kotlin 的接口與 Java 8 類似,既包含抽象方法的聲明,也包含 實現。與抽象類不同的是,接口無法保存狀態。它可以有 屬性但必須聲明為抽象或提供訪問器實現。
1 2 3 4 5 6 |
interface MyInterface {
fun bar()
fun foo() {
// 可選的方法體
}
}
|
可見性修飾符
類、對象、接口、構造函數、方法、屬性和它們的 setter 都可以有_可見性修飾符_。 (getter 總是與屬性有著相同的可見性。) 在 Kotlin 中有這四個可見性修飾符:private
、 protected
、 internal
和 public
。 如果沒有顯式指定修飾符的話,默認可見性是 public
。
- 如果你不指定任何可見性修飾符,默認為
public
,這意味著你的聲明 將隨處可見; - 如果你聲明為
private
,它只會在聲明它的文件內可見; - 如果你聲明為
internal
,它會在相同模塊內隨處可見; protected
不適用於頂層聲明。
註意 對於Java用戶:Kotlin 中外部類不能訪問內部類的 private 成員。
模塊
可見性修飾符 internal
意味著該成員只在相同模塊內可見。更具體地說, 一個模塊是編譯在一起的一套 Kotlin 文件:
- 一個 IntelliJ IDEA 模塊;
- 一個 Maven 或者 Gradle 項目;
- 一次 <kotlinc> Ant 任務執行所編譯的一套文件。
Kotlin入門