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");
}