1. 程式人生 > >Java 實驗案例(多型)

Java 實驗案例(多型)

實驗任務
  • 任務一:圖形面積周長計算小程式
  • 任務二:飼養員餵養動物程式

實驗內容:

任務一: 圖形面積周長計算

任務目的:

  1. 掌握多型的含義及應用場合
  2. 掌握上轉型物件和多型的實現
  3. 掌握abstract關鍵字的使用

任務描述:

設計一個小程式,可以計算圓形和長方形的面積及周長,其中

定義抽象類 圖形類為圓形和長方形的父類,在圖形類中定義抽象方

法獲取面積方法和獲取周長方法。定義面積和周長計算器,可以計

算不同圖形的面積和周長。程式要具備良好的可擴充套件性和可維護性

程式執行結果參考如下圖片:

實施步驟:

任務分析:

  定義父類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);
    }
}

任務二:飼養員餵養動物

任務目的:

  1. 掌握多型的含義及應用場合。
  2. 掌握上轉型物件和多型的實現
  3. 體會多型帶來的好處
  4. 掌握instanceof運算子的使用

實施步驟:

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

 執行結果如下圖: