Kotlin Android 第10天,从 0 到 ML - Kotlin 与 Java 互动操作

前言:

   虽然kotlin 为android 官方首选语言,新专案大都也是用kotlin ,但是免不了会有Java的专案要维护或修改,这时就变混合双打,免不了要互相呼叫或继承。

大纲:

1.Kotlin 呼叫 Java Class

//Kotlin
var mJavaPlayer = Day10Ironman()
mJavaPlayer.JavaIronPlayer("Kotlin Android 30天,从 0 到 ML")

//Java
public class Day10Ironman {
    private String mTitle;
    private String mPlayer = "kevin";
    private String mStartDay = "9/1";
    ....
}

public void JavaIronPlayer(String title){
        this.mTitle = title;
}

Kotlin 呼叫 Java Class Method

//Kotlin
mJavaPlayer.printPlayerInfoJava()

println("Java return IronPlayer = "+mJavaPlayer.ironPlayer())

//Java
public void printPlayerInfoJava(){
        System.out.println("Java Title = "+mTitle);
}

Boolean isFunction()

//Kotlin
println("Java is Complete Iron = "+mJavaPlayer.isCompleteIron)

//Java
public boolean isCompleteIron(){
        Calendar endDay = Calendar.getInstance();
        endDay.set(2021,Calendar.OCTOBER,5);

        Calendar mToday = Calendar.getInstance();

        long diffDay = (endDay.getTimeInMillis()-mToday.getTimeInMillis()) 
                        / (60*60*24*1000) ;

        System.out.println("Java log 剩下"+diffDay+"天完赛");

        if((int)diffDay > 30){
            return true;
        }else {
            return false;
        }
}

Getter 与 Setter

//Kotlin
println("开赛时间"+mJavaPlayer.getmStartDay()) // 9/1

mJavaPlayer.setmStartDay("9/6")

println("修改开赛时间"+mJavaPlayer.getmStartDay())

//Java
public String getmStartDay() {
        return mStartDay;
}

public void setmStartDay(String mStartDay) {
        this.mStartDay = mStartDay;
}

处理 Null Safety

 //Kotlin 
 println(mJavaPlayer.ironPlayer().uppercase(Locale.getDefault())) //kevin -> KEVIN
 println(mJavaPlayer.nullPlayer()?.uppercase(Locale.getDefault()) ?: "Noman") 
 //null -> Noman
 
 //Java
 @NotNull
 public String ironPlayer(){
    return mPlayer;
 }

 @Nullable
 public String nullPlayer(){
    return null;
 }   
 

-----------------------------------------------------------------------------------

2.Java 呼叫 Kotlin Class

//Java
Day8Activity.ironman javaIronPlayer = 
     new Day8Activity.ironman("Kotlin Android 30天,从 0 到 ML","kevin");
     
//Kotlin
open class ironman constructor(titleName: String, playerName: String){
    //DAY10 JAVA 呼叫常数
    companion object{
        val startDay: String = "9/6"
        @JvmStatic
        fun teamName(): String = "Koltin 爱台湾 2021"
    }

    var mTitle = titleName
    var mPlayer = playerName 
    
    open fun printPlayerInfo(){
        println("Title: $mTitle , Player: $mPlayer ")
    }
}

Class Properties
//Java
System.out.println(javaIronPlayer.getMPlayer());

javaIronPlayer.setMPlayer("KEVIN");
System.out.println(javaIronPlayer.getMPlayer());

//Kotlin
var mPlayer = playerName 

Companion Object Properties

//Java
System.out.println(javaIronPlayer.Companion.getStartDay());

//Kotlin
....
companion object{
        val startDay: String = "9/6"
....

Companion Object Method

//Java
System.out.println(javaIronPlayer.Companion.teamName());

//Kotlin
companion object{
        val startDay: String = "9/6"
        @JvmStatic
        fun teamName(): String = "Koltin 爱台湾 2021"
}

Top-Level function

//Java
String mktTitle = new Day10KtClass().KtTitle();
System.out.println( mktTitle);

//Kotlin Day10KtClass.kt

class Day10KtClass {
    @JvmName("KtTitle")
    fun getIronTitle2():String {return "Kotlin Class"}
}

@file:JvmName @JvmName

//Java
System.out.println(KotlinMain.javaCallKt());

//Kotlin Main.kt
@file:JvmName("KotlinMain")
package com.ithome.kotlin30dayml

@JvmName("javaCallKt")
fun kotlinMainprint():String{return "kotlin main Hello World"}


fun main(args: Array<String>){
    println("Hello World")
}

@JvmField

//Java
Day9Activity.webSpeaker mSpeaker = new Day9Activity.webSpeaker("Java call Kotlin");
System.out.println(mSpeaker.mTitle);

//Kotlin
class webSpeaker(title:String): seminarSpeakers(title) {
    @JvmField
    var mTitle = title
    override fun showTitle() {
        println("abstract Tilte = $mTitle")
    }
}

@JvmStatic

//Java
System.out.println(Day8Activity.ironman.teamName());

//Kotlin
open class ironman constructor(titleName: String, playerName: String){
    //DAY10 JAVA 呼叫常数
    companion object{
        val startDay: String = "9/6"
        @JvmStatic
        fun teamName(): String = "Koltin 爱台湾 2021"
    }

    var mTitle = titleName
    var mPlayer = playerName
    open fun printPlayerInfo(){
        println("Title: $mTitle , Player: $mPlayer ")
    }
}

执行结果:
https://ithelp.ithome.com.tw/upload/images/20210915/20121643JusY5juSQ7.png

参考:

https://kotlinlang.org/docs/java-interop.html
https://kotlinlang.org/docs/java-to-kotlin-interop.html


<<:  Day 3.环境预备备(一)-VSCode的加入

>>:  Day4 - 建立Android模拟器

【把玩Azure DevOps】Day15 Pipeline与Artifacts应用:覆写C#专案属性资讯(上传nuget package成功)

前面文章透过Pipeline上传nuget package到Artifact feed的时候因为产生...

[Day 01] 前言

大家好,我是来自台北教育大学玩游所的硕士生 May,在大学接触到如何写网页後,就毅然踏入了前端这个大...

Day 11 python Pandas

今天我们要介绍的是python的Pandas,所谓的Pandas就是python里面的其中一个套件。...

[DAY30] DDD学习资源与完赛感言

DDD 学习资源 ddd-crew 里面有许多关於 DDD 各个面向的 repo,其中这个 repo...

Day30 撒花~

大家好,我是乌木白,今天是铁人赛最後一天,谢谢大家在这些天不管是无意或是有意的点进来参观,都非常感...