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

2021-07-02 17:31 更新

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

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

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

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

getter和setter方法

在任何編程語(yǔ)言中,總是使用private關(guān)鍵字隱藏實(shí)例成員,而是提供getter和setter方法來(lái)相應(yīng)地設(shè)置和獲取實(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)我們運(yùn)行上面的程序,我們將得到以下結(jié)果 -

1 
Joe 

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

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

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

實(shí)例方法

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

在下面的示例中,Total方法是一個(gè)額外的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)我們運(yùn)行上面的程序,我們將得到以下結(jié)果 -

60

創(chuàng)建多個(gè)對(duì)象

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

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)我們運(yùn)行上面的程序,我們將得到以下結(jié)果 -

60 
70 
80 

繼承

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

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

擴(kuò)展

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

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

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

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

  • 在我們的Student類中,我們添加了2個(gè)StudentID和Marks1的實(shí)例成員。

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)我們運(yùn)行上面的程序,我們將得到以下結(jié)果 -

Joe

內(nèi)部類

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

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

  • 創(chuàng)建一個(gè)名為Outer的類,它將是我們的外部類。
  • 在Outer類中定義名為name的字符串。
  • 在我們的外類中創(chuàng)建一個(gè)內(nèi)部或嵌套類。
  • 請(qǐng)注意,在內(nèi)部類中,我們可以訪問(wèn)在Outer類中定義的名稱實(shí)例成員。
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)我們運(yùn)行上面的程序,我們將得到以下結(jié)果 -

Joe

抽象類

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

在下面的示例中,請(qǐng)注意,Person類現(xiàn)在是一個(gè)抽象類,不能被實(shí)例化。還要注意,在抽象類中有一個(gè)名為DisplayMarks的抽象方法,沒有實(shí)現(xiàn)細(xì)節(jié)。在學(xué)生類中,必須添加實(shí)現(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)我們運(yùn)行上面的程序,我們將得到以下結(jié)果 -

Joe 
10 

接口

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

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

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

  • 在類定義中,我們使用implements關(guān)鍵字來(lái)實(shí)現(xiàn)接口。 因?yàn)槲覀兪菍?shí)現(xiàn)

  • 因?yàn)槲覀冋趯?shí)現(xiàn)接口,我們必須為DisplayMarks方法提供實(shí)現(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)我們運(yùn)行上面的程序,我們將得到以下結(jié)果 -

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)