1、Kotlin调用Java
1.1、属性
Kotlin调用属性实际上就是访问getter、setter方法,因此Java类只要提供了getter方法,Kotlin就可将其当成只读属性。如果Java类提供了getter、setter方法,Kotlin就可将其当成读写属性。
注:其实Java是否包含了成员变量不重要,关键是getter、setter方法。
如果getter方法的返回值类型是boolean,该getter方法名也以is开头,此时Kotlin会将其当成属性名与getter方法同名的属性。比如boolean.isMarried()方法可作为Kotlin的只读属性,该属性名为isMarried.
1.2、Java中的类名、方法名、接口名等是Kotlin的关键字,则需要进行转义(``)
public class InMethod{
public void in(){
}}
fun main(args:Array<String>)
var im = InMethod()
im.`in`()
}
1.3、对Java数组的处理
Kotlin的数组是不支持型变的,因此Array<String>不能赋值给Array<Object>。但Java数组是支持型变的,因此String[]可以直接赋值给Object[]变量。
此外,Java还支持int[]、long[]等基本类型的数组,这种数组可以避免拆装箱带来的性能开销。但Kotlin的Array类是不支持这种基本数据类型的数组,为此,Kotlin提供了ByteArray、ShortArray、......数组,这几种数组专门用于代替Java的int[]、long[]等基本类型的数组。
1.4、调用参数个数可变的方法
public class JavaVarargs{
public void test(int...nums){}
}
Kotlin==>
val jv =JavaVarargs()
jv.test(3,5,6,2)
val intArr = intArrayOf(1,2,3,5)
//将数组解开成多个元素
jv.test(*intArr)
1.5、Object的处理
Java的Object对应Kotlin的Any,又因为Any只声明了toString()、equals()、hashCode()方法,如何使用Object类中其他方法?
-
wait/notify/notifyAll
先转型再调用:(foo as java.lang.Object).wait()
-
getClass
obj::Class.java或obj.javaClass
-
clone
如果要让一个对象重写clone方法,则需要让该类实现kotlin.cloneable接口。
class Example:kotlin.cloneable{
override fun clone():Any{
}}
1.6、访问静态成员
Java类中的静态成员可以通过伴生对象的语法调用。
java.awt.BorderLayout.NORTH//访问java.awt.BorderLayout的NORTH静态成员(就像访问伴生对象的属性一样)
1.7、SAM转换(利用Lambda表达式来作为函数式接口的实例)
//使用Lambda表达式来创建函数式接口(Runnable)的对象
var r = Runnable{
。。。。。
}
1.8、Kotlin中调用JNI