Kotlin類和物件
“用Kotlin開發android更簡潔( ̄_, ̄ )”
類和繼承
類的申明
和java一樣可以用這種方式
class Empty {
}
//kotlin提供了一種更為簡潔的方式建立無實體型別
class Empty
建構函式
在 Kotlin 中類可以有一個主建構函式以及多個二級建構函式。主建構函式是類頭的一部分:跟在類名後面(可以有可選的引數)。
class Empty constructor(name: String) { } //如果想建立無參建構函式,都必須給它指定初始值 class Empty constructor(name: String = "") { }
constructor 這個關鍵字官方是這樣解釋的
Here the constructor is private. By default, all constructors are public, which effectively amounts to them being visible everywhere where the class is visible (i.e. a constructor of an internal class is only visible within the same module).
這裡的建構函式是私有的。預設情況下,所有的建構函式都是公開的,有效的,它們可以在任何地方都可見(即一個內部類的建構函式在同一個模組中可見)。
如果主建構函式沒有註解或可見性說明,則 constructor 關鍵字是可以省略:
主建構函式不能包含任何程式碼,必須在init方法裡
class Empty constructor(name: String) {
init {
Log.d(this.javaClass.name, "name =$name")
}
}
二級建構函式
//如果建構函式沒有引數 class Empty { constructor(empty: Empty) { } } //如果類有主建構函式,每個二級建構函式都要,或直接或間接通過另一個二級建構函式代理主建構函式。 //在同一個類中代理另一個建構函式使用 this 關鍵字: class Empty(name: String) { init { Log.d(this.javaClass.name, "name =$name") } constructor(name: String, empty: Empty) : this(name) { } }
類的建立
Kotlin 沒有new
var empty = Empty("A")
var empty = Empty()//無參則需要在建構函式中指明初始值
繼承
在Kotin 中所有的類都有共同的父類Any ,Any 不是 java.lang.Object,事實上它除了 equals(),hashCode()以及toString()外沒有任何成員了
//類名 :父類,再加上建構函式的引數,可惜外掛不太方便自動生成建構函式,希望能夠改進
class KotlinTextView : TextView {
constructor(ctx: Context) : super(ctx) {//super 和 java裡面的概念一樣
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
}
}
複寫成員
想要能夠複寫父類方法,都必須明確的註解出來
open class Empty(name: String = "") {//父類需要宣告open關鍵字
init {
Log.d(this.javaClass.name, "name =$name")
}
constructor(name: String, empty: Empty) : this(name) {
}
open fun hello() {//方法也必須宣告open
}
class NewEmpty() : Empty() {
override fun hello() {//複寫的話需要和java一樣有override關鍵字,兩個open缺一不可
super.hello()
}
}
}
如果不想被重寫則可以加上final
open class NewEmpty() : Empty() {
final override fun hello() {//加上了final關鍵字
super.hello()
}
}
class NewE() : NewEmpty() {
override fun hello() {//此時編譯器會提示錯誤
super.hello()
}
}
複寫規則
在 kotlin 中,實現繼承通常遵循如下規則:如果一個類從它的直接父類繼承了同一個成員的多個實現,那麼它必須複寫這個成員並且提供自己的實現(或許只是直接用了繼承來的實現)。
interface SayHello {
fun hello() {
Log.d("SayHello", "SayHello!!!!!!")
}
}
open class NewEmpty() : Empty(), SayHello {
final override fun hello() {
super<Empty>.hello() //可以選擇性的用誰的父類方法
super<SayHello>.hello()//為表示使用父類中提供的方法我們用 super<class>表示
}
}
抽象類
一個類或一些成員可能被宣告成 abstract 。一個抽象方法在它的類中沒有實現方法。因此當子類繼承抽象成員時,它並不算一個實現:
abstract class I_Say {
abstract fun hello() //抽象類定義不能作為實現,而介面(interface )可以
}
class Chinese() : I_Say() {
override fun hello() {
Log.d("SampleActivity2", "你好")
}
}
class English() : I_Say() {
override fun hello() {
Log.d("SampleActivity2", "hello")
}