groovy简明教程(一)介绍

1. groovy是什么

groovy是运行在java虚拟机上的具有象Python,Ruby和Smalltalk语言特性的灵活动态语言。实际上它并非脚本语言,因为在运行时它也被编译成了字节码,运行在JVM上,它和java可以无缝的结合使用,你可以认为他是java语言的另一种表现形式,但它更灵活,简洁。

groovy不是行执行的,它是编译成整个class文件执行的,可以这样认为,groovy本质上是新加了一个类加载器,它在运行时编译groovy代码为字节码,使之产生动态的行为。

2004年,groovy通过了JSR-241,groovy成为了java 平台的第二个标准语言(第一个是java 语言)

2. 编译和运行groovy

学习groovy可以用命令行的groovy或者GroovyConsole一个swing写的窗口程序。

写的groovy脚本可以直接用groovy解析执行:

写道
> groovy sum.groovy

 

编译groovy为字节码:

写道
> groovyc -d classes sum.groovy

运行编译好的groovy脚本:

写道
java -cp %GROOVY_HOM E%/embeddable/groovy-all.jar;classes sum

你会发现其实就是运行java的class文件

 3. groovy语言

由于groovy和java及其相似,这里只介绍groovy特别的语法。

3.1 groovy调用方法可以不用括号,语句不用分号(;)结尾(当然也可以加分号)

 

f = Math.floor 3.14
println "f is: ${f}" // ${f} will be replaced with f's value
 你会发现这里我们也没import java.util.Math,System.out,因为groovy已经import了以下的包和类:
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.net.*
java.io.*
java.math.BigInteger
java.math.BigDecimal

3.2 Class

groovy默认的访问修饰符是public

class SumCal {
    private int to;
    SumCal(int to) {
        this.to = to;
    }
    int getSum() {
        int s = 0;
        1..to.each { i->
            s += i;
        }
        return s;
    }
}

sc = new SumCal(10);
println sc.getSum();

3.3 groovy beans

groovy的bean只需要声明属性,groovy会自动生成get/set方法,

 

class User {
    int id;
    String name;
    String getName() {
        return name.capitalize();
    }
}
def user = new User();
user.id = 10231; // call user.setId()
user.name = 'jamson'; // call user.setName()

println user.name; // call user.getName()

 输出:

写道
Jamson

 可见,并非对属性的直接访问,而是调用了get/set方法,是不是比java beans方便很多呢?

3.4 一切皆对象

学习Java的时候你可能听到这句话,但java里的原始类型,如int,boolean等不是对象。在groovy里,所有的皆是对象,不论是原始类型还是常量,甚至是一段代码,都会编译成一个对象。

'alpha'.center 10,'-'
10.plus(2)

 groovy里你既可以静态的指定类型,也可以不指定,即动态类型。但指定了静态类型,就不能赋值为不同的类型。

a=1
a='cc'

int c = 3
c='ccs' //compile failure

3.5 操作符重载

还记得C++里面的操作符重载吗?groovy也引进了这个特性。

class Complex {
    private final int v;
    private final int i;
    Complex(int v, int i) {
        this.v = v;
        this.i = i;
    }
    boolean equals(Object o) {
        if (null == o) return false;
        if (!o instanceof Complex) return false;
        return (v == o.v && i == o.i);
    }
    int hashCode() {
        return v.hashCode() + i.hashCode();
    }
    Complex plus(Complex o) {
        if (null == o) throw new IllegalArgumentException();
        return new Complex(v + o.v, i + o.i);
    }
    String toString() {
        return "${v} + ${i}i";
    }
}

def c = new Complex(1, 0);
def d = new Complex(1, 0);
println c == d; // call equals
println c + d; // call plus

3.6 GString

groovy.lang.GString是对java String的扩展:常量表示更加方便,提供了更多的方法。

 

'hello world'
"hello $name"
'''-------
python style string
 -------'''
"""
triple double quote
with $Gstring aware
"""
/back slash safe \t, \widows\path/
char c='a'; // declare character explicitly
date = "Current London time is ${new Date().toGMTString()}"
province = 'Sichuan'
city = 'Chengdu'
addr = "I am in city: $city province: $province, you?"
println "${addr.strings[0]}, ${addr.strings[1]}, ${addr.values[0]}, ${addr.values[1]}"
// output: I am in city: ,  province: , Chengdu, Sichuan
println addr[2..3] // output: am
sb = 'i am a string'
sb <<= ' changed to a stringbuffer'
sb << ' now can append' // sb is: i am a string changed to a stringbuffer now can append
 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值