groovy 与 java 差异 (1)
groovy尽最大可能使java程序员无门槛使用。但其中有不少差异,我尝试列举,方便java程序员学习并适用。
缺省导入
这些包在groovy中是缺省自动导入的,你无需显示再次导入。
java.io.*
java.lang.*
java.math.BigDecimal
java.math.BigInteger
java.net.*
java.util.*
groovy.lang.*
groovy.util.*
方法重载调用差异
groovy选择调用那个方法是在运行时决定的,基于参数在运行时的类型;反之,java是在编译时决定的,基于申明的类型(静态方式)。下面代码,使用java 编写,编译成java和groovy,但行为不同。
int method(String arg) {
return 1;
}
int method(Object arg) {
return 2;
}
Object o = "Object";
int result = method(o);
在 Java中, 结果为:
assertEquals(2, result);
而在Groovy中:
assertEquals(1, result);
这时因为java使用静态类型,被申明为Ojbect类型;而groovy是运行时决定,参数为String,所以结果不同。
数组初始化
在 Groovy中, { … } 专门用于定义闭包。所以不能如下面代码方式定义数组:
int[] array = { 1, 2, 3}
正确定义如下。
int[] array = [1,2,3]
包范围可见
groovy 中类中省略修饰符的属性,并不像java那样,在包内可以访问。
class Person {
String name
}
反之,groovy创建一个属性,即属于private,并自动关联setter和getter方法。
如果你缺省需要创建包内private属性,可以使用@PackageScope注解:
class Person {
@PackageScope String name
}
== 号的行为差异
java中 == 意味比较对象地址,而groovy是比较其值,is方法实现地址比较,如:a.is(b) .