Java 篇
变量
语法
数据类型 变量名 = 变量值;
例
String variable = "foo";
常量
在变量前加上关键字 final
就可以将变量转换为常量,常量的值定义后不可用进行改变。
例
final String constant = "foo";
Groovy 篇
变量
像上节所说,Groovy 中声明静态类型的变量的方式与 Java 完全一样,且静态类型定义后其数据类型就不可再被改变。
// 第二行报错,因为 10 无法转换为 Date 类型
Date date = new Date()
date = 10
// 正常运行,因为 Date 对象可以通过 toString() 方法转换为 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
两个变量。
定义动态变量的语法
def 变量名 = 变量值
例
def foo = "foo"
动态类型可以自由变换变量类型。
常量
Groovy 定义常量的方式与 Java 相同,但是目前的 v2.4 版本还是存在历史遗留问题,常量可以被任意修改。
例如定义如下常量
final String constant = "foo"
foo
的值可以被任意修改,查看其编译结果
String constant = "foo";
可以看到 final
完全被丢弃了,目前这个 Bug 官方声称已经在 2.5.0-beta-1
版本修复了,具体情况可以查看 Inconsistent checking of final 和 final keyword does not work。
Scala 篇
变量
语法
var 变量名: 变量类型 = 变量值
例
var variable: String = "foo"
可以看到 Scala 的声明方式类似 UML 图,与 Java 正好相反。
常量(值)
在 Scala 中常量被称为值。
语法
val 值名: 值类型 = 具体值
例
val constant = "foo"
另一种声明方式
在 Scala 中,无论是声明变量还是值都可以省略类型说明,如
var variable = "foo"
val constant = "foo"
这种声明方式看起来像 Groovy 声明动态类型。但实际上 Scala 是比 Java 更强的静态类型语言,只是 Scala 更智能,如果你不明确指定类型的话,Scala 会通过值本身来推断其数据类型,试图改变数据类型都会报错。
Kotlin 篇
Kotlin 在声明变量和值时与 Scala 几乎一样。
总结
- Groovy 声明方式类似 Java,但是支持声明动态类型;Scala 与 Kotlin 声明方法一样。
- 虽然四种语言都支持值不变的特性,但目前 Groovy 版本存在着 Bug
项目源码见 JGSK/_06_variable