Java & Groovy & Scala & Kotlin - 06.變量與常量

Overview

本節(jié)介紹如何在四種語言中聲明變量和常量。

Java 篇

變量

語法

數(shù)據(jù)類型 變量名 = 變量值;

String variable = "foo";

常量

在變量前加上關(guān)鍵字 final 就可以將變量聲明為常量

final String constant = "foo";

Groovy 篇

變量

靜態(tài)類型變量

聲明方式與 Java 完全一致,但是 Groovy 不要求類型基本一致,只要等式右邊的值能夠向等式左邊變量的類型進行轉(zhuǎn)換那么變量的賦值仍舊成立

//  第二行報錯,因為 10 無法轉(zhuǎn)換為 Date 類型
Date date = new Date()
date = 10

//  正常運行,因為 Date 對象可以通過 toString() 方法轉(zhuǎn)換為 String 類型
String str = "10"
str = new Date()

以上代碼實際會被編譯成如下的 Java 代碼

Date date = (Date)ScriptBytecodeAdapter.castToType(var1[1].callConstructor(Date.class), Date.class);

String str = "10";
Object var6 = var1[2].callConstructor(Date.class);
str = (String)ShortTypeHandling.castToString(var6);
var1[3].callStatic(App.class, str);

可以看到第二個例子雖然在源代碼層面上只使用變量 str,但是在編譯后實際使用了 str, var6 兩個變量。

動態(tài)類型變量

語法

def 變量名 = 變量值

def foo = "foo"

動態(tài)類型可以自由變換值和變量類型

常量

Groovy 定義常量的方式與 Java 相同,但是目前的 v2.4.x 版本還是存在歷史遺留問題,常量實際上仍然可以被任意修改

例:

final String constant = "foo"
constant = 10

實際第二行的語句仍然可以正常執(zhí)行

String constant = "foo";

以上是上述例子的編譯結(jié)果,可以看到 final 關(guān)鍵字在編譯后被完全丟棄了,目前這個 Bug 官方聲稱已經(jīng)在 2.5.0-beta-1 版本修復(fù)了,具體情況可以查看 https://issues.apache.org/jira/browse/GROOVY-1628https://issues.apache.org/jira/browse/GROOVY-2752 兩個 issue。

Scala 篇

變量

語法

var 變量名: 變量類型 = 變量值

var variable: String = "foo"

常量(值)

在官方術(shù)語中, Scala 中的常量被實際被稱為值

語法

val 值名: 值類型 = 具體值

val constant = "foo"

簡便方式

在 Scala 中,無論是聲明變量還是值時都可以直接省略類型說明

var variable = "foo"
val constant = "foo"

這種聲明方式看起來像 Groovy 聲明動態(tài)類型。但實際上 Scala 是比 Java 更強的靜態(tài)類型語言,只是 Scala 更智能,如果你不明確指定類型的話,Scala 會通過等式右邊的值來推斷其數(shù)據(jù)類型,任何試圖改變數(shù)據(jù)類型的行為都會報錯。

Kotlin 篇

Kotlin 在使用時與 Scala 一致,這里就省略了。

Summary

  • Groovy 聲明方式類似 Java,但是支持聲明動態(tài)類型;Scala 與 Kotlin 聲明方法一樣,都是將類型放在名稱后面。
  • 雖然四種語言都支持值不變的特性,但目前 Groovy 版本存在著 Bug

文章源碼見 https://github.com/SidneyXu/JGSK 倉庫的 _06_variable 小節(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容