zoukankan      html  css  js  c++  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());
        }
    }

     运行结果如下图:

  • 相关阅读:
    C语言中链接影响程序的细节
    Object类的方法
    基于误差反向传播法的神经网络学习的全貌图
    Attention Scaling for Crowd Counting
    plt画图
    机器学习相关技巧
    数值微分
    Noip2017 Day2 T1 奶酪
    串(string)
    八皇后问题
  • 原文地址:https://www.cnblogs.com/yoke/p/7520034.html
Copyright © 2011-2022 走看看