调用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;
}
}
- 创建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接口来实现。
酷客教程相关文章:
评论前必须登录!
注册