目录
Kotlin与Java之间的互调
1、语法变化
1.1、kotlin的函数是可以写在类的外面的
/**
* kotlin的函数是可以写在类的外面的,java的不可以,这是因为kt文件编译之后,会变成相当于jvm层次的class文件
* 1、类中的inside函数可以调用类外的outside函数
* 2、类外的outside函数不能调用类中的inside函数
*/
fun outside(who:String) {
//我在类的外面,MainActivity.kt文件的里面
println("我是$who")
}
class MainActivity : AppCompatActivity() {
private fun inside() {
//我在类的里面,
outside("张三")
}
}
1.2、java函数调用kotlin函数
如下图java函数如果想要调用kotlin中的函数就需要用kotlin 文件名+Kt 的形式来调用内部的函数。
1.3、kotlin匿名内部类的写法
文件目录
/*
* kotlin中的匿名内部类在编译过程中会生成一个INSTANCE的单例对象,
* 并把自己的构造函数声明为private
* (这也是kotlin中单例模式的书写方式之一)
*/
//K_Basis.kt文件中的内部类
object InsideClass1{
fun sayMessage1(msg:String){
print(msg)
}
}
//MainActivity.kt文件中的内部类
class MainActivity : AppCompatActivity() {
object InsideClass {
fun sayHello(msg: String) {
print(msg)
}
}
}
//J_Basis.java中调用kotlin内部类的方法
public class J_Basis {
/*
* kotlin中的匿名内部类在编译过程中会生成一个INSTANCE的单例对象,
* 并把自己的构造函数声明为private
* (这也是kotlin中单例模式的书写方式)
*/
public static void main(String[] args) {
MainActivityKt.outside("张三");
MainActivity.InsideClass.INSTANCE.sayHello("hello");
InsideClass1.INSTANCE.sayHello1("hello1");
}
}
1.4、对class的调用
/**
* 1、当调用java的class的时候需要在后面加java标签
* 2、kotlin调用kotlin类则不需要
*/
fun main() {
testClass(J_Basis::class.java)
testClass1(MainActivity::class)
}
fun testClass(javaClass:Class<J_Basis>){
}
fun testClass1(kotlinClass:KClass<MainActivity>){
}
2、Kotlin关键字处理
2.1、Kotlin中没有封装类
就比如int的封装类Integer在kotlin中是没有,如下图testInteger()函数的参数Integer类型,但在kotlin中识别出来的类型是Int!这是一种兼容类型,kotlin自动将Integer类型转换成了自己能运行的兼容类型。
那么怎么实现封装类呢?可以使用反射来实现封装类。
public class TestInteger {
public static void testInteger(Integer integer) {
System.out.print("integer=" + integer);
}
public static void testInteger1(int integer) {
System.out.print("integer=" + integer);
}
}
2.2、Kotlin类型null值敏感
2.3、Kotlin没有静态变量与静态方法
/**
* 前面我们讲过,调用匿名内部类的函数,可以通过INSTANCE来调用
* 那么我们怎么实现像Java中调用静态方法的形式用类名直接调用呢
* 在Kotlin中有一个注解@JvmStatic可是将kotlin方法编译成Java中的静态方法和变量
*/
object InsideClass {
@JvmStatic
var name: String = "Zhang San"
@JvmStatic
fun writeName(name: String) {
println("我的名字叫$name")
}
fun writeName1(name1: String) {
println("我的名字叫$name1")
}
}