浅谈Kotlin与Java互操作(上)

241 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情

前言

Kotlin is 100% interoperable with Java and Android

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

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

文章概览

Kotlin 调用 Java.png

调用 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方法
}

运行结果:

子不语Any
AnyOne

调用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官方文档上!

掘金(JUEJIN)  一起分享知识, Keep Learning!