Kotlin 基础语法-01-基本知识-与java互调

36 篇文章 0 订阅
6 篇文章 0 订阅

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. 总结

多上手敲、多尝试、多思考、 有问题评论区我们共同讨论进步。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值