实验任务

  • 任务一:图形面积周长计算小程序
  • 任务二:饲养员喂养动物程序

实验内容:

任务一: 图形面积周长计算

任务目的:

  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 = ;    // 圆的半径
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 *radius*PI;
} }

/* 子类Rectangle */

public class Rectangle extends Shape {

    private double length = ;    // 长方形的长
private double width = ; // 长方形的宽 // 有参构造,初始化长方形的长和宽
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 *(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(, ); // <-------多态
Circle circle = new Circle(); // 求长方形和圆形的面积
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();
fd.feed(dog, bone);
System.out.println("-----------------");
fd.feed(new Cat(), new Fish()); fd.perform(dog);
fd.perform(new Cat());
}
}

运行结果如下图:

Java 实验案例(多态)的更多相关文章

  1. Java实验案例(接口)

    实验任务 任务一:设计实现发声接口 任务二:动物乐园 实验内容 任务一:设计实现发声接口 任务目的: 理解并掌握如何定义接口 掌握接口的实现方式 任务描述: 设计和实现一个Soundable接口,该接 ...

  2. Java 实验案例(类和对象篇)

    实验任务 任务一:手机类的封装 任务二:基于控制台的购书系统 任务三:简单的投票程序 实验内容 任务一:手机类的封装 任务目的 理解和掌握面向对象的设计过程 掌握类的结构和定义过程 掌握构造方法及其重 ...

  3. Java面向对象之多态(来源于身边的案例)

    2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...

  4. Java实验二20135104

    课程:Java程序设计          班级: 1351 姓名:刘帅                学号:20135104 成绩:             指导教师:娄嘉鹏       实验日期:2 ...

  5. Java实验报告二:Java面向对象程序设计

    Java实验报告二:Java面向对象程序设计                                                                               ...

  6. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  7. Java实验报告(实验二)

    课程:Java程序设计          班级: 1351 姓名:王玮怡                学号:20135116 成绩:             指导教师:娄嘉鹏       实验日期: ...

  8. java实验报告二

    一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...

  9. 20145203盖泽双:Java实验报告二

    Java实验报告二:Java面向对象程序设计 实验要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验内容 ...

随机推荐

  1. 【BZOJ2082】【POI2010】Divine divisor 假的pollard-rho

    题目大意:给你$m$个数$a_i$,定义$n=\Pi_{i=1}^{m}a_i$.将$n$分解质因数为$\Pi p_i^{k_i} $,$p_i$是质数.请输出$2^{max(k_i)}-1$,以及存 ...

  2. RabbitMQ和Kafka对比以及场景使用说明

    我目前的项目最后使用的是RabbitMQ,这里依然是结合网上大神们的优秀博客,对kafka和rabbitmq进行简单的比对.最后附上参考博客. 1.架构模型 rabbitmq RabbitMQ遵循AM ...

  3. linux中的tar命令的使用

    参考网址: https://www.cnblogs.com/newcaoguo/p/5896975.html https://www.cnblogs.com/xccjmpc/p/6035397.htm ...

  4. 【C#小知识】C#中一些易混淆概念总结---------数据类型存储,方法调用,out和ref参数的使用

    这几天一直在复习C#基础知识,过程中也发现了自己以前理解不清楚和混淆的概念.现在给大家分享出来我的笔记: 一,.NET平台的重要组成部分都是有哪些 1)FCL (所谓的.NET框架类库) 这些类是微软 ...

  5. Javac语法糖之内部类

    在Javac中解语法糖主要是Lower类来完成,调用这个类的入口函数translateTopLevelClass即可.这个方法只是JavacCompiler类的desugar方法中进行了调用. 首先来 ...

  6. C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽 -- 欢迎界面

    程序运行先显示一个对话框,确定进入主程序 1.新建Qt工程,类MyWidget,基类QWidget 2.新建设计师界面类MyDialog,基类QDialog 3.-----main.cpp----- ...

  7. surgemq 添加ssl

    surgemq添加ssl 1.MQTT协议 消息发布订阅功能的消息队列协议 报文组成: 固定报头(控制报文类型)+可变报头(协议名称.协议级别.连接标志.保持连接)+有效载荷(clentId+will ...

  8. java学习-get和post请求

    摘要 看完本文可以知道,使用java原生编写get/post请求的步骤,进行网络请求时应该注意的地方. 这里使用java自带的HttpUrlConnection对象进行网络请求, 请求步骤大致分为五步 ...

  9. mongodb 数据库备份脚本

    写了小shell bash, 用于给mongodb数据进行备份 #!/bin/bash #backup MongoDB #文件目录 #backup MongoDB #!/bin/bash #backu ...

  10. Java 集合框架:HashMap

    原文出处:Java8 系列之重新认识 HashMap 摘要 HashMap 是 Java 程序员使用频率最高的用于映射 (键值对) 处理的数据类型.随着 JDK(Java Developmet Kit ...