Overview
本节介绍四种语言的最基本的语法形式,包含注释,操作符,相等性等。
共通篇
注释
四种语言都支持以下三种注释
// 单行注释
/*
多行注释
*/
/**
* JavaDoc
*/
Java 篇
操作符
Java 中的操作符支持四则运算,赋值(=),运算后赋值(+=),递增递减(++, --),三元操作符(?true:false),逻辑操作符,关系操作符等。
调用方法
语法
方法名(参数列表)
例
add(1, 2)
相等性
Java 使用 ==
表示基本数据类型的值相等和引用数据类型的地址相等;用方法 equals()
表示引用类型的内容相同。Java 的内置类都实现了自己的 equals()
方法,如果是自己建立的类则要重写 equals()
方法。
Date x = new Date(100);
Date y = new Date(100);
System.out.println("x==y: " + (x == y)); // false
System.out.println("x.equals(y): " + x.equals(y)); // true
Groovy 篇
操作符
包含 Java 的所有操作符之外,Groovy 还多了一个猫王操作符 ?:
,该操作符是三元操作符的语法糖。
例
String agentStatus = "Active"
// 三元操作符
String statusTernary = (agentStatus !=null && !"".equals(agentStatus)) ? "Active" : "Inactive"
// 猫王操作符
String statusElvis = agentStatus ?: "Inactive"
在使用猫王操作符时 Groovy 会自动将左边的表达式向布尔值进行转换。转换规则为:所有逻辑上的空值都会被认为是
false
,比如null
,空字符串,空数组等,除此之外的都是true
。
调用方法
语法基本同 Java,但是在 Groovy 中如果方法的参数个数只有一个时,可以省略包裹在参数列表上的小括号,方法名和参数间留一个空格
例
println("Hello World")
// 省略小括号
println "Hello World"
相等性
Groovy 认为比较内容的使用场合要远远大于比较引用,所以 Groovy 中的 ==
默认就是调用 equals()
方法。
例
println("x==y: " + (x == y)) // true
println("x.equals(y): " + x.equals(y)) // true
另外 Groovy 在比较时对空指针做了判断,所以等号左边即使是空值也不会引发空指针异常。
例
println(null == 10) // false
如果你希望调用 Java 版本的 ==
进行引用的比较,可以调用 is()
方法。
例
println("x.is(y): " + x.is(y)) // false
Scala 篇
操作符
Scala 中一切皆对象,所有的操作符都是对应方法的语法糖。即 1 + 2
实际上就是 调用 1.+(2)
的语法糖,其中 +
既是操作符也是方法名。像这种位于两个操作数之间的操作符被称为中缀操作符,Scala 中中缀操作符在使用时可以被省略,所以 1.+(2)
可以简写成 1 + 2
。
Scala 支持 Java 中除了递增,递减之外的所有操作符,所以在 Scala 中不能使用 i++
这样的语句,而需要使用 i += 1
来实现同样的功能。
调用方法
同 Groovy,只有一个参数时可以省略括号,在方法名和参数间加一个空格
相等性
同 Groovy 一样,==
调用的是 equals()
方法。 不同的是 Groovy 比较引用用的是 is()
,而 Scala 则是 eq()
,也就是说只是方法名不一致。
println("x.eq(y): " + x.eq(y)) // false
Kotlin 篇
操作符
基本上同 Groovy,也拥有猫王操作符
调用方法
同 Java 一样,很久以前的版本也支持去掉小括号,不过这一特性早已被移除。
相等性
和 Groovy,Scala 一样,==
也是调用 equals()
,而比较引用使用的是 ===
(类似 Javascript),这三种语言同一个功能不同方法名也真是够了。
例
println("x===y : " + (x === y)) // false
Summary
- 除了 Scala 之外,其它语言都支持一元操作符
++
,--
- Groovy 和 Kotlin 都支持猫王操作符
- 除了 Java 之外,其它语言中
==
调用的都是equals()
,比较引用则使用其它的方法,且三种语言的方法名都不一致
文章源码见 https://github.com/SidneyXu/JGSK 仓库的 _08_grammar
小节