Kotlin和Java的簡單對比

weixin_34146805發表於2018-06-21

1. 再也不用寫分號了

是的,你沒聽錯,只要你用了kotlin就再也不用擔心忘記寫分號了,這點真的不要太爽啊。

2. 輸出語句再也不用寫System.out.println()這麼一大長串了

kotlin裡面的輸出語句非常簡單,輸出是print(),輸出一行是println(),其實從以上兩個特點來看風格有點像python,但是python程式碼的作用域是和縮排有關係,這點就很蛋疼了,萬一那天寫程式碼的時候眼神不好縮排少了或多了一格不就gg了嗎,然而kotlin保留了大括號,這點就讓我更加喜歡了

3. kotlin中建立一個物件不需要寫“new”關鍵字

熟悉java的人肯定都知道一個段子,程式設計師如果沒有女朋友那就去new一個出來,但是如果kotlin程式設計師沒有女朋友的話他連new一個物件出來的機會都沒有,來看看kotlin裡面是怎麼建立一個物件的

var person=Person()

沒有new關鍵字,也沒有分號,物件名前面也不像java裡面要先寫類的名字,這裡直接用var或者val來申明瞭

4. getter/setter

相信經常寫java的同學一定會對這兩個方法很熟悉,getter和setter雖然說IDEA會幫我們生成,但是每次都要自己去生成真的很煩啊,然而在Kotlin中,getter和setter是可選的,如果你沒有在程式碼中建立它們,它是會預設自動生成。
比如說:

class Account {
    var name: String = "" 
    var age: Int = 0
    var balance: Double = 0.0
}

和下面的程式碼是等價的

class Account {
    var name: String = "" 
    var age: Int = 0
    var balance: Double = 0.0
    // 這種set和get方法不推薦在程式碼中自己手動去寫
    set(vaule){
        field = value 
    }
    get() = field
}

這裡的getter/setter的寫法又有點類似c#,所以說kotlin是一個柔和了很多語言優點的語言,集眾家之所長形成的。
當然有幾點很重要:

  1. 用val申明的物件不允許設定setter函式,因為該函式是隻讀的。
  2. 類的定義在宣告屬性時,Kotlin採用預設訪問修飾符public,所以在kotlin中如果也用了private修飾符,那同樣得定義一系列的set()/get(),不然在類外面無法通過物件獲取屬性。 例如:
class Account {

    private var name: String = ""
    private var age: Int = 0
    private var balance: Double = 0.0

    fun setName(name: String) {
        this.name = name
    }

    fun getName(): String {
        return this.name
    }

    fun setAge(age: Int) {
        this.age = age
    }

    fun getAge(): Int {
        return this.age
    }

    fun setBalance(balance: Double) {
         this.balance = balance
    }

    fun getBalance(): Double {
         return this.balance
    }
 }

5.類的宣告

java類的成員變數,構造方法,成員方法宣告方式

public class JavaBean {
    private String name;

    public JavaBean(String name) {
        this.name = name;
    }

    public void hello(){
        System.out.println("name="+name);
    }
}

kotlin類的成員變數,構造方法,成員方法宣告方式

class KotlinBean(val name:String){
    fun hello(){
        println("name"+name)
    }
}

6. 空安全

為什麼要說空安全,在Java程式碼中,我們經常要做判空處理,就是所謂的if(xx!=null){//doSomething()},但是在kotlin中它需要呼叫一個操作符“ ?”來明確指定一個物件,或者一個屬性變數是否可以為空。

5264821-3907ff727569c336.png

7. Kotlin的when語句和Java的switch語句

kt中的when語句和Java中的switch語句的作用是相同的,但是寫法上卻不盡相同,先看示例:
Kotlin 的 when 迴圈判斷語句

fun test(value: Int){
    when(value){
         10 -> println("數字10");
         20 -> println("數字20");
         30 -> println("數字30");
        else ->{
            println("未知數");
        }
    }
}

Java的switch語句

private void test(int value) {
        switch (value) {
            case 10:
                println("數字10");
                break;
            case 20:
                println("數字20");
                break;
            case 30:
                println("數字30");
                break;
            default:
                println("未知數");
       }
}

可以很明顯的看出來kotlin裡的when語句有lambda的風格,雖然用了->else代替了switch語句中的casedefault使得程式碼量少了很多,但是其實可讀性卻少了很多

8. 繼承,介面等的關鍵字

  1. 對於繼承,用:代替extends關鍵字
    Java:MainActivity extends Activity,
    Kotlin:MaiActivity :Activity()
  2. 對於介面,用:代替implements    
    Java:
public class MammalInt implements Animal{
   public void eat(){
      System.out.println("Mammal eats");
   }
}

kotlin:

class Child : MyInterface {
    override fun bar() {
        // 方法體
        println("bar")
    }
}

9. for迴圈的變化

作為初學者,最常用的莫過於for迴圈了(雖然偶爾也會用用while迴圈,do...while的話,額,那是啥?)而在kotlin中,for迴圈的變化也是非常大的。舉個栗子:
在java中是這樣寫的for(int i = ; i < 100; i++)
Kotlin是這樣寫的for (i in 0..99)
kotlin中的那個寫法叫做區間,和python中的range()函式類似,但是用起來會更方便。

這裡做個插曲來介紹下Kotlin中的區間,注意until/step/downTo關鍵字的使用
// 左閉右開區間,合法值包括11,但不包括66
for (i in 11 until 66) { ... }
// 每次預設遞增1,這裡改為每次遞增4
for (i in 23..89 step 4) { ... }
// for迴圈預設遞增,這裡使用downTo表示遞減
sfor (i in 50 downTo 7) { ... }

增強For迴圈

java中: for(集合 變數:集合名)
kotlin中:for(變數名 in 變數集合)

while語句和do..while語句在kotlin中和java基本無異

最後

先簡單的總結下自己在學kotlin的過程中和Java的對比,有點亂,暫時先到這裡,等著深入學習後繼續總結。

相關文章