IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> kotlin(十七)Kotlin和Java相互调用 -> 正文阅读

[移动开发]kotlin(十七)Kotlin和Java相互调用

1.Kotlin调用Java的方法和属性

?1)定义java类

public class JavaClass {
    private String javaString = "java";
    public void sayHello(String name) {
        System.out.println("Hello " + name);
    }

    public String getJavaString() {
        return javaString;
    }

}

Kotlin调用Java.由于Java中可以定义null,所以在kotlin中要做可空性判断,避免发生空指针异常


fun main() {
    val java = JavaClass()
    java.sayHello("Java")
    println(java.javaString)
    //由于Java中可以定义null,所以在kotlin中要做可空性判断,避免发生空指针异常
    val javaString:String? = java.javaString
    javaString?.uppercase()
}

2)定义kotlin类

class KotlinClass {
    val kotlinString="Kotlin"

    fun sayHello(name: String) {
        println("Hello $name")
    }
}

Java中调用Kotlin中的属性和方法

 public static void main(String[] args) {
        KotlinClass kotlin = new KotlinClass();
        kotlin.sayHello("Kotlin");
       String kotlinString =  kotlin.getKotlinString();
        System.out.println(kotlinString);
    }

Java中访问Kotlin中的属性,必须通过getter setter方法。如果想直接访问,得需要在kotlin中定义的属性加上。


class KotlinClass {
    @JvmField
    val kotlinString="Kotlin"
}

 public static void main(String[] args) {
     KotlinClass kotlin = new KotlinClass();
     String kotlinString =  kotlin.kotlinString;
     System.out.println(kotlinString);
}

2.当定义的kotlin函数参数有默认值时,@JvmOverloads 可以使kotlin编译器生产重载方法。

class KotlinClass {
    @JvmOverloads
    fun sayHello(name: String = "kotlin") {
        println("Hello $name")
    }
}

 public static void main(String[] args) {
     KotlinClass kotlin = new KotlinClass();
     kotlin.sayHello();
     kotlin.sayHello("Kotlin");
 }

看一下kotlin通过编译器生成的重载方法

public final class KotlinClass {
   @JvmOverloads
   public final void sayHello(@NotNull String name) {
      Intrinsics.checkNotNullParameter(name, "name");
      String var2 = "Hello " + name;
      System.out.println(var2);
   }

   // $FF: synthetic method
   public static void sayHello$default(KotlinClass var0, String var1, int var2, Object var3) {
      if ((var2 & 1) != 0) {
         var1 = "kotlin";
      }

      var0.sayHello(var1);
   }

   @JvmOverloads
   public final void sayHello() {
      sayHello$default(this, (String)null, 1, (Object)null);
   }
}

3.Java访问Kotlin中的伴生对象属性和方法。

class KotlinClass {

    companion object {
        val HELLO_WORLD = "hello world"
        fun sayHello() = println(HELLO_WORLD)
    }
}

 public static void main(String[] args) {
        KotlinClass.Companion.getHELLO_WORLD();
        KotlinClass.Companion.sayHello();
    }

@JvmField 可以以静态的方法来访问伴生对象中定义的属性。

@JvmStatic定义在函数上,可以直接调用伴生对象中的函数。

class KotlinClass {

    companion object {
        @JvmField
        val HELLO_WORLD = "hello world"
        @JvmStatic
        fun sayHello() = println(HELLO_WORLD)
    }
}

   public static void main(String[] args) {
//     KotlinClass.Companion.getHELLO_WORLD();
//     KotlinClass.Companion.sayHello();
       String hello =  KotlinClass.HELLO_WORLD;
       KotlinClass.sayHello();
    }

4.异常处理。

?1)Kotlin捕获Java中的异常

? ? ?java中抛出的异常,在java中调用时,编译器会自动提示要捕获异常。

? ? 但是在Kotlin中调用时,不捕获异常也会编译通过

public class JavaClass {
    public void testException() throws IOException {
        System.out.println("exception");
    }

    public static void main(String[] args) {
        try {
            new JavaClass().testException();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Kotlin中调用java代码
fun main() {
    val java = JavaClass()
    java.testException();
}

2)在Kotlin中抛出的异常,必须加上Throws注解,在java中才会自动提示捕获异常。

? ? ??@Throws(IOException::class)?

class KotlinClass {
    @Throws(IOException::class)
    fun testException(){
        throw IOException()
    }
}

public class JavaClass {
    public void testException() throws IOException {
        System.out.println("exception");
    }

    public static void main(String[] args) {
        KotlinClass kotlin = new KotlinClass();
        try {
            kotlin.testException();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.Java中调用Kotlin中定义的匿名函数

?在kotlin中定义两个匿名函数,一个是一个参数,一个是两个参数。

class KotlinClass {
   val sayHello = { name:String ->
        println("Hello $name")
   }
    val sayHello2 = { name:String,name2:String ->
        println("Hello $name and $name2")
    }
}

在java中调用Kotlin中的匿名函数。通过Function1 invoke,可以调用一个参数的匿名函数,

通过Function2.invoke可以调用两个参数的匿名函数,一次类推可以从Function0--Function22.

Function0代表无参的匿名函数,Function22最多可以接收22个参数。

 public static void main(String[] args) {
        KotlinClass kotlin = new KotlinClass();

        Function1 function1 = kotlin.getSayHello();
        function1.invoke("HanMei");

        Function2 function2 = kotlin.getSayHello2();
        function2.invoke("HanMei","LiLei");
    }

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:27:25  更:2022-09-13 11:28:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:23:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码