java调用kotlin方法
kotlin中定义2个方法,一个在类中,一个在文件中(类的外面)
//写在class中的方法,需要通过class来调用
class Test {
fun echo2(name:String){
println("kotlin中的方法,$name")
}
}
//会编译成 “pulic static” 的方法和变量
fun echo(name: String) {
println("kotlin中的方法,$name")
}
kotlin中调用
fun main() {
echo("123")
Test().echo2("123")
}
java中调用
//Main.java 调用kotlin方法
public class Main {
public static void main(String[] args) {
TestKt.echo("123");
new Test().echo2("123");
}
}
使用object声明一个kotlin类(单例)
kotlin中定义
//使用object声明一个单例
object Test {
fun sayMessage(msg: String) {
println(msg)
}
}
kotlin 中调用
//kotlin中调用这个方法
fun test(){
Test.sayMessage("hello")
}
java中调用
//java中调用这个方法
public class Main {
public static void main(String[] args) {
Test.INSTANCE.sayMessage("hello");
}
}
java和kotlin中的“类类型”
fun main() {
//在kotlin中调用java的类类型
testClass(JavaMain::class.java)
//在kotlin中调用kotlin的类类型
testClass(KotlinMain::class)
}
//JavaMain是一个java类
fun testClass(clazz: Class<JavaMain>) {
println(clazz.simpleName) //输出结果————JavaMain
}
//KotlinMain是一个kotlin类
fun testClass(clazz: KClass<KotlinMain>){
println(clazz.simpleName) //输出结果————KotlinMain
}
关键字冲突
public class JavaMain {
//java中定义一个变量名in这个是和kotlin的关键字冲突
public static String in = "in";
}
fun test(){
println(JavaMain.`in`)//调用java中的in变量的时候需要用``进行转义(左上角和波浪线一起的那个按键)
}
kotlin没有Integer等基本类型的封装类,只能用基本类型
public interface JavaInterface {
void printNum(int num);//传入基本类型
void printNum(Integer num);//传入封装类型
}
class KotlinMain : JavaInterface {
//使用kotlin去实现JavaInterface发现kotlin认为两个方法是同一个方法
override fun printNum(num: Int) {
TODO("Not yet implemented")
}
// override fun printNum(num: Int?) {
// TODO("Not yet implemented")
// }
}
kotlin类型空值敏感
public class JavaMain {
public static String format(String str) {
return str.isEmpty() ? null : str;
}
}
fun main() {
var str: String = "";
val format1 = JavaMain.format(str); // val format1: String! 是一个String!类型只能是自动生成,在调用java的时候
//println(format1.length)//由于上面format1的值其实是null,所以会报空
//val format2: String = JavaMain.format(str)//NullPointerException
val format3: String? = JavaMain.format(str)//String?这个是可以为空的类型
println(format3?.length)//打印结果————null,空安全,在接收一个java对象的时候,如果不确定是否为null,则需要用一个可空类型去接收
}
kotlin没有静态变量和静态方法
//使用object声明一个单例
object MyTest {
@JvmStatic
fun sayMessage(msg: String) {
println(msg)
}
}
kotlin中调用
fun main() {
MyTest.sayMessage("")
}
java中调用
public class JavaMain {
public static void main(String[] args) {
MyTest.INSTANCE.sayMessage("hello");
//如果使用@JvmStatic注解,则不需要使用以上的INSTANCE
MyTest.sayMessage("hello");
}
}