在Kotlin中调用Java

调用Java中的getter/setter方法

一般情况下,在Kotlin中操作Java中的Bean类属性时,程序会自动识别Bean类中属性对应的getter和setter方法,直接通过属性就可以修改对应的私有属性值。接下来我们通过一个案例来演示在Kotlin中调用Java中的Bean类。

1. 创建Student.java
在IDEA中创建一个名为Chapter12的项目,包名指定为com. coolcou.chapter12,该包用于存放后续案例中创建的文件,接着在该包中创建一个Student.java文件。具体代码如下所示。

package com.coolcou.chapter12;
class Student {
    private String name;
    public Student(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
   public void setName(String name) {
       this.name = name;
   }
}

上述代码中,在Student类中创建了一个字段name,该字段用于设置学生姓名,并且在这个类中同时创建了getName()和setName()方法,这两个方法分别用于获取和设置Student中的name字段。

2. 创建SettingName.kt
创建一个SettingName.kt文件,在该文件的main()方法中调用Java中创建的Student类,具体代码如下所示。

package com.coolcou.chapter12
fun main(args: Array<String>) {
    val stu = Student(" 酷客")
    stu.name = " 多多"         //直接设置属性值
    println(stu.name)          //直接通过属性访问
    stu.setName("乐乐")        //通过setter 方法设置属性值
    println(stu.getName())     //通过getter 方法获取属性值
}

运行结果:

多多
乐乐

调用Java中的@NotNull注解

在Java中任何类型都可以为空,也就是任何引用都可能是Null,但是在Kotlin中却需要明确指定某个类型为空或者为非空,如果为非空时,则传递Null时程序会报错;如果为空时,则可以传递Null。因此如果在Kotlin中调用Java中的对象时可能会出现空安全的问题,为了解决空安全问题,有以下两种方法。

  • 在Java中声明的类型,在Kotlin中会被特别对待并称为“平台类型(Platform Type)”,在Kotlin中对于这种类型的空检查会放宽,因此它们的安全保存与在Java中相同,在调用该类型的方法时可以加上空安全调用符。
  • 在Java中,给构造方法或者普通方法指定的参数使用@NotNull注解,强制传入不为空的数据。

接下来我们通过一个案例来演示在Kotlin中调用Java中的NotNull对象。

1. 创建Person.java
创建一个Person.java文件,在该文件中创建两个字段,分别是name和age,name表示的是名字,age表示的是年龄。具体代码如下所示。

package com.coolcou.chapter12;
import com.sun.istack.internal.NotNull;
public class Person {
    private String name;
    private int age;
    public Person(@NotNull String name, int age) {
        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;
   }
}
  1. 创建Main.kt
    创建一个Main.kt文件,在该文件中调用Person中的构造方法并设置对应参数的值。具体代码如下所示。
package com.coolcou.chapter12
fun main(args: Array<String>) {
    var person = Person(" 酷客", 20)
    println(person.name)
    println(person.name?.length) // 使用空安全调用符调用
}

运行结果:

酷客
2

在上述代码中,Person的构造方法中传递的参数name前添加了@NotNull注解,该注解强制传递的name参数不为Null,如果在调用构造方法赋值的过程中传递的name参数为Null时,编译器会报错。并且在上述第5行代码中,在使用name?.length时添加了空安全调用符,防止出现异常。

调用Java中的静态成员

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

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

package com.coolcou.chapter12;
public class JavaStatic {
    public static String name = " 酷客"; //创建静态变量name
    public static void sayHello() {      //创建静态方法sayHello()
        System.out.println("Hello World");
    }
}

2. 创建KotlinStatic.kt
创建一个KotlinStatic.kt文件,直接访问JavaStatic类中的静态成员变量和方法,具体代码如下所示。

package com.coolcou.chapter12
fun main(args: Array<String>) {
    JavaStatic.name
    JavaStatic.sayHello()
}

运行结果:

Hello World

SAM转换

在Kotlin中,函数可以作为参数来使用,但是在Java中不支持函数作为参数这种形式。通常在Java中,如果需要实现这一功能,则需要将实现这个功能的动作放在接口的实现类中,然后将这个实现类的实例传递给其他方法。

在Java中,只有一个抽象方法的接口被称为SAM(Single Abstract Method)类型接口,即函数式接口,如Runnable接口。Kotlin支持SAM转换。接下来我们通过一个案例来演示SAM的转换。

1. 创建SAM.java
创建一个SAM.java文件,在该文件中创建一个SAM类,这个类中定义一个接口Listener,在该接口中设置一个方法onClick(),具体代码如下所示。

package com.coolcou.chapter12;
public class SAM {
    private Listener listener;
    public void setListener(Listener listener) {
        this.listener = listener;
    }
    interface Listener {
        void onClick(String s);
    }
}

2. 创建SAM.kt
创建一个SAM.kt文件,在这个文件中使用SAM转换来实现Java中的接口,具体代码如下所示。

package com.coolcou.chapter12
fun main(args: Array<String>) {
    val sam = SAM()
    //Kotlin中正常调用接口
    sam.setListener(object : SAM.Listener {
        override fun onClick(s: String?) {
        }
    })
    //使用SAM 转换调用接口
   sam.setListener(SAM.Listener {
   })
   //SAM 转换也可以简写为以下形式
   sam.setListener {
   }
}

注意 SAM转换的适用条件
(1)SAM转换只适用于接口,而不适用于抽象类,即使这些抽象类中也只有一个抽象方法。
(2)SAM转换只适用于与Java进行互操作,由于Kotlin中有合适的函数类型,因此不需要将函数自动转换为Kotlin接口来实现。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!