Kotlin 基础语法-01-基本知识-与java互调
前言:
Kotlin 语言在2017年被google 官方宣布为Andorid 开发的第一语言、 不可否认我们现在很多项目和一些老旧项目依然有很多人在使用Java 语言,但随着未来慢慢的推广和替代,kotlin 会逐渐取代上层Java语言开发的份额,由此可见我们学习kotlin 语言的重要性。
扯淡:
这一kotlin基础语法系列适合有一定java语言语法和C或者C++ 基础的读者来阅读, 文中可能有需要和其他语言进行类比。 先这,不想扯淡太多了,由于疫情影响,虽然是远程办公,但总觉得比去办公室坐班还累,时间明显不够用,抱歉更慢了。
1. kotlin 的基本知识
kotlin文件后缀名是kt结尾, 类似这样, demo.kt
变量名声明方式:
var age : Int = 28
val name : String = "hello world , kotlin "
var address = " bei jing city .. "
kotlin 中 var 代表是可变类型, : 后边为变量类型, val 代表的是不可变类型, 当然如果后边的数据类型 能够自动推断出数据类型并赋值类型给变量。 因此可以省去数据类型的表示。
另外kotlin是空安全类型, 嘛意思?
// var name:String = null
// 这么着是声明不成功的, 不允许空赋值
var name2:String? = null
// 这样是可以的 、 String? 意思就是变量类型有可能为空
var name = name2 // 这是不可以赋值的
var name = name2!! // 如果确认name2 一定不为空 则可以这么强转。
注意String和String? 是不同的类型, String?可以给String 赋值、当然name2可以直接接受 name 的赋值 。
接下来 再看一下kotlin 的基础语法
fun printStr(str: String):String{
println("str is $str")
return str
}
printStr("hello world kotlin")
打印结果:
str is hello world kotlin
2. kotlin 与Java代码互调
学习kotlin免不了使用以前的java代码 、那么了解Java与kotlin 互调就会很重要, 简单了解一下。
语法变化
kotlin 关键字处理
kotlin 是没有封装类的, 也就是说方法是可以直接写在文件中的,举个例子,
/// Utils.kt
fun echo(name:String){
println("$name")
}
/// Main.java
public static void main(String args[]){
UtilsKt.echo("hello java & kotlin");
}
文件名 + Kt.方法名() 这就是Java调用Kotlin方法的方式。 Utils这个文件中的所有变量和函数和方法 都会编译成文件名Kt文件。 这样就能解释通为什么可以这么调用了。
Java与Kotlin交互的语法变化
object Test{
fun sayHello(msg: String){
println(msg)
}
}
那么怎么调用呢
// Kotlin
Test.sayHello("hello kotlin")
/// java
Test.INSTANCE.sayHello("Hello java ")
object 修饰的Test会被编译成一个静态单例实例化instance 调用方式就是 类名.INSTANCE.方法名 。 当然这也是kotlin 中单例的一种写法。
在java中我们常需要传class ,比如Main.class
那么在kotlin 中怎么声明呢
fun main(args: Array<String){
/// java Main
testPrintClass(JavaMain::class.java)
/// kotlin Main
testPrintKtClass(KotlinMain::class)
}
/// 打印类名 JavaMain 是另外的一个类名
fun testPrintClass(clazz: Class<JavaMain>){
println(clazz.simpleName)
}
///再来个 kotlin类的打印
fun testPrintKtClass(clazz: KClass<KotlinMain>){
println(clazz.simpleName)
}
不再赘述、这是两种调用方式、 上边的是java类,下边是kotlin 类的调用方式
接下来说一下 关键字冲突怎么办
比如说java中in并不是个关键字、而在kotlin中却是关键字。
那么调用方式
// java code
class JavaaMain{
public static final String in = "in";
}
/// kotlin code
fun main(args: Array<String>){
println(JavaMain.`in`)
/// 引用Java类中的变量 使用`` 包括起来 这个冲突。
}
看起来是不是怪怪的 、当然在java中的变量声明如果避免使用了kotlin关键字 也就不用这么怪异的写法了
不写那么长了、这篇文章。 接下来写一些kotlin基础中常见的问题作为本文的最后一部分。
3. java和kotin 互调常见问题
/// java code
public interface AInterface {
void printHello(int a );
void printHello(Integer a );
}
public class ASample implements AInterface {
public static final ASample as = new ASample();
@Override
public void printHello(int a) {
System.out.print("a: "+ a);
}
@Override
public void printHello(Integer a) {
System.out.print("aI: "+ a);
}
}
那么我们在kotlin中怎么调用呢
fun main(args: Array<String>) {
printA()
}
fun printA(){
ASample.`as`.printHello(123)
}
打印结果是:
a:123
这就说明了、如果java中重载方法、方法名、类型一致、 那么执行只会按照基本类型执行。 也就是按照参数类型为int 的那个方法执行。
当然在kotlin 中这么声明了、 你会觉得、我靠、根本就声明不成功好吧,因为没有Integer这个类型。 歇了。
再来一段代码
在Asample类中我们声明了如下方法
public String isEmpty(String name){
return name.isEmpty()?null:name;
}
在kotlin 中调用
fun printB(){
var fmt1 = ASample().isEmpty("")
/// fmt1 这时候的返回类型是String! 这是无法声明的一种类型 、是一种kotlin 调用java代码中的一种兼容类型。
println(fmt1.length)
/// 这里执行的结果 只能是按照java的语法来走、 打印结果是NullPointerExecption
// var fmt2: String = ASample().isEmpty("")
//
// 这样调用是不行的、String 是不可空类型 , 而isEmpty 是可空类型。所以编译不过。
// println(fmt2.length)
var fmt3: String? = ASample().isEmpty("")
/// 当fmt3 声明成可空类型String? 时、 则调用fmt3? 不会崩溃、打印结果为null
println(fmt3?.length)
}
上边的例子说明了,我们要使用一个变量、一个方法、 首先要确定该变量、方法会不会为空、 如果为空则需要直接声明称为可空类型, 防止代码中出现不必要的麻烦。
继续,
Kotlin 中没有静态变量与静态方法
例如在kotlin中声明了
object Test{
fun sayHello(msg:String){
println(msg)
}
}
那么在Java中调用sayHello就需要
Test.INSTANCE.sayHello("hello")
kotlin code 则需要
Test.sayHello("k Hello ")
那么怎样才可以使Java中调用时直接使用类名来调用呢
,当然是可以的,
object Test{
@JvmStatic
fun sayHello(msg:String){
println(msg)
}
}
/// java code
Test.sayHello("j hello ")
上面这个@JvmStatic 注解会被编译成public static的方法 、所以就可以直接调用。
4. 总结
多上手敲、多尝试、多思考、 有问题评论区我们共同讨论进步。