Kotlin與Java 的互調(diào)

kotlin

1、在Java中調(diào)用Kotlin的方法

在Util.kt文件中聲明了一個echo方法:

package kotlin2java

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

在JavaMain.java中調(diào)用:

UtilKt.echo("kotlin");

這里注意的是:echo聲明在文件中,而不是class中,所以在Java代碼中是通過文件名+kt.方法名


2、Java和Kotlin中調(diào)用Kotlin中object修飾的類

在KotlinMain.kt文件中聲明:

object KotlinMain{
    fun printObject(){
        println("printObject")
    }
}

在KotlinMain.kt文件中調(diào)用:類名+方法名

fun main(args: Array<String>) {
    KotlinMain.printObject()
}

在JavaMain.java文件中調(diào)用:類名+INSTANCE+方法名

public class JavaMain {
    public static void main(String[] args){
        UtilKt.echo("kotlin");

        KotlinMain.INSTANCE.printObject();
    }
}

這里的INSTANCE是如何來的?我們將KotlinMain.kt文件轉(zhuǎn)換為Java代碼就能清楚的知道,在被編譯成Java代碼的時候object修飾的類會生成一個靜態(tài)對象INSTANCE。且看編譯后的代碼:

public final class KotlinMain {
   public static final KotlinMain INSTANCE;

   public final void printObject() {
      String var1 = "printObject";
      System.out.println(var1);
   }

   static {
      KotlinMain var0 = new KotlinMain();
      INSTANCE = var0;
   }
}

看到這段代碼,大家就能輕而易舉的明白在Java代碼中如何調(diào)用printObject方法了。

如何擺脫INSTANCE

Kotlin中被@JvmStatic修飾的方法,編譯成Java代碼后就變成了一個靜態(tài)方法,所以在Java中調(diào)用是不需要加上INSTANCE的。

// Koltin
package four

object Utils {
    @JvmStatic
    fun sayMessage(msg: String?) {
        println("$msg")
    }
}

// Kotlin編譯成Java后
public final class StaticKotlinFun {
   public static final StaticKotlinFun INSTANCE;

   @JvmStatic
   public static final void sout(@Nullable String msg) {
      String var1 = String.valueOf(msg);
      System.out.println(var1);
   }

   static {
      StaticKotlinFun var0 = new StaticKotlinFun();
      INSTANCE = var0;
   }
}

// Java調(diào)用
package four;

public class JavaUtil {
    public static void main(String[] args) {
        Utils.sayMessage(null);
    }
}

3、Kotlin中調(diào)用class對象(JavaClass和KotlinClass)

fun main(args: Array<String>) {
    testJavaClass(JavaMain::class.java)
    testKotlinClass(KotlinMain::class.java)
}

fun testJavaClass(clazz: Class<JavaMain>) {
    println(clazz.simpleName)
}

fun testKotlinClass(clazz: Class<KotlinMain>) {
    println(clazz.simpleName)
}

// 輸出結(jié)果:
// JavaMain
// KotlinMain

這里的JavaMain是一個java類,而KotlinMain是一個Kotlin類。

在Kotlin語法中,調(diào)用Java的class必須使用類名::class.java。

但是如果這個參數(shù)是Kotlin的類,我們可以寫成和Java一樣的,傳參的時候傳入Class<?>。那么既然是Kotlin調(diào)用Kotlin,肯定有更加簡單的寫法了,在明確自己調(diào)用的是Kotlin類,我們就可以寫成:

fun testKotlinSimpleClass(clazz: KClass<KotlinMain>){
    println(clazz.simpleName)
}
// 調(diào)用
testKotlinSimpleClass(KotlinMain::class)

這里我們傳入的不是Class<?>對象了,而是KClass<?>對象,在調(diào)用的時候也就不用在后面加上.class,直接使用類名::class就行了。

4、Kotlin調(diào)用Java中的變量,此變量名在Kotlin中為關(guān)鍵字:

  1. 如果Java中聲明的變量的變量名在Kotlin中不是關(guān)鍵字,那么直接用類名.變量名,如:

    public class JavaMain {
    
        public static String name = "taonce";
        
    }
    // 調(diào)用
    println(JavaMain.name)
    
  2. 如果Java中聲明的變量的變量名在Kotlin中是關(guān)鍵字,再調(diào)用上面的寫法編譯器就會發(fā)出警告"expecting an element",編譯器都期待有這個元素,所以我們得寫成這樣:

    public class JavaMain {
        
        public static String in = "in";
    
    }
    // 調(diào)用
    println(JavaMain.`in`)
    

    使用一對反引號將變量名包圍起來,這樣編譯器就會正確的執(zhí)行了。


寫在最后

每個人不是天生就強大,你若不努力,如何證明自己,加油!

Thank You!

--Taonce

如果你覺得這篇文章對你有所幫助,那么就動動小手指,長按下方的二維碼,關(guān)注一波吧~~非常期待大家的加入

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容