Android:Kotlin再探-Java異同

參考:Kotlin學習系列之:Kotlin的構造函數
官網
Kotlin中?和!!的區別
爲什麼Kotlin屬性訪問方式比Java的Get/Set方式好
對比Java,Kotlin的優點和缺點
kotlin - 實現靜態的幾種方式詳解
在這裏插入圖片描述
Kotlin 並沒有 new 關鍵字

創建類的實例
要創建一個類的實例,我們就像普通函數一樣調用構造函數:
val invoice = Invoice()

val customer = Customer("Joe Smith")

Kotlin的構造函數分爲主構造器(primary constructor)和次級構造器(secondary constructor)
和Primary Constructor相比,很明顯的一點,Secondary Constructor是定義在類體中。第二,Secondary Constructor可以有多個,而Primary Constructor只會有一個。

主
class 類名 constructor(形參1, 形參2, 形參3){}
class Person constructor(username: String, age: Int){
	private val username: String
	private var age: Int

	init{
		this.username = username
		this.age = age
	}
}

次
class User{
	private val username: String
	private var age: Int
		
	constructor(username: String, age: Int){
	    this.username = username
	    this.age = age
	}
}

關鍵字init:init{}它被稱作是初始化代碼塊(Initializer Block),它的作用是爲了Primary Constructor服務的,由於Primary Constructor是放置在類的首部,是不能包含任何初始化執行語句的,這是語法規定的,那麼這個時候就有了init的用武之地,我們可以把初始化執行語句放置在此處,爲屬性進行賦值。

class Person constructor(username: String, age: Int){
	private val username: String
	private var age: Int

	init{
		this.username = username
		this.age = age
	}
}

與 Java 不同,Kotlin 對於可覆蓋的成員(我們稱之爲開放)以及覆蓋後的成員需要顯式修飾符:

open class Base {
    open fun v() { ... }
    fun nv() { ... }
}
class Derived() : Base() {
    override fun v() { ... }
}

複寫函數上必須加上 override 修飾符。如果沒寫,編譯器將會報錯。
標記爲 override 的成員本身是開放的,也就是說,它可以在子類中覆蓋。如果你想禁止再次覆蓋,使用 final 關鍵字:


open class AnotherDerived() : Base() {
    final override fun v() { ... }
}

覆蓋屬性
屬性覆蓋與方法覆蓋類似;在超類中聲明然後在派生類中重新聲明的屬性必須以 override 開頭,並且它們必須具有兼容的類型。每個聲明的屬性可以由具有初始化器的屬性或者具有 getter 方法的屬性覆蓋。

open class Foo {
    open val x: Int get() { …… }
}
​
class Bar1 : Foo() {
    override val x: Int = ……
}

你也可以用一個 var 屬性覆蓋一個 val 屬性,但反之則不行。這是允許的,因爲一個 val 屬性本質上聲明瞭一個 getter 方法,而將其覆蓋爲 var 只是在子類中額外聲明一個 setter 方法。

請注意,你可以在主構造函數中使用 override 關鍵字作爲屬性聲明的一部分。

interface Foo {
    val count: Int
}
​
class Bar1(override val count: Int) : Foo
​
class Bar2 : Foo {
    override var count: Int = 0
}

kotlin 實現靜態的方式:伴生對象
與 Java 或 C# 不同,在 Kotlin 中類沒有靜態方法。在大多數情況下,它建議簡單地使用包級函數。

如果你需要寫一個可以無需用一個類的實例來調用、但需要訪問類內部的函數(例如,工廠方法),你可以把它寫成該類內對象聲明中的一員。

更具體地講,如果在你的類內聲明瞭一個伴生對象, 你就可以使用像在 Java/C# 中調用靜態方法相同的語法來調用其成員,只使用類名作爲限定符。

基本都是用一個靜態對象來模擬 class 的靜態屬性和方法,目前有4種實現方式:

companion object - 伴隨對象,聲明單例的方式

@JvmField + @JvmStatic 註解 - 使用註解標籤聲明 static 的部分

object 單例 - 靜態單例其實和 companion object 類似

const - 包內唯一性,脫離類的束縛,kotlin 的特性,在 java 中會編譯生成一個 kotlin.kt 的文件專門對齊提供支持

companion object
companion object 伴隨對象這是我們在 kotlin 中最常用的方式了吧,在 companion object 裏面我們即可以聲明屬性,也可以聲明方法,kotlin 中的調用方式感覺和 java 的 static 一樣(直接類名點調用),舉個例子看下面:

class BookKotlin {

    var name: String = "AA"

    fun speak() {}

    companion object instance {

        var nameStatic: String = "BB"

        fun speakStatic() {}

    }
}

如何把Kotlin代碼轉成java代碼,如何把java代碼轉成kotlin代碼

其實就是互轉,以下基於IDEA或Android Studio

Java轉Kotlin
打開要轉的文件

方法1
Ctrl+Shift+Alt+K

方法2
Code - Convert Java File To Kotlin File

Kotlikn 轉 Java
Tools>Kotlin>Show Kotlin Bytecode
Decompile
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章