Groovy中的面向对象
1.类型1.1 原始类型groovy中支持的原始数据类型与java相同,分别是boolean,char,short,int,long,float,double。 1.2 类groovy中的类与java中很相似,但有以下几点是groovy特有的:
1.2.1 普通类groovy的普通类和java类似,使用new关键字获得实例。 1.2.2 内部类内部类也基本类似,下面给一个例子: class?Outer2?{ ????private?String?privateStr?=?'some?string' ????def?startThread()?{???????new?Thread(new?Inner2()).start() ????}????class?Inner2?implements?Runnable?{ ????????void?run()?{ ????????????println?"${privateStr}." ????????} ????} } 1.2.3 抽象类抽象类也与java基本类似: abstract?class?Abstract?{????????? ????String?name????abstract?def?abstractMethod()? ????def?concreteMethod()?{ ????????println?'concrete' ????} } 1.3 接口groovy的接口和java也基本类似,支持接口继承接口。 1.4 构造方法groovy的构造方法和java就有略微不同了,groovy的构造方法支持 1.4.1 位置参数构造方法位置构造参数跟java中的通常构造方法类似,不同位置的参数具有不同的含义。如下: class?PersonConstructor?{ ????String?name ????Integer?age ????PersonConstructor(name,?age)?{?????????? ????????this.name?=?name????????this.age?=?age ????} }def?person1?=?new?PersonConstructor('Marie',?1)?? def?person2?=?['Marie',?2]?as?PersonConstructor?? PersonConstructor?person3?=?['Marie',?3] 具体调用构造方法的时候groovy多了两种写法。因为位置已经固定,所以即使 1.4.2 命名参数构造方法命名参数构造方法不需要用户定义,当一个类没有构造方法的时候,其默认有一个命名参数构造方法。 class?PersonWOConstructor?{?????????????????????????????????? ????String?name ????Integer?age }def?person4?=?new?PersonWOConstructor()?????????????????????? def?person5?=?new?PersonWOConstructor(name:?'Marie')????????? def?person6?=?new?PersonWOConstructor(age:?1)???????????????? def?person7?=?new?PersonWOConstructor(name:?'Marie',?age:?2) 1.5 方法定义groovy的方法也很简单,可使用关键字 下面是四种不同的方法定义: def?someMethod()?{?'method?called'?}??????????????????????????? String?anotherMethod()?{?'another?method?called'?}????????????? def?thirdMethod(param1)?{?"$param1?passed"?}??????????????????? static?String?fourthMethod(String?param1)?{?"$param1?passed"?} 1.5.1 方法的命名参数在自定义的方法中要使用命名参数的话,就要使用Map作为唯一参数,如下: def?foo(Map?args)?{?"${args.name}:?${args.age}"?} foo(name:?'Marie',?age:?1) 1.5.2 方法的默认参数groovy方法支持默认参数,这样就是的其参数变得可选,当参数没有被填入,则会使用默认参数: 1.5.3 方法的可变长参数
Trait可以被看作是具有方法实现和状态的接口,使用 trait?FlyingAbility?{??????????????????????????? ????????String?fly()?{?"I'm?flying!"?}?????????? } 上面就定义了一个飞行能力的特证,它的使用方法和接口一样,都是使用 class?Bird?implements?FlyingAbility?{}?????????? def?b?=?new?Bird()?????????????????????????????? assert?b.fly()?==?"I'm?flying!" 这个看上去感觉跟继承有点类似,但又不一样,trait仅仅是将其方法和状态嵌入到实现类中,而没有继承中的那种上下级的父子关系。 trait中的一些语法特性:
trait?Named?{ ????public?String?name?????????????????????? }class?Person?implements?Named?{}???????????? def?p?=?new?Person()???????????????????????? p.Named__name?=?'Bob'
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |