写点什么

浅谈 Kotlin 与 Java 互操作 (上)

作者:子不语Any
  • 2022-11-30
    湖南
  • 本文字数:1584 字

    阅读完需:约 5 分钟

浅谈Kotlin与Java互操作(上)

前言

Kotlin is 100% interoperable with Java and Android


Kotlin 官网的一句标语,其旨意是表达 kotlin 的Interoperable-互操作特性


互操作就表示 Kotlin 中可以调用 Java 的开放接口来访问成员属性和成员方法,同时在 Java 代码中也百分百兼容 Kotlin 代码,本篇就来探讨一下 Kotlin 调用 Java。

文章概览

调用 Java Static 成员

在 Java 中,静态成员在编译时会生成该类的伴生对象,因此在 Kotlin 中可以直接以显示的方式访问 Java 中的静态成员。接下来我们通过一个案例来演示在 Kotlin 中访问 Java 中的静态成员。


1. 创建 JavaStatic.java 创建一个 JavaStatic.java 文件,并在该文件中创建一个静态成员变量 name,与一个静态方法 sayHello(),具体代码如下所示。


public class JavaStatic {    public static String sName = "雷军";  //静态变量 name    public static void sayHello(String name) {      //静态方法 sayHello()        System.out.println(name + ": are you ok? Mifans.");    }}
复制代码


在 Kotlin 代码中直接访问 JavaStatic 类中的静态成员变量和方法,如下代码:


fun main() {    JavaStatic.sayHello(JavaStatic.name) // 调用java中 静态方法和变量}
复制代码


运行结果:


雷军:are you ok? Mifans.
复制代码

调用 Java 中 getter/setter

通常,在 Kotlin 中操作 Java 中的数据类属性时,编译器自动识别 data 类中属性的 getter 和 setter 方法,直接调用属性就可完成属性值的更改,看以下示例。


public class Person {    private String name;    public Student(String name) {        this.name = name;    }    public String getName() {        return name;    }   public void setName(String name) {       this.name = name;   }}
复制代码


Person 类中包含一个属性 name,用于设置名字,并且同时创建 getName()和 setName()方法,分别用于获取和设置 Person 对象的 name 值。


fun main() {    val per = Person("Any")       per.name = "子不语Any"      //直接对象名.属性名 设置值    println(per.name)          //直接通过属性访问    per.setName("AnyOne")      //调用setter方法    println(per.getName())     //调用getter方法}
复制代码


运行结果:


子不语AnyAnyOne
复制代码

调用 Java 中注解 @NotNull

在 Java 中任何类型都可能是 Null,但在 Kotlin 中需要明确指定类型为空或者为非空,如果为非空时,传递 Null 时会报错。所以在 Kotlin 中调用 Java 代码可能会出现 空安全问题,有以下两种可取方案:


  • 在调用对象的方法时可加上空安全调用符

  • 在 Java 代码中,给方法指定的参数使用@NotNull注解,强制传入不为空的数据


创建一个 Person java 类,有两个字段,分别是 name 和 age。


public class Person {    private String name;    private int age;    public Person(@NotNull String name, int age) { //使用注解NotNull,设定name不能为null        this.name = name;        this.age = age;    }   public String getName() {       return name;   }   public void setName(String name) {       this.name = name;   }   public int getAge() {       return age;   }   public void setAge(int age) {       this.age = age;   }}
复制代码


在 Kotlin 中创建 Person 对象,同时访问它的属性。


fun main() {    var person = Person("子不语", 25)    println(person.name)      println(person.name?.length) // 用空安全调用符调用}
复制代码


运行结果:


子不语3
复制代码


如上述代码,Person 的构造方法中参数 name 前加了@NotNull注解,强制传递的 name 参数不为 Null,如果在赋值过程中传递 name 参数为 Null 时,编译器会报错。

方法返回 void / 转义特殊 Java 标识符

  • 在 Java 中 返回值 void 可以不写,在 Kotlin 中 需使用 Unit

  • Java 中的有效标识符是 Kotlin 的关键字

  • foo.is(bar)


以上总结了在平时开发中常用的一些注意点,踩过的坑。更多的规则可以参看 Kotlin 官方文档上!

发布于: 刚刚阅读数: 4
用户头像

子不语Any

关注

If not now,when? 2022-09-17 加入

安卓攻城狮

评论

发布
暂无评论
浅谈Kotlin与Java互操作(上)_android_子不语Any_InfoQ写作社区