天天看點

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。

本文轉自 sshpp 51CTO部落格,原文連結:http://blog.51cto.com/12902932/1928052,如需轉載請自行聯系原作者