序言
kotlin的初衷本来就是为了快速生成Javascript而开发,但是Google在与Java的官司过后,毅然决然决定更换Android语言体系,不再采用Java,于是kotlin被其采用。
面对kotlin成为Google的新宠,Android界起先是一片哗然的。然而后来……
1.png0.Kotlin真香
kotlin之所以成了Google的亲儿子,无非就是以下几点:
-
简洁、优雅
-
安全、快速
-
函数与属性的扩展
-
兼容java(也就是可直接通过jvm执行)
-
强大的lambda、强大的语法糖、强大的判NULL规则
1.kotlin、java互调
好了,接入今天的正轨!
在我的前两篇文章中其实就已经可以看出kotlin与java的互调,只是当时我并没有讲解。
首先,创建今天的项目:【Kt3】
2.png从上图就可以看到,我们之前的项目所用一直都是 Java|IDEA
接下来,我们分别创建两个包java
和kt
并分别在各自包下创建JavaFile.java
和KtFile.kt
两个文件
一. Kotlin调用Java
JavaFile.java
中我们写下
接下来我们在KtFile.kt
中写下main函数
如上图,代码提示中已经出现了JavaFile
这个类,再看包名cn.xinidi.java
没错,就是我们自定义的包名。
然后我们就可以试着调用刚刚写好的sayHello
方法。
成功执行!同样我们可以看到图中的执行程序就是Java.exe
二. Java调用Kotlin
好了,kotlin既然能够直接调用java,那么我们再来看java调用kotlin
修改代码
Kt:
8.pngJava:
9.png运行结果:
10.png可以看到,已经成功运行了!
11.jpg所以!Kotlin与Java到底是什么关系?为什么Kotlin能直接调用Java?
12.jpg让我把java代码直接粘贴到Kotlin文件中(很神奇的,你别不信)
嗯?这段英文什么意思?(我英语差啊没过四级,看不懂!!)
剪贴板的内容来自java文件,你要不要把它转换成Kotlin代码?
哈哈,凭借我的撇脚英语连懵带猜,大概意思应该是这样吧!
我们点一下yes
好的!如我所愿,它直接变成了Kotlin代码
那么同样!我把Kotlin代码复制到java文件呢?
试试?试试就试试!
14.png保险起见,我首先注释掉了main函数。
嗯?为啥没变?
退回上一步!!!
15.png好了吧!java是可以直接复制过来转成Kotlin代码的。
但是Kotlin转Java代码就不能这用了!那怎么转?
看我操作!
16.png 17.png 18.png好的!!!!这下java代码出来了!
但是……?这也太花了!
19.png那我们这样,只转一个方法
20.png这就好理解多了吧!
21.png-
默认给了一个
public final class KtFileKt
类 -
然后就是刚刚的
sayHello
方法
至于中间的那条红色下划线……就是IDEA报的错误,说的是public类与文件名不一致。
为什么又多出来这么多呢?谁知道Kotlin是怎么想的。
好了这个问题不宜深究,因为谁闲的没事将二者代码来回转换?明显不是脑子what了嘛。
而且,kotlin的产物是由jvm执行的!!!!
那表示什么?.class
文件嘛!
我们打开项目的out文件夹看看。
22.png看看,这是啥!
就这样了!本小节完了!
4. 关于java中静态物与Kotlin中的静态物
众所周知!在java中存在一个static
关键字,它存在的目的就是将一个类中的成员
静态化,跟随jvm的执行而执行。
可在kotlin中,没有static
的概念!
那么我们想要直接静态调用一个成员该怎么去实现呢?
根据文档,我整理了以下
- 伴生对象
companion object
首先我们来看java中的静态实现方式
public class JavaFile {
public static final String TEST_FIELD = "我是java中的静态成员常量!";
...
}
然鹅kotlin中的写法则是
class KtFile {
//伴生对象(可以直接理解为静态方法)
companion object {
fun sayOk() {
println("Kotlin say Ok!!")
}
}
}
那么二者有何不同?
在刚刚的kotlin转java操作中其实已经有了结果。
23.png我们来分析上图:
首先是一个public final class KtFile
接下来静态(static
)了一个成员内部类
public static final KtFile.Companion Companion = ...
KtFile.Companion
类中我们发现了我们所写的sayOk
方法
然后再回到我们Java调用Kotlin的步骤中
24.png如图,正是调用了我们静态内部类的Companion
对象中的sayOk
方法。
那么我们在kotlin中页需要一个TEST_FIELD
呢?该怎么写?
class KtFile {
//伴生对象(可以直接理解为静态方法)
companion object {
const val TEST_FIELD = "我是Kotlin中的成员常量"
fun sayOk() {
println("Kotlin say Ok!!")
}
}
}
直接写!
转成java后:
25.png至此,kotlin中的静态实现就完成了
当然!除了上面companion object
的还有以下写法:
companion object MyStatic{...}
当然MyStatic
并非是固定的,它存在的目的就是为了取代默认的Companion
,你可以自己随便取名,它就是一个常量名而已。
5. 总结
-
kotlin可以直接与java互相调用,而且代码之间可以互相转换(但是没事不要瞎转)。
-
kotlin编译后的参悟同样是
.class
文件,可以通过jvm(java虚拟机)直接调用运行。 -
kotlin中,静态物的生成是使用伴生对象
companion object
实现,默认的对象名是Companion
,可自行定义。
最后留一个小问题:
companion object {
val TEST_FIELD_1 = "我是Kotlin中的成员常量1"
const val TEST_FIELD_2 = "我是Kotlin中的成员常量2"
}
上述两个常量的区别(别给我整些没用的啊,常量名、常量值、修饰符不同,我都知道的)。
网友评论