JavaRush /Java Blog /Random-TW /Kotlin 和 Java 有什麼不同嗎?
Paul Soia
等級 26
Kiyv

Kotlin 和 Java 有什麼不同嗎?

在 Random-TW 群組發布
大家好。我想告訴你一些關於 Kotlin 語言的基本知識,這對初學者很有用。恰好的是,現在只用一種語言進入 Android 開發將會很困難——大多數新專案開始用 Kotlin 編寫,大多數現成的專案都是用 Java 編寫的。 Kotlin 和 Java 有什麼不同嗎? - 1目前我有 4 個專案在工作:兩個在 Kotlin 中,兩個在 Java 中(一個大的主項目,三個小的供內部使用)。當公司決定用 Kotlin 編寫新專案時,這個決定對我來說似乎很奇怪。為什麼要混合不同的語言?讓別人用Kotlin寫,我們為什麼需要它?但沒有出路,所以我決定嘗試一門新語言並開始學習。當然,第一個程式碼完全是用 Java 風格寫的,這進一步加深了誤解:為什麼我需要一門新語言?但隨著我的使用,我發現了越來越多的優點,現在(我已經用 Kotlin 寫了近 2 年了)我可以說 Kotlin 在 Android 開發中更方便。我想展示一些細微差別,對於決定在 Java 之後開始學習 Kotlin 的人來說,這些細微差別並不明顯。我還要提醒您,Android 使用 Java 8,當前版本為 14。因此,首先 -變數:Java:
Int a = 1;
String s = "test";
科特林:
val a = 1
var b = 2
val c: Int
val d = "test"
Kotlin 中有兩種類型的變數:val(唯讀)和 var(讀寫)。建議盡可能使用 val。如果變數已經初始化,則無需宣告變數的類型。其次 - if/else、switch 語句:您在 Java 中使用此語句鏈的頻率是多少:
if (вариант 1)
{...}
else if (вариант 2)
{...}
...
else
{...}
或者像這樣:
switch(выражениеДляВыбора) {
        case (meaning 1):
                Код1;
                break;
        case (meaning 2):
                Код2;
                break;
...
        case (meaning N):
                КодN;
                break;
        default:
                КодВыбораПоУмолчанию;
                break;
        }
在 Kotlin 中,when 運算子用於此類表達式(儘管也可以使用 if/else):
val x = 5
val result = when(x) {
        0, 1 -> "cool"
        2 -> "bad"
        5 -> "normal"
        else -> "error"
}
System.out.println(result)
在這裡,我們不僅遍歷了條件鏈,還立即將整個表達式分配給結果變量,這節省了相當多的程式碼行。但是,如果分支中只有兩個選項,我建議使用通常的 if..else。僅從三個選項中,施工時間就會更短。讓我們繼續 -建構子。這裡是童話故事。只需比較 Java 和 Kotlin 中的程式碼。爪哇:
public class Person {

    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
科特林:
class Person(private val firstName: String,
             private val lastName: String,
             private var age: Int) {
}
Kotlin 程式碼中似乎還有一些未完成的事情。但不,這是不同語言的兩個相同的代碼。讓我們稍微弄清楚一下。在 Kotlin 中,建構函式可以直接寫在類別名稱的主體中(但如果你願意,你可以用老式的方式來實現,就像在 Java 中一樣)。因此,我們寫了三個變量,在 Java 中,我們為年齡變數創建了一個建構函數、getter 和一個 setter。我們記得,在 Kotlin 中, val 變數是唯讀的,因此這些變數的 setter 不可用(Kotlin 在內部實作了 getter-setter)。var 變數允許您使用 setter。結果,我們幾乎用一行寫了Java中十幾行的內容。在這裡我建議閱讀更多有關 Kotlin 中資料類別的內容。但這並不是 Kotlin 建構函數所擅長的全部。但是如果您需要兩個建構函式怎麼辦?如果是三個呢?在 Java 中,它看起來像這樣:
public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

public Person(String firstName) {
        this.firstName = firstName;
    }
沒什麼複雜的,只要需要多少設計師,他們就是這麼做的。在 Kotlin 中,您只需一個建構函式即可完成。如何?很簡單 - 預設值。
class Person(private val firstName: String,
             private val lastName: String? = null,
             private var age: Int = 5) {
}
我們在建構函式中分配了預設值,現在呼叫它們將如下所示:
Person(firstName = "Elon", lastName = "Mask", age = 45)
Person(firstName = "Elon", age = 45)
Person(firstName = "Elon", lastName = "Mask")
可能會出現這樣的問題:這是什麼:
private val lastName: String? = null
這些其他問號是什麼?是的,如果值可以為 null,那麼它就被設定了?。還有一個像這樣的選項 - !!(如果變數不能接受 null)。你自己唸一下吧,很簡單。我們繼續討論下一點。 擴展。這是 Kotlin 中一個非常酷的工具,但 Java 沒有。有時在專案中我們使用在許多類別中重複的模板方法。例如,像這樣:
Toast.makeText(this, "hello world :)", Toast.LENGTH_SHORT).show();
在 Kotlin 中我們可以擴充一個類別:
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
然後在整個專案中這樣使用它:
context?.toast("hello world")
我們對 Context 類別進行了擴充。現在,只要上下文可用,它的新 toast 方法就可用。這可以對任何類別完成:String、Fragment、您的自訂類,沒有任何限制。我們要討論的最後一點是使用字串。這裡一切都很簡單。在Java中是這樣寫的:
String s = "friends";
int a = 5;
System.out.println("I have" + a + s + "!");
在 Kotlin 中更容易:
val s = "friends"
val a = 5
println("I have $a $s!")
這些是我在開始學習 Kotlin 時偶然發現的細微差別,希望對您有所幫助。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION