91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kotlin和Java混合開發的示例分析

發布時間:2021-09-05 11:28:50 來源:億速云 閱讀:149 作者:小新 欄目:開發技術

這篇文章主要介紹了Kotlin和Java混合開發的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    一、前沿

    如果你學習過其他的編程語言,你就會發現 Java 的語法很是哆嗦,可是我們為什么沒有放棄 Java 這門編程語言呢?因為 JVM 是一個非常好的平臺,而且 Java 程序員目前在中國所占的比重實在是太高了。這是歷史包袱導致的。暫且不說 Python,語法絕對比 Java 簡化的不是一個級別,就連 C# 也比 Java 語法優美很多。

    我們知道,Java 程序運行過程是這樣的:

    編寫源代碼(.java)-> 編譯源文件(.class)-> JVM 虛擬機將 class 文件加載進內存,執行

    既然如此,如果有一門語言同樣能編譯成 class 文件,再由 JVM 去加載他,并且這門語言比 Java 語法更加優美簡潔,你樂不樂意去使用呢?那么這門優秀的語言就是 Kotlin。Kotlin 他的運程過程是這樣的:

    編寫源代碼(.kt)-> 編譯源文件(.class)-> JVM 虛擬機將 class 文件加載進內存,執行。

    2017年,Google 宣布 Kotlin 成為 Android 官方開發語言,可見Kotlin 之好。

    當然,隨著 Kotlin 的發展,Kotlin 已經不單單是 JVM 平臺上的語言,也可以將 Kotlin 代碼編譯為 JavaScript,未來還會有 Kotlin Native,可見 Kotlin 絕對是極具潛力。

    二、學習 Kotlin 前準備

    工欲善其事,必先利其器。首先一定要選擇一個好的 IDE,Kotlin 是由 JetBrains 公司開發,那么我們當然要用 JetBrains 公司自家的 IDE 啦,我們就選用 IDEA!相信現在絕大多數 Java 開發者都在用的。

    Kotlin和Java混合開發的示例分析

    我們新建一個普通項目即可。

    如果我們要寫 Kotlin 代碼,很簡單,右鍵,新建一個 Kotlin 文件即可。

    Kotlin和Java混合開發的示例分析

    新建文件后,IDE 會提示我們需要配置,按照提示,配置一下即可。

    Kotlin和Java混合開發的示例分析

    三、Kotlin 語法簡介

    如果你已經學習過了 Java,入門 Kotlin 會很快。

    我們先來寫一個Hello world!

    打開我們新建好的 kt 文件,輸入以下代碼:

    fun main(args: Array<String>) {
        print("hello world")
    }

    我們再來回顧一下 Java 代碼:

    class HelloWord{
    public static void main(String[] args){
    System.out.println("Hello world");
         }
    }

    我們對比一下,Kotlin 的代碼非常少。我們 Java 中,方法必須寫在類中,而我們的 Kotlin 支持包級函數,靜態方法不需要寫在一個類中。并且 Kotlin 每一句結束不需要分號。

    在 Kotlin 中,所有變量聲明都需要用 val 或 var 修飾,并且支持類型推斷,但你需要注意的是,Kotlin 是一個靜態語言。

    變量聲明格式 : val/var 變量名(:類型,可不寫,會自動推斷)

    val i=1val i:Int =1 的效果是一樣的。

    var i=1val i=1 如果被翻譯成 Java 分別就是:

    final int i=1
    int i=1

    被 val 修飾的變量編譯后會被翻譯成類似于 java 中的 final 關鍵字,這是 Kotlin 一大特點,在 Kotlin 中所有類,方法都會默認是 final 的。

    小編這邊建議您,初學的時候多看看 Kotlin 翻譯成 Java 的字節碼。 我們的 IDE 已經有相關插件了:

    Kotlin和Java混合開發的示例分析

    點擊后會出現如圖界面:

    Kotlin和Java混合開發的示例分析

    再點擊紅色框中的按鈕,就會顯示我們 Kotlin 被翻譯成 Java 的代碼了。

    優秀的表達式

    我們觀察以下代碼:

    Kotlin和Java混合開發的示例分析

    他和我們 Java 中的 if else 有哪些不同?

    我們表達式也可以有返回值了,注意千萬不要寫 return xxx,因為 return 就跳出方法了。在 Kotlin 中,條件表達式的最后一句就可以作為返回值,這一個小技能可以說非常實用,類似的還有 try、catch 也有類似的功能。

    加強版 switch

    本人作為一名資深 Java 開發者,確很少用 switch,一來 switch 必須對相同類型進行操作,功能單一,可能還沒有 if 強大,而且經常使用會增加代碼耦合度,一般會使用多態結合相關的設計模式來代替。

    我們來看看 Kotlin 中加強版的 switch 表達式 when:

    Kotlin和Java混合開發的示例分析

    當滿足第一個 case 分支,就會結束這個表達式。同理,他也可能作為一個表達式,每一個分支最后一句可以返回一個值,再給一個變量去接收,是不是比 switch 強大了一萬倍呢!

    模板字符串

    這個功能可是非常實用,我們在 java 中可能常常會有拼接字符串的痛苦,沒事,Kotlin 可以解決你的這個痛苦,我們看看這個代碼:

    Kotlin和Java混合開發的示例分析

    我們在字符串中,使用 ${},在花括號中,可以寫 Java 代碼,這樣就達到了模板字符串的效果。當然你也可以這樣這樣做:

    Kotlin和Java混合開發的示例分析

    使用 $ 加上變量名可以直接輸出這個變量。那么我們如果想輸出 $,那么就需要轉義了,和 Java 一樣,使用 \

    包裝類和基本數據類型不存在了

    在 Java 中類似 int、double 等等所有基本數據類型都有其對應的包裝類,在 Kotlin 中不存在了,一律使用 Int、Double、Float、String……

    在編譯的時候,Kotlin 會根據我們的情況智能選擇基本數據類型還是包裝類,不需要程序員去操心了。

    data class,再見 Java bean

    我們在寫 JavaBean 一般過程是寫上一個 class 類,里面編寫若干個字段,然后給上若干個 get/set 方法,有時候還會重寫 toString、equals、HashCode 方法。

    這些過程其實也有些重復,如果我們使用 Kotlin 為我們提供的 data class 編寫一個類:

    data class Person(val username:String,val age:Int)

    這樣我們就寫好了一個 data class,短短一句話,我們從聲明也可以看出,我們給 Person 這個類定義了 username 和 age 兩個屬性,我們使用 IDEA 自帶插件,把他翻譯成 Java 代碼看看:

    public final class Person {    @NotNull    private final String
    username;    private final int age;
     
       @NotNull    public final String getUsername() {
          return this.username;    }
     
       public final int getAge() {
          return this.age;    }
     
       public Person(@NotNull String username, int age) {
          Intrinsics.checkParameterIsNotNull(username, "username");
          super();
          this.username = username;
          this.age = age;    }
     
       @NotNull    public final String component1() {
          return this.username;    }
     
       public final int component2() {
          return this.age;    }
     
       @NotNull    public final Person copy(@NotNull String username, int
    age) {
          Intrinsics.checkParameterIsNotNull(username, "username");
          return new Person(username, age);    }
     
       // $FF: synthetic method    // $FF: bridge method    @NotNull   
    public static Person copy$default(Person var0, String var1, int var2,
    int var3, Object var4) {
          if ((var3 & 1) != 0) {
             var1 = var0.username;
          }
     
          if ((var3 & 2) != 0) {
             var2 = var0.age;
          }
     
          return var0.copy(var1, var2);    }
     
       public String toString() {
          return "Person(username=" + this.username + ", age=" + this.age + ")";    }
     
       public int hashCode() {
          return (this.username != null ? this.username.hashCode() : 0) * 31 + this.age;    }
     
       public boolean equals(Object var1) {
          if (this != var1) {
             if (var1 instanceof Person) {
                Person var2 = (Person)var1;
                if (Intrinsics.areEqual(this.username, var2.username) && this.age == var2.age) {
                   return true;
                }
             }
     
             return false;
          } else {
             return true;
          }    } }

    data class 太厲害了,Kotlin 在編譯的時候會自動幫我們加上 get/set 方法,還會為我們加上 tostring、euqals、hashcode 方法。

    不過,你要注意的是,Kotlin 類默認是 final 的,所以我的 data class 是不能被繼承的,而且他沒有無參的構造方法。如果這樣直接使用 MyBatis 是會報這個類找不到無參構造方法的錯的。

    為了解決這些問題,Kotlin 官方推薦了 no-arg 插件來解決這一問題,如果你想讓 data class 編譯時候去掉 final 關鍵字,可以使用 Kotlin 官方插件 all-open 插件來解決這一問題。

    插句題外話,在 Spring5 中,Spring 專門針對 Kotlin 做過很多的優化。比如,AOP 這一底層實現,相信有一定功底的人士都知道,spring 會為這個類使用 CGLIB 技術動態生成一個子類。而我們的 Kotlin 類默認是 final 的,因此,如果我們是用 Kotlin 寫的 AOP,想讓我們寫的 AOP 類能正常運行,就必須在 class 前面加上 open。可每次寫很麻煩,我們索引官方也推出了一個 kotlin-spring 插件,可以為這些類自動去 final 關鍵字。

    空指針異常不存在了

    Kotlin 中所有類型都區分非空或可空類型,比如可空的 Int,就是 Int?,如果這個類型允許空,我們就在這個類型后面加個 ?,不加 ? 的話則這個類型不可為空!

    比如我們定義一個方法某一個參數類型后面我們就指定了 ?,我們可以傳遞 Null,反之則不可以,或者加上 ! 強制傳遞。

    Kotlin 的絕技實在是太多了,包括還有定義方法的時候,我可以給參數指定默認值,調用的時候也可以指定參數名的時候進行傳遞,在編譯時候,Kotlin 會生成若干個重載的 Java 方法。當然這只是九牛一毛,Kotlin 最強大的就是高階函數和函數式編程了,并且支持科理化。支持運算符重載,可以為類增加擴展方法,強大到令人發指。

    同時,Kotlin 還支持協和編程(目前這塊不太成熟),由于篇幅有限,如果大家有興趣,我可以再做一次專題講解。

    編寫單例類

    單例模式是 23 種設計模式中非常常用的設計模式之一。在 Kotlin 中也有提供我們非常快捷的方式編寫單例類,實現單例僅僅只需要一行代碼:

    object Singleton

    是的,你沒有看錯,只需要寫2個單詞 ,object 代表聲明一個單例類,Singleton 為單例的類名,是不是很Easy?

    我們測試一下:

    Kotlin和Java混合開發的示例分析

    這里補充一下,由于 Kotlin 支持運算符重載,在 Kotlin 中,雙等號等同于調用 equals 方法,三等號才是比較內存地址。我們看到這里輸出的是 true,則說明,輸出的是同一個對象。我們再來看看他字節碼,翻譯成 Java 的代碼:

    Kotlin和Java混合開發的示例分析

    可以看出,就是一個簡單的單例模式。構造方法沒有顯示出來,其實是私有化的。其實我們還是可以通過反射去修改構造方法訪問修飾符來破壞他的單例的。

    擴展方法

    相信如果你做過多年的 Java 開發,手頭上一定有大量的 Util 類,比如 DateUtils、HtmlUtils、StringUtils 等等,其實這都是 Java 這門語言造成的,當你學會擴展方法后,從此告別 Util。

    比如我們要判斷一個字符串是否長度大于 0,我們無非要判斷他不為 null,且長度大于 0,如果用 Java 去實現相信你一定會寫一個 StringUtils,那么我們如何用 Kotlin 的擴展方法去實現呢?

    我們為 String 擴展一個 isNullOrEmpty 方法,如何返回 false,則說明長度大于 0。

    我們在定義方法的時候前面加上對應的類名即可變成擴展方法了。

    fun String.isNullOrEmpty():Boolean{
        return !(this!=null&& this.isNotEmpty())
    }

    這個代碼可以寫在任何地方。

    我們寫測試類調用:

    Kotlin和Java混合開發的示例分析

    是不是很自然。向 Util 說再見吧!其實我們的 Kotlin 在 String 類,集合類,IO 類等 JDK 很多類都提供了大量的擴展方法,比如我們學一個文本文件,現在只需要一句話:

    val file = System.IO.File("d:/1.txt")
        println(file.readText())

    readText 就是 Kotlin 為我們寫的擴展方法,類似的其實還有很多。因此,使用 Kotlin 一定會大大提高你的工作效率。

    運算符重載

    在 Kotlin 中,每一個運行符對應一個該類中的方法,如果該類中有相應的方法實現,就可以進行運算符重載。

    就連調用方法其實也是一樣,比如我們調用 a(b),等同于 a.invoke(b)

    表達式對應轉換
    a + ba.plus(b)
    a - ba.minus(b)
    a * ba.times(b)
    a / ba.div(b)
    a % ba.mod(b)
    a..ba.rangeTo(b)
    a[i]a.get(i)
    a[i, j]a.get(i, j)
    a[i_1, …, i_n]a.get(i_1, … , i_n)
    a[i] = ba.set(i, b)
    a[i,j] =ba.set(i, j, b)
    a[i_1, … , i_n] = ba.set(i_1,… ,o_n,b)
    a in bb.contains(a)
    a !in b!b.contains(a)
    a[i]a.get(i)
    a[i, j]a.get(i, j)
    a[i_1, …, i_n]a.get(i_1, … , i_n)
    a[i] = ba.set(i, b)
    a[i,j] =ba.set(i, j, b)
    a[i_1, … , i_n] = ba.set(i_1,… ,o_n,b)

    我們舉個例子,假如我們要計算一個日期后的若干天,我們如果用 Java 去干,相信你一定要寫不少于 10 行代碼,而且會很痛苦。而在 Kotlin 中,有了運算符重載,我就有了一個很好的思路,讓 data+1 就返回一天后的日期,是不是很絕?

    說到做到,我們來實現:

    根據上面表我們可以看出,+ 要重載的方法是 plus。可是 Date 類是 JDK 為我們提供的,我們如何去為他添加一個方法呢?沒錯,我們之前講過,Kotlin 支持類的擴展方法,我們為 Date 類擴展一個 plus 方法,擴展方法和運算符重載結合起來也會被識別。

    對了,重點還沒有說,如何定義運算符重載呢?僅僅寫對應的方法還不足夠,還要在 fun 前面加上 operator 關鍵字。所以,我們寫出如下代碼:

    operator fun Date.plus(nextVal:Int):Date{
        val calendar = GregorianCalendar()
        calendar.time = this
        calendar.add(Calendar.DATE, nextVal)
        return calendar.time
    }

    為了方便查看日期字符串,我們再擴展一個 stringFormat 方法,由于"yyyy-MM-dd"格式太常用,我們再給他一個默認值。

    fun Date.stringFormat(formatType:String = "yyyy-MM-dd"):String{
        return SimpleDateFormat(formatType).format(this)
    }

    寫測試方法:

    Kotlin和Java混合開發的示例分析

    絕了,不得不感嘆 Kotlin 的偉大!

    四、Kotlin 與 Java 混合開發

    由于 Kotlin 和 Java 編譯成 class 文件后完成一樣,所以 Kotlin 和 Java 有著天然的兼容性,100% 兼容。在 Kotlin 中你可以隨意的去使用 JVM 中定義好的類,也可以是你自己寫好的 Java 類,同一個項目中你可以既有 Java 類,也可以有 Kotlin 類。

    比如你定義了一個 data class Person 類,在同一個項目中,你可以新建一個 Java 類,使用 Person person = new Person(“小明”,12); 這完全沒有問題的。同樣,你用 Kotlin 定義好的類,在 Java 中可以同樣使用。所在,從現在開始使用 Kotlin,不要怕,即使有地方你擔心 Kotlin 自己不熟悉而實現不了,那你也可以在這時候使用 Java 去實現。100% 兼容,Java 中的所有類庫都可以去使用。

    這里附上一張 Kotlin 使用 SSM 圖:

    Kotlin和Java混合開發的示例分析

    可以看出,源碼是 Kotlin 的,我們同樣可以使用 Spring 框架,再附上這個項目源文件。

    Kotlin和Java混合開發的示例分析

    文件前面圖標右下角帶 K 的都是 Kotlin 文件,可見,Kotlin 和 Java 是非常好的。

    那么,像擴展方法、運算符重載、默認參數這類的我們該用 Java 如何去調用呢?

    這里有很遺憾了,由于 Java 語法的限制我們不能像 Kotlin 那樣去使用,但這并不代表我們不能用 Java 去調用,我們在 Java 中,只能當成一個普通方法去使用了。

    五、Kotlin 與 Java 總結

    個人認為 Kotlin 取代 Java 只是時間問題,現如今 Java 的更新速度已經很緩慢了,已經有越來越多的 Java 開發者去轉戰 Kotlin 這門語言。即使你現在的項目已經用 Java 寫的很多,從今天開始你也可以使用 Kotlin,與 Java 百分之一百兼容,這是他的最大的特點。在未來,Kotlin 也必定會走出 JVM 這個平臺,準確說,現在已經邁出了,未來會越來越強大。

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“Kotlin和Java混合開發的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    信丰县| 清丰县| 武宣县| 漳平市| 万州区| 白河县| 玉树县| 斗六市| 巴林右旗| 五台县| 遵化市| 安西县| 高邑县| 南澳县| 田阳县| 鱼台县| 随州市| 武清区| 乌兰浩特市| 永修县| 西宁市| 承德市| 当阳市| 阿勒泰市| 金寨县| 婺源县| 十堰市| 潞西市| 孟村| 措美县| 来宾市| 天峨县| 长垣县| 长岛县| 太康县| 沅江市| 海伦市| 秦安县| 米易县| 苏州市| 南华县|