Kotlin 基礎語法-01-基本知識-與java互調

Kotlin 基礎語法-01-基本知識-與java互調

前言:

Kotlin 語言在2017年被google 官方宣佈爲Andorid 開發的第一語言、 不可否認我們現在很多項目和一些老舊項目依然有很多人在使用Java 語言,但隨着未來慢慢的推廣和替代,kotlin 會逐漸取代上層Java語言開發的份額,由此可見我們學習kotlin 語言的重要性。

扯淡:

這一kotlin基礎語法系列適合有一定java語言語法和C或者C++ 基礎的讀者來閱讀, 文中可能有需要和其他語言進行類比。 先這,不想扯淡太多了,由於疫情影響,雖然是遠程辦公,但總覺得比去辦公室坐班還累,時間明顯不夠用,抱歉更慢了。

1. kotlin 的基本知識

kotlin文件後綴名是kt結尾, 類似這樣, demo.kt

變量名聲明方式:

var age : Int = 28

val name : String = "hello world , kotlin "

var address = " bei jing city .. "

kotlin 中 var 代表是可變類型, : 後邊爲變量類型, val 代表的是不可變類型, 當然如果後邊的數據類型 能夠自動推斷出數據類型並賦值類型給變量。 因此可以省去數據類型的表示。

另外kotlin是空安全類型, 嘛意思?

// var name:String = null 
// 這麼着是聲明不成功的, 不允許空賦值
var  name2:String? = null 
// 這樣是可以的 、 String? 意思就是變量類型有可能爲空 

var name = name2  // 這是不可以賦值的

var name = name2!! // 如果確認name2 一定不爲空 則可以這麼強轉。

注意String和String? 是不同的類型, String?可以給String 賦值、當然name2可以直接接受 name 的賦值 。

接下來 再看一下kotlin 的基礎語法

fun printStr(str: String):String{
    
    println("str is $str")

    return str
}

printStr("hello world kotlin")

打印結果:

str is hello world kotlin 

2. kotlin 與Java代碼互調

學習kotlin免不了使用以前的java代碼 、那麼瞭解Java與kotlin 互調就會很重要, 簡單瞭解一下。

語法變化

kotlin 關鍵字處理

kotlin 是沒有封裝類的, 也就是說方法是可以直接寫在文件中的,舉個例子,

/// Utils.kt  

fun  echo(name:String){
    
    println("$name")
}

/// Main.java

public static void main(String args[]){
    
    UtilsKt.echo("hello java & kotlin");
    
}

文件名 + Kt.方法名() 這就是Java調用Kotlin方法的方式。 Utils這個文件中的所有變量和函數和方法 都會編譯成文件名Kt文件。 這樣就能解釋通爲什麼可以這麼調用了。

Java與Kotlin交互的語法變化

object Test{
    
    fun sayHello(msg: String){
        
        println(msg)
    }
    
}

那麼怎麼調用呢

// Kotlin 
Test.sayHello("hello kotlin")

/// java 

Test.INSTANCE.sayHello("Hello java ")

object 修飾的Test會被編譯成一個靜態單例實例化instance 調用方式就是 類名.INSTANCE.方法名 。 當然這也是kotlin 中單例的一種寫法。

在java中我們常需要傳class ,比如Main.class
那麼在kotlin 中怎麼聲明呢

fun main(args: Array<String){
    /// java Main 
    testPrintClass(JavaMain::class.java)
    /// kotlin Main
    testPrintKtClass(KotlinMain::class)
}
/// 打印類名  JavaMain 是另外的一個類名 
fun testPrintClass(clazz: Class<JavaMain>){
    println(clazz.simpleName)
}

///再來個 kotlin類的打印 

fun testPrintKtClass(clazz: KClass<KotlinMain>){
    println(clazz.simpleName)
}

不再贅述、這是兩種調用方式、 上邊的是java類,下邊是kotlin 類的調用方式

接下來說一下 關鍵字衝突怎麼辦

比如說java中in並不是個關鍵字、而在kotlin中卻是關鍵字。
那麼調用方式

// java code 

class JavaaMain{
    
    public static final String in = "in";
    
}

/// kotlin code 

fun main(args: Array<String>){
    
    println(JavaMain.`in`)
    /// 引用Java類中的變量 使用`` 包括起來 這個衝突。
}

看起來是不是怪怪的 、當然在java中的變量聲明如果避免使用了kotlin關鍵字 也就不用這麼怪異的寫法了

不寫那麼長了、這篇文章。 接下來寫一些kotlin基礎中常見的問題作爲本文的最後一部分。

3. java和kotin 互調常見問題

/// java code 

public interface AInterface {

    void printHello(int a );

    void printHello(Integer a );

}

public class ASample implements  AInterface {

    public static final ASample as = new ASample();

    @Override
    public void printHello(int a) {
        System.out.print("a: "+ a);
    }

    @Override
    public void printHello(Integer a) {
        System.out.print("aI: "+ a);
    }
}

那麼我們在kotlin中怎麼調用呢

fun main(args: Array<String>) {
    printA()
}

fun printA(){
    ASample.`as`.printHello(123)
}
打印結果是:
a:123

這就說明了、如果java中重載方法、方法名、類型一致、 那麼執行只會按照基本類型執行。 也就是按照參數類型爲int 的那個方法執行。
當然在kotlin 中這麼聲明瞭、 你會覺得、我靠、根本就聲明不成功好吧,因爲沒有Integer這個類型。 歇了。

再來一段代碼
在Asample類中我們聲明瞭如下方法

 public String isEmpty(String name){

        return name.isEmpty()?null:name;
 }

在kotlin 中調用

fun printB(){

    var  fmt1 = ASample().isEmpty("")
    /// fmt1 這時候的返回類型是String!  這是無法聲明的一種類型 、是一種kotlin 調用java代碼中的一種兼容類型。 
    println(fmt1.length)
    ///  這裏執行的結果 只能是按照java的語法來走、 打印結果是NullPointerExecption
    
//    var fmt2: String = ASample().isEmpty("")
//
//    這樣調用是不行的、String 是不可空類型 , 而isEmpty 是可空類型。所以編譯不過。
//    println(fmt2.length)


    var fmt3: String?  = ASample().isEmpty("")
/// 當fmt3 聲明成可空類型String? 時、 則調用fmt3? 不會崩潰、打印結果爲null
    println(fmt3?.length)

}

上邊的例子說明了,我們要使用一個變量、一個方法、 首先要確定該變量、方法會不會爲空、 如果爲空則需要直接聲明稱爲可空類型, 防止代碼中出現不必要的麻煩。

繼續,

Kotlin 中沒有靜態變量與靜態方法

例如在kotlin中聲明瞭

object Test{
    fun sayHello(msg:String){
        println(msg)
    }
}

那麼在Java中調用sayHello就需要

Test.INSTANCE.sayHello("hello")

kotlin code 則需要

Test.sayHello("k Hello ")

那麼怎樣纔可以使Java中調用時直接使用類名來調用呢
,當然是可以的,

object Test{
    @JvmStatic
    fun sayHello(msg:String){
        println(msg)
    }
}

/// java code 

Test.sayHello("j hello ")

上面這個@JvmStatic 註解會被編譯成public static的方法 、所以就可以直接調用。

4. 總結

多上手敲、多嘗試、多思考、 有問題評論區我們共同討論進步。

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