實驗任務小程序
實驗內容:測試
任務一: 圖形面積周長計算優化
任務目的:this
任務描述:spa
設計一個小程序,能夠計算圓形和長方形的面積及周長,其中設計
定義抽象類 圖形類爲圓形和長方形的父類,在圖形類中定義抽象方code
法獲取面積方法和獲取周長方法。定義面積和周長計算器,能夠計orm
算不一樣圖形的面積和周長。程序要具有良好的可擴展性和可維護性對象
程序運行結果參考以下圖片:blog
實施步驟:
任務分析:
定義父類Shape做爲抽象類,並在類中定義抽象方法求周長和麪積
定義Shape子類圓形(circle),具備半徑屬性和常量PI,同時必須實現父類中的抽象方法
定義Shape子類長方形(rectangle),具備長和寬的屬性,同時必須實現父類的抽象方法
建立圖形面積周長計算器(ShapeCalculate),具備計算不一樣圖形面積和周長的方法。
建立測試類TestShape類,在其main()方法中對ShapeCalculate計算面積和周長方法進行測試
代碼實現:
/* 抽象類:幾何圖形 */
public abstract class Shape { // 抽象方法: 獲取面積 public abstract double getArea(); // 抽象方法:獲取周長 public abstract double getPerimeter(); }
/* 子類 Circle類 */
public class Circle extends Shape { private double radius = 0; // 圓的半徑 private final static double PI = 3.14; // 常量,圓周率 // 有參構造,初始化圓半徑 public Circle(double radius) { this.radius = radius; } // 求圓面積 public double getArea() { return PI*radius*radius; } // 求圓周長 public double getPerimeter() { return 2*radius*PI; } }
/* 子類Rectangle */
public class Rectangle extends Shape { private double length = 0; // 長方形的長 private double width = 0; // 長方形的寬 // 有參構造,初始化長方形的長和寬 public Rectangle(double length, double width) { super(); this.length = length; this.width = width; } public double getArea() { return this.length*this.width; } public double getPerimeter() { return 2*(this.length+this.width); } }
/* 面積周長計算器 */
public class ShapeCaculate { // 能夠計算任意shape子類的面積 public void calArea (Shape shape) { System.out.println(shape.getArea()); } // 能夠計算任意shape子類的周長 public void calPerimeter(Shape shape) { System.out.println(shape.getPerimeter()); } }
/* 測試類 */
public class TestShape { public static void main(String[] args) { // 建立圖形計算器 ShapeCaculate sc = new ShapeCaculate(); // 建立長方形和圓形對象 Shape rectangle = new Rectangle(3, 4); // <-------多態 Circle circle = new Circle(3); // 求長方形和圓形的面積 System.out.println("求長方形的面積:"); sc.calArea(rectangle); System.out.println("求圓形的面積:"); sc.calArea(circle); // 求長方形和圓形的周長 System.out.println("求長方形的周長:"); sc.calPerimeter(rectangle); System.out.println("求圓形的周長:"); sc.calPerimeter(circle); } }
任務二:飼養員餵養動物
任務目的:
實施步驟:
在Java實驗案例(繼承)任務三中,飼養員每拿一種食物餵養相應的動物都須要
創建相應的方法,程序的可擴展性和可維護性較差,經過多態能夠對程序進行優化,
修改feed()方法的參數爲父類的類型,使程序具備較好的可擴展性和可維護性。
代碼實現:
動物父類
public class Animal { public void eat(Food food) { System.out.println("吃飯時間到了!"); System.out.println(this + "喜歡吃" +food); } }
Animal子類Dog類
public class Dog extends Animal { // 重寫Animal從Object中繼承的toString()方法 public String toString() { return "Dog"; } // 新增算算術方法 public void arithmetic() { System.out.println(this+"算算術表演!"); } }
Animal子類Cat類
public class Cat extends Animal { // 從寫Animal從Object中繼承的toString方法 public String toString() { return "Cat"; } // 新增跳環方法 public void jumpRing() { System.out.println(this+"開始表演跳環!"); } }
食物Food類
public class Food { private int weight; // 食物重量 public Food(int weight) { this.weight = weight; } public int getWeight() { return weight; } }
Bone子類
public class Bone extends Food { public Bone(int weight) { // 調用父類的構造方法 super(weight); } public String toString() { return "Bone"; } }
Fish子類
public class Fish extends Food { public Fish(int weight) { super(weight); } public String toString() { return "Fish"; } }
飼養員Feeder類
public class Feeder { private String name; public Feeder(String name) { this.name = name; } public void feed(Animal a, Food f) { a.eat(f); System.out.println("飼養員"+name+"拿着"+f.getWeight()+"克"+f+"餵養"+a+"。"); } public void perform(Animal a) { if (a instanceof Dog){ ((Dog) a).arithmetic(); } if(a instanceof Cat) { Cat c = (Cat) a; c.jumpRing(); } } }
測試類
public class TestFeed { public static void main(String[] args) { Feeder fd = new Feeder("張三"); Dog dog = new Dog(); Bone bone = new Bone(500); fd.feed(dog, bone); System.out.println("-----------------"); fd.feed(new Cat(), new Fish(100)); fd.perform(dog); fd.perform(new Cat()); } }
運行結果以下圖: