Kotlin與Java 的互調

kotlin

1、在Java中調用Kotlin的方法

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

package kotlin2java

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

在JavaMain.java中調用:

UtilKt.echo("kotlin");

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


2、Java和Kotlin中調用Kotlin中object修飾的類

在KotlinMain.kt文件中聲明:

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

在KotlinMain.kt文件中調用:類名+方法名

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

在JavaMain.java文件中調用:類名+INSTANCE+方法名

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

        KotlinMain.INSTANCE.printObject();
    }
}

這裏的INSTANCE是如何來的?我們將KotlinMain.kt文件轉換爲Java代碼就能清楚的知道,在被編譯成Java代碼的時候object修飾的類會生成一個靜態對象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代碼中如何調用printObject方法了。

如何擺脫INSTANCE

Kotlin中被@JvmStatic修飾的方法,編譯成Java代碼後就變成了一個靜態方法,所以在Java中調用是不需要加上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調用
package four;

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

3、Kotlin中調用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)
}

// 輸出結果:
// JavaMain
// KotlinMain

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

在Kotlin語法中,調用Java的class必須使用類名::class.java

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

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

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

4、Kotlin調用Java中的變量,此變量名在Kotlin中爲關鍵字:

  1. 如果Java中聲明的變量的變量名在Kotlin中不是關鍵字,那麼直接用類名.變量名,如:

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

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

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


寫在最後

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

Thank You!

--Taonce

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

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