Groovy 面向?qū)ο?/h1>

2021-07-02 17:31 更新

在Groovy中,如在任何其他面向?qū)ο笳Z言中一樣,存在類和對象的概念以表示編程語言的對象定向性質(zhì)。Groovy類是數(shù)據(jù)的集合和對該數(shù)據(jù)進(jìn)行操作的方法。在一起,類的數(shù)據(jù)和方法用于表示問題域中的一些現(xiàn)實世界對象。

Groovy中的類聲明了該類定義的對象的狀態(tài)(數(shù)據(jù))和行為。因此,Groovy類描述了該類的實例字段和方法。

以下是Groovy中的一個類的示例。類的名稱是Student,它有兩個字段 - StudentIDStudentName在main函數(shù)中,我們創(chuàng)建一個這個類的對象,并將值分配給對象的StudentIDStudentName。

class Student {
   int StudentID;
   String StudentName;
	
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.StudentName = "Joe"     
   } 
}

getter和setter方法

在任何編程語言中,總是使用private關(guān)鍵字隱藏實例成員,而是提供getter和setter方法來相應(yīng)地設(shè)置和獲取實例變量的值。以下示例顯示如何完成此操作。

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());
   } 
}

當(dāng)我們運行上面的程序,我們將得到以下結(jié)果 -

1 
Joe 

請注意以下關(guān)于上述程序的要點 -

  • 在類中,studentID和studentName都標(biāo)記為private,這意味著無法從類外部訪問它們。

  • 每個實例成員都有自己的getter和setter方法。getter方法返回實例變量的值,例如方法int getStudentID()和setter方法設(shè)置實例ID的值,例如method - void setStudentName(String pName)

實例方法

在類中包含更多的方法通常是一個很自然的事情,它實際上為類實現(xiàn)了一些功能。在我們的學(xué)生示例中,讓我們添加Marks1,Marks2和Marks3的實例成員,以表示學(xué)生在3個科目中的標(biāo)記。然后我們將添加一個新的實例方法,計算學(xué)生的總分。以下是代碼的外觀。

在下面的示例中,Total方法是一個額外的Instance方法,它內(nèi)置了一些邏輯。

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());
   }
}

當(dāng)我們運行上面的程序,我們將得到以下結(jié)果 -

60

創(chuàng)建多個對象

也可以創(chuàng)建一個類的多個對象。下面是如何實現(xiàn)這一點的例子。在這里,我們創(chuàng)建3個對象(st,st1和st2)并相應(yīng)地調(diào)用它們的實例成員和實例方法。

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();
      st1.StudentID = 1;
      st1.StudentName = "Joe";
		
      st1.Marks1 = 10;
      st1.Marks2 = 20;
      st1.Marks3 = 40;
		
      println(st1.Total());  
        
      Student st2 = new Student();
      st2.StudentID = 1;
      st2.StudentName = "Joe";
		
      st2.Marks1 = 10; 
      st2.Marks2 = 20;
      st2.Marks3 = 50;
		
      println(st2.Total());
   } 
} 

當(dāng)我們運行上面的程序,我們將得到以下結(jié)果 -

60 
70 
80 

繼承

繼承可以定義為一個類獲取另一個類的屬性(方法和字段)的過程。通過使用繼承,信息以分級順序可管理。

繼承其他屬性的類稱為子類(派生類,子類),屬性繼承的類稱為超類(基類,父類)。

擴展

extends是用于繼承類的屬性的關(guān)鍵字。下面給出了extends關(guān)鍵字的語法。在下面的例子中,我們做了以下事情 -

  • 創(chuàng)建一個名為Person的類。這個類有一個名為name的實例成員。

  • 創(chuàng)建一個名為Student的類,它從Person類繼承。請注意,在Person類中定義的名稱實例成員在Student類中繼承。

  • 在Student類構(gòu)造函數(shù)中,我們調(diào)用了基類構(gòu)造函數(shù)。

  • 在我們的Student類中,我們添加了2個StudentID和Marks1的實例成員。

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();
   } 
}   

當(dāng)我們運行上面的程序,我們將得到以下結(jié)果 -

Joe

內(nèi)部類

內(nèi)部類在另一個類中定義。封閉類可以像往常一樣使用內(nèi)部類。另一方面,內(nèi)部類可以訪問其封閉類的成員,即使它們是私有的。不允許除封閉類之外的類訪問內(nèi)部類。

下面是一個外部和內(nèi)部類的例子。在下面的例子中,我們做了以下事情 -

  • 創(chuàng)建一個名為Outer的類,它將是我們的外部類。
  • 在Outer類中定義名為name的字符串。
  • 在我們的外類中創(chuàng)建一個內(nèi)部或嵌套類。
  • 請注意,在內(nèi)部類中,我們可以訪問在Outer類中定義的名稱實例成員。
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); 
      } 
   } 
	
}   

當(dāng)我們運行上面的程序,我們將得到以下結(jié)果 -

Joe

抽象類

抽象類表示通用概念,因此,它們不能被實例化,被創(chuàng)建為子類化。他們的成員包括字段/屬性和抽象或具體方法。抽象方法沒有實現(xiàn),必須通過具體子類來實現(xiàn)。抽象類必須用抽象關(guān)鍵字聲明。抽象方法也必須用抽象關(guān)鍵字聲明。

在下面的示例中,請注意,Person類現(xiàn)在是一個抽象類,不能被實例化。還要注意,在抽象類中有一個名為DisplayMarks的抽象方法,沒有實現(xiàn)細(xì)節(jié)。在學(xué)生類中,必須添加實現(xiàn)細(xì)節(jié)。

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); 
   }  
} 

當(dāng)我們運行上面的程序,我們將得到以下結(jié)果 -

Joe 
10 

接口

接口定義了類需要遵守的契約。接口僅定義需要實現(xiàn)的方法的列表,但是不定義方法實現(xiàn)。需要使用interface關(guān)鍵字聲明接口。接口僅定義方法簽名。接口的方法總是公開的。在接口中使用受保護(hù)或私有方法是一個錯誤。

以下是groovy中的接口示例。在下面的例子中,我們做了以下事情 -

  • 創(chuàng)建一個名為Marks的接口并創(chuàng)建一個名為DisplayMarks的接口方法。

  • 在類定義中,我們使用implements關(guān)鍵字來實現(xiàn)接口。 因為我們是實現(xiàn)

  • 因為我們正在實現(xiàn)接口,我們必須為DisplayMarks方法提供實現(xiàn)。

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);
   }
}

當(dāng)我們運行上面的程序,我們將得到以下結(jié)果 -

10
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號