標籤:
實驗2 類的繼承性
一、實驗目的
掌握物件導向的繼承性在Java中的實現方法;掌握super關鍵字的用法,體會抽象類別和抽象方法的作用。
二、實驗內容
1.程式理解:
1)類的繼承
2)第4章課後編程第1題
class Student { public String name; public int age; public Student(String name,int age){ this.name=name; this.age=age; } public void show(){ System.out.println("name: "+name+" age: "+age); }}class UnderGraduate extends Student{ public String degree; public UnderGraduate(String name,int age,String degree){ super(name, age); this.degree=degree; } public void show(){ System.out.println("name: "+name+" age: "+age+" degree: "+degree); }}public class Test01{ public static void main(String[] args) { Student student = new Student("zhangsan", 16); student.show(); UnderGraduate underGraduate = new UnderGraduate("lisi", 20, "bechalor"); underGraduate.show(); }
2.編程題:
(1)請按照以下要求設計類。( 程式1)
要求如下:
1)設計Animal類。類中定義一個成員變數animalName,表示動物的名稱,變數animalName是String類型,預設初始值。在該類中再定義一個成員方法shout(),表示動物發出叫聲的行為,該方法能輸出名稱為animalName的動物發出叫聲,例如輸出“波斯貓發出叫聲”。
2)設計Cat類。使用關鍵字extends繼承Animal類。Cat類中定義一個public類型的構造方法,該構造方法擁有一個String類型的參數catName,通過該參數,為Cat類中繼承自Animal類的animalName成員變數賦值。
3)設計一個測試類別。類名為ExtendsTest,在main方法中定義一個 String類型的name變數,並為它賦值為”波斯貓”,然後使用有參構造建立Cat類的對象,並使用對象的引用變數調用shout()方法。
(2)設計父類和一個子類,在子類裡面通過super關鍵字去調用父類的成員變數和成員方法,在子類的構造方法中使用super關鍵字調用父類的構造方法,在測試類別裡進行驗證。(程式2)
(3)建立平面圖形抽象類別(PlaneGraphic)及其子類三角形(Triangle), 圓(Circle),長方形(Rectangle)的一個繼承分級結構。在抽象類別PlaneGraphic中,提供計算圖形周長和面積的抽象方法,並在各子類中實現抽象方法,從而根據不同類型的平面圖形計算相應的周長和面積。提示:三角形面積計算用海倫公式:,p為三角形的半周長。(程式3)
(4)請按照以下要求設計一個Outer類。(程式4)
要求如下:
1)定義一個外部類Outer,並在該類中定義一個靜態內部類Inner。
2)在內部類中定義一個靜態變數staticField和一個靜態方法staticMethod(),並將該變數的值設定為”靜態內部類的靜態變數”,該方法中輸出”靜態內部類的靜態方法”。
3)定義一個測試類別,在main()方法中輸出staticField的值,並且調用靜態方法staticMethod()。
(5)熟悉Eclipse開發工具。
請自己學習課本第11章,熟悉使用Eclipse進行程式調試(418頁),瞭解jar檔案的匯入和匯出(422頁)。
三、實驗結果和分析
說明:請給出各個程式的運行結果,並做必要的分析。
(1)程式1運行結果
分析:Cat類通過extends關鍵字繼承了Animal類,這樣Cat類便是Animal類的子類。從運行結果不難看出,子類雖然沒有定義animalName屬性和shout()方法,但是卻能訪問這兩個成員,這就說明,子類在繼承父類的時候,會自動擁有父類的所有成員,Cat類定義了有參建構函式,在測試類別的main方法中使用有參構造建立Cat類對象,運行結果
(2)程式2運行結果
分析:定義了一個Child類繼承Father類,並重寫了Father類的eat()方法,在子類Child的eat()方法中使用”super.eat()”調用了父類被重寫的方法,在introFather()方法中使用“super.age”訪問父類的成員變數。從運行結果可以看出,子類通過super關鍵字成功地訪問父類的成員變數和成員方法。在執行個體化Child對象時一定會調用Child類的構造方法,從運行結果可以看出,Child類的構造方法被調用時,父類的構造方法也被調用了。
(3)程式3運行結果
分析:從運行結果可以看出,子類實現了父類的抽象對象後,可以正常進行執行個體化,並通過執行個體化對象調用方法。抽象類別其實是約束子類的方法命名,在抽象父類中定義抽象方法,在子類中實現,不同的參數通過成員變數實現。
(4)程式4運行結果
分析:內部類Inner使用static關鍵字來修飾,是一個靜態內部類,執行個體化方式與非靜態成員內部類的執行個體化方式不一樣,在靜態內部類中科院定義靜態成員,而在非靜態內部類中不允許定義靜態成員。
四、實驗原始碼
說明:請將各程式的原始碼複製粘貼到這裡。
(1)程式1原始碼
//定義Animal類class Animal{ String animalName; //定義動物叫的方法 void shout(){ System.out.println(animalName+"發出叫聲"); }}//定義Cat類繼承Animal類class Cat extends Animal{ //類中定義一個public類型的構造方法 public Cat(String catName){ animalName=catName; }}//定義測試類別public class ExtendsTest { public static void main(String[] args) { String name="波斯貓"; //定義一個 String類型的name變數,並為它賦值為”波斯貓”, Cat cat=new Cat(name); //使用有參構造建立Cat類的對象 cat.shout(); //使用對象的引用變數調用shout()方法。 }}
(2)程式2原始碼
//定義Father類class Father{ int age=30; String food="小熊餅乾"; //定義Father類有參建構函式 public Father(String name){ System.out.println("我的名字叫"+name); } //定義喜歡吃的方法 void eat(){ System.out.println("我喜歡吃"+food); }}//定義Child類class Child extends Father{ //在子類的構造方法中使用super關鍵字調用父類的構造方法, public Child(){ super("蠟筆小新"); } //在子類裡面通過super關鍵字去調用父類的成員方法, void eat(){ super.eat(); } //在子類裡面通過super關鍵字去調用父類的成員變數 void introFather(){ System.out.println("我爸爸今年"+age+"歲了"); }}//定義測試類別public class Example2 { public static void main(String[] args) { Child child=new Child(); //建立一個Child類的執行個體對象 child.eat(); //調用Child類的eat方法 child.introFather(); //調用Child類的introFather方法 }}
(3)程式3原始碼
import java.util.Scanner;//定義抽象類別PlaneGraphicabstract class PlaneGraphic{ double area; //定義抽象方法getArea abstract void getArea();}//定義Triangle類繼承抽象類別PlaneGraphicclass Triangle extends PlaneGraphic{ double a,b,c; //定義Triangle類有參建構函式 public Triangle(double a,double b,double c){ this.a=a; this.b=b; this.c=c; } //實現抽象方法getArea() void getArea(){ double p=(a+b+c)/2; double area=Math.sqrt(p*(p-a)*(p-b)*(p-c)); System.out.println("該三角形的面積是:"+area); }}//定義Circle類繼承抽象類別PlaneGraphicclass Circle extends PlaneGraphic{ double r; //定義Circle類有參建構函式 public Circle(double r){ this.r=r; } //實現抽象方法getArea() void getArea(){ double area=Math.PI*r*r; System.out.println("該圓的面積是:"+area); }}//定義Rectangle類繼承抽象類別PlaneGraphicclass Rectangle extends PlaneGraphic{ double x,y; //定義Rectangle類有參建構函式 public Rectangle(double x,double y){ this.x=x; this.y=y; } //實現抽象方法getArea() void getArea(){ double area=x*y; System.out.println("該矩形的面積是:"+area); }}//定義測試類別public class Example3 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("請輸入三角形的邊長:"); double a1=sc.nextDouble(); double b1=sc.nextDouble(); double c1=sc.nextDouble(); Triangle t=new Triangle(a1,b1,c1);//執行個體化Triangle對象 t.getArea(); System.out.println("請輸入圓的半徑:"); double r1=sc.nextDouble(); Circle c=new Circle(r1); //執行個體化Circle對象 c.getArea(); System.out.println("請輸入矩形的邊長:"); double x1=sc.nextDouble(); double y1=sc.nextDouble(); Rectangle re=new Rectangle(x1,y1); //執行個體化Rectangle對象 re.getArea(); }}
(4)程式4原始碼
//定義一個外部類class Outer{ //下面的代碼定義了一個靜態內部類 static class Inner{ static String staticField="靜態內部類的靜態變數"; static void staticMethod(){ System.out.println("靜態內部類的靜態方法"); } }}//定義測試類別public class Example4 { public static void main(String[] args) { Outer.Inner inner=new Outer.Inner();//建立內部類對象 System.out.println(inner.staticField); inner.staticMethod(); }}
java實驗2 類的繼承性