Java 實驗案例(多態)

實驗任務小程序

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

實驗內容:測試

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

任務目的:this

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

任務描述: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);
    }
}

 

 

任務二:飼養員餵養動物

任務目的:

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

 運行結果以下圖:

相關文章
相關標籤/搜索