
- Groovy 教程
- Groovy - 首頁
- Groovy - 概述
- Groovy - 環境
- Groovy - 基本語法
- Groovy - 資料型別
- Groovy - 變數
- Groovy - 運算子
- Groovy - 迴圈
- Groovy - 決策制定
- Groovy - 方法
- Groovy - 檔案 I/O
- Groovy - 可選
- Groovy - 數字
- Groovy - 字串
- Groovy - 範圍
- Groovy - 列表
- Groovy - 對映
- Groovy - 日期和時間
- Groovy - 正則表示式
- Groovy - 異常處理
- Groovy - 面向物件
- Groovy - 泛型
- Groovy - 特質
- Groovy - 閉包
- Groovy - 註解
- Groovy - XML
- Groovy - JMX
- Groovy - JSON
- Groovy - DSL
- Groovy - 資料庫
- Groovy - 構建器
- Groovy - 命令列
- Groovy - 單元測試
- Groovy - 模板引擎
- Groovy - 元物件程式設計
- Groovy 有用資源
- Groovy - 快速指南
- Groovy - 有用資源
- Groovy - 討論
Groovy - 面向物件
在 Groovy 中,與任何其他面嚮物件語言一樣,存在類和物件的概念來表示程式語言的面向物件特性。Groovy 類是資料及其操作資料的函式的集合。類的資料和方法一起用於表示來自問題域的某個現實世界物件。
Groovy 中的類聲明瞭由該類定義的物件的狀態(資料)和行為。因此,Groovy 類描述了該類的例項欄位和方法。
以下是一個 Groovy 類示例。類的名稱為 Student,它有兩個欄位 - **StudentID** 和 **StudentName**。在主函式中,我們正在建立此類的物件並將值分配給物件的 **StudentID** 和 **StudentName**。
class Student { int StudentID; String StudentName; static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.StudentName = "Joe" } }
getter 和 setter 方法
在任何程式語言中,始終習慣使用 private 關鍵字隱藏例項成員,而是提供 getter 和 setter 方法來根據需要設定和獲取例項變數的值。以下示例顯示瞭如何執行此操作。
class Student { private int StudentID; private String StudentName; void setStudentID(int pID) { StudentID = pID; } void setStudentName(String pName) { StudentName = pName; } int getStudentID() { return this.StudentID; } String getStudentName() { return this.StudentName; } static void main(String[] args) { Student st = new Student(); st.setStudentID(1); st.setStudentName("Joe"); println(st.getStudentID()); println(st.getStudentName()); } }
當我們執行上述程式時,我們將獲得以下結果 -
1 Joe
請注意有關上述程式的以下關鍵要點 -
在類中,studentID 和 studentName 都標記為 private,這意味著無法從類外部訪問它們。
每個例項成員都有自己的 getter 和 setter 方法。getter 方法返回例項變數的值,例如方法 int getStudentID(),setter 方法設定例項 ID 的值,例如方法 - void setStudentName(String pName)
例項方法
通常自然地將更多方法包含在類中,這些方法實際上為類執行某種功能。在我們的學生示例中,讓我們新增 Marks1、Marks2 和 Marks3 的例項成員來表示學生在 3 門科目中的分數。然後,我們將新增一個新的例項方法來計算學生的總分。以下是程式碼的外觀。
在以下示例中,方法 Total 是一個具有內建邏輯的附加例項方法。
class Student { int StudentID; String StudentName; int Marks1; int Marks2; int Marks3; int Total() { return Marks1+Marks2+Marks3; } static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.StudentName="Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 30; println(st.Total()); } }
當我們執行上述程式時,我們將獲得以下結果 -
60
建立多個物件
還可以建立類的多個物件。以下是實現此目的的示例。在這裡,我們建立了 3 個物件(st、st1 和 st2)並相應地呼叫它們的例項成員和例項方法。
class Student { int StudentID; String StudentName; int Marks1; int Marks2; int Marks3; int Total() { return Marks1+Marks2+Marks3; } static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.StudentName = "Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 30; println(st.Total()); Student st1 = new Student(); st.StudentID = 1; st.StudentName = "Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 40; println(st.Total()); Student st3 = new Student(); st.StudentID = 1; st.StudentName = "Joe"; st.Marks1 = 10; st.Marks2 = 20; st.Marks3 = 50; println(st.Total()); } }
當我們執行上述程式時,我們將獲得以下結果 -
60 70 80
繼承
繼承可以定義為一個類獲取另一個類的屬性(方法和欄位)的過程。透過使用繼承,資訊以分層順序進行管理。
繼承其他屬性的類稱為子類(派生類、子類),其屬性被繼承的類稱為超類(基類、父類)。
擴充套件
**extends** 是用於繼承類屬性的關鍵字。下面給出 extends 關鍵字的語法。在以下示例中,我們執行以下操作 -
建立一個名為 Person 的類。此類有一個名為 name 的例項成員。
建立一個名為 Student 的類,它擴充套件自 Person 類。請注意,在 Person 類中定義的 name 例項成員在 Student 類中被繼承。
在 Student 類建構函式中,我們正在呼叫基類建構函式。
在我們的 Student 類中,我們添加了 StudentID 和 Marks1 的 2 個其他例項成員。
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; st.name = "Joe"; println(st.name); } } class Person { public String name; public Person() {} } class Student extends Person { int StudentID int Marks1; public Student() { super(); } }
當我們執行上述程式時,我們將獲得以下結果 -
Joe
內部類
內部類是在另一個類中定義的。封閉類可以使用內部類照常。另一方面,內部類可以訪問其封閉類的成員,即使它們是私有的。封閉類以外的類不允許訪問內部類。
以下是一個外部類和內部類的示例。在以下示例中,我們執行以下操作 -
- 建立一個名為 Outer 的類,它將是我們的外部類。
- 在我們的 Outer 類中定義一個名為 name 的字串。
- 在我們的 Outer 類內部建立一個內部或巢狀類。
- 請注意,在內部類中,我們能夠訪問在 Outer 類中定義的 name 例項成員。
class Example { static void main(String[] args) { Outer outobj = new Outer(); outobj.name = "Joe"; outobj.callInnerMethod() } } class Outer { String name; def callInnerMethod() { new Inner().methodA() } class Inner { def methodA() { println(name); } } }
當我們執行上述程式時,我們將獲得以下結果 -
Joe
抽象類
抽象類表示通用概念,因此,它們不能被例項化,而是被建立為子類。它們的成員包括欄位/屬性和抽象或具體方法。抽象方法沒有實現,必須由具體子類實現。抽象類必須用 abstract 關鍵字宣告。抽象方法也必須用 abstract 關鍵字宣告。
在以下示例中,請注意 Person 類現在已成為抽象類,不能被例項化。另請注意,抽象類中有一個名為 DisplayMarks 的抽象方法,它沒有實現細節。在學生類中,必須新增實現細節。
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; st.name="Joe"; println(st.name); println(st.DisplayMarks()); } } abstract class Person { public String name; public Person() { } abstract void DisplayMarks(); } class Student extends Person { int StudentID int Marks1; public Student() { super(); } void DisplayMarks() { println(Marks1); } }
當我們執行上述程式時,我們將獲得以下結果 -
Joe 10 null
介面
介面定義了一個類需要符合的契約。介面僅定義需要實現的方法列表,但不定義方法的實現。介面需要使用 interface 關鍵字宣告。介面僅定義方法簽名。介面的方法始終為 **public**。在介面中使用 protected 或 private 方法是錯誤的。
以下是一個 Groovy 介面示例。在以下示例中,我們執行以下操作 -
建立一個名為 Marks 的介面並建立一個名為 DisplayMarks 的介面方法。
在類定義中,我們使用 implements 關鍵字來實現介面。
因為我們正在實現介面,所以我們必須為 DisplayMarks 方法提供實現。
class Example { static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.Marks1 = 10; println(st.DisplayMarks()); } } interface Marks { void DisplayMarks(); } class Student implements Marks { int StudentID int Marks1; void DisplayMarks() { println(Marks1); } }
當我們執行上述程式時,我們將獲得以下結果 -
10 null