天天看点

Groovy中的面向对象

groovy中支持的原始数据类型与java相同,分别是boolean,char,short,int,long,float,double。

groovy中的类与java中很相似,但有以下几点是groovy特有的:

<code>public</code>修饰的字段会被自动转换成属性变量,这样可以避免很多冗余的get和set方法。

如果属性或方法没有访问权限修饰符,那么默认是public,而java中是proteced。

类名不需要和文件名相同。

一个文件中可以定义多个一级类。如没有定义类,则这个groovy文件被认为是脚本文件。

groovy的普通类和java类似,使用new关键字获得实例。

内部类也基本类似,下面给一个例子:

抽象类也与java基本类似:

groovy的接口和java也基本类似,支持接口继承接口。

groovy的构造方法和java就有略微不同了,groovy的构造方法支持<code>位置参数</code>和<code>命名参数</code>,下面具体看。

位置构造参数跟java中的通常构造方法类似,不同位置的参数具有不同的含义。如下:

具体调用构造方法的时候groovy多了两种写法。因为位置已经固定,所以即使<code>PersonConstructor person3 = ['Marie', 3]</code>这样的写法groovy也能从内部给你做初始化。

命名参数构造方法不需要用户定义,当一个类没有构造方法的时候,其默认有一个命名参数构造方法。

定义groovy的方法也很简单,可使用关键字<code>def</code>或者返回值就行。groovy中的方法都有返回值,如果没有写<code>return</code>语句,groovy会计算方法中的最后一行语句并将其结果返回。

下面是四种不同的方法定义:

在自定义的方法中要使用命名参数的话,就要使用Map作为唯一参数,如下:

groovy方法支持默认参数,这样就是的其参数变得可选,当参数没有被填入,则会使用默认参数:

这个在java中也是存在的,举个简单的例子:

groovy中的注解跟java中的类似,但又比java中多了一些特性,下面简单介绍一下。

在groovy中,有一个有趣的语言特性就是可以使用<code>闭包</code>作为注解的参数值。这样的注解一般在什么情况下使用呢?举个简单的例子,有些时候软件的运行时依赖其运行的环境和操作系统的,针对不同的环境或系统,表现也不一样。看一下这个例子:

Tasks类用于完成<code>alwaysExecuted</code>,<code>supportedOnlyInJDK6</code>,<code>requiresJDK7AndWindows</code>这三个任务,但不同的任务对环境和系统的要求都不一样,这里使用<code>@OnlyIf</code>来表明对环境和系统的需求。

在groovy中如果需要让注解接受闭包的话,只需要像上面这样定义一个Class类型的value值。这样OnlyIf就可以接受闭包作为其值了。

接着写处理类:

和java类似,通过反射拿到Task对象的方法,接着获取其OnlyIf注解,如果获取成功,则提取OnlyIf的闭包进行调用。

trait是groovy中独有的面向对象的语法特性,他具备如下功能:

行为构成

运行时的接口实现

行为重载

兼容静态类型的检查和编译

Trait可以被看作是具有方法实现和状态的接口,使用<code>trait</code>关键字定义:

上面就定义了一个飞行能力的特证,它的使用方法和接口一样,都是使用<code>implements</code>关键字:

这个看上去感觉跟继承有点类似,但又不一样,trait仅仅是将其方法和状态嵌入到实现类中,而没有继承中的那种上下级的父子关系。

trait中的一些语法特性:

trait中支持定义抽象方法,其实现类必须实现此抽象方法。

trait中可以定义私有方法,其实现类无法访问。

trait中的this关键字指其实现类。

trait可以实现接口。

trait中可定义属性,此属性会自动被附加到实现此trait的类中。

trait可定义私有字段由于存储相关状态。

trait可定义公共字段,但为了避免<code>钻石问题</code>,其获取方式有所不同,如下:

第一个类可以实现多个trait。

实现类可重写trait中的默认方法。

trait可以继承另一个trait使用关键字extends,若要继承多个则使用implements关键字。

可以在运行时动态实现trais,使用关键字as。

本文转自帅气的头头博客51CTO博客,原文链接http://blog.51cto.com/12902932/1928052如需转载请自行联系原作者

sshpp