在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è)字段 - StudentID和StudentName。在main函數(shù)中,我們創(chuàng)建一個(gè)這個(gè)類的對(duì)象,并將值分配給對(duì)象的StudentID和StudentName。
class Student { int StudentID; String StudentName; static void main(String[] args) { Student st = new Student(); st.StudentID = 1; st.StudentName = "Joe" } }
在任何編程語(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)
在類中包含更多的方法通常是一個(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è)類的多個(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í)順序可管理。
繼承其他屬性的類稱為子類(派生類,子類),屬性繼承的類稱為超類(基類,父類)。
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)部類在另一個(gè)類中定義。封閉類可以像往常一樣使用內(nèi)部類。另一方面,內(nèi)部類可以訪問(wèn)其封閉類的成員,即使它們是私有的。不允許除封閉類之外的類訪問(wèn)內(nèi)部類。
下面是一個(gè)外部和內(nèi)部類的例子。在下面的例子中,我們做了以下事情 -
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
更多建議: