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
廣告