- 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