Java 实验案例(多态)
实验任务
- 任务一:图形面积周长计算小程序
- 任务二:饲养员喂养动物程序
实验内容:
任务一: 图形面积周长计算
任务目的:
- 掌握多态的含义及应用场合
- 掌握上转型对象和多态的实现
- 掌握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);
}
}
任务二:饲养员喂养动物
任务目的:
- 掌握多态的含义及应用场合。
- 掌握上转型对象和多态的实现
- 体会多态带来的好处
- 掌握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 实验案例(多态)的更多相关文章
- Java实验案例(接口)
实验任务 任务一:设计实现发声接口 任务二:动物乐园 实验内容 任务一:设计实现发声接口 任务目的: 理解并掌握如何定义接口 掌握接口的实现方式 任务描述: 设计和实现一个Soundable接口,该接 ...
- Java 实验案例(类和对象篇)
实验任务 任务一:手机类的封装 任务二:基于控制台的购书系统 任务三:简单的投票程序 实验内容 任务一:手机类的封装 任务目的 理解和掌握面向对象的设计过程 掌握类的结构和定义过程 掌握构造方法及其重 ...
- Java面向对象之多态(来源于身边的案例)
2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...
- Java实验二20135104
课程:Java程序设计 班级: 1351 姓名:刘帅 学号:20135104 成绩: 指导教师:娄嘉鹏 实验日期:2 ...
- Java实验报告二:Java面向对象程序设计
Java实验报告二:Java面向对象程序设计 ...
- 20175212童皓桢 Java实验二-面向对象程序设计实验报告
20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...
- Java实验报告(实验二)
课程:Java程序设计 班级: 1351 姓名:王玮怡 学号:20135116 成绩: 指导教师:娄嘉鹏 实验日期: ...
- java实验报告二
一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...
- 20145203盖泽双:Java实验报告二
Java实验报告二:Java面向对象程序设计 实验要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验内容 ...
随机推荐
- .gitignore中添加的某个忽略文件并不生效
最近项目中,来了一新同事,协同开发的过程中,发现老是提示pod install,于是照做了,做完项目可以跑成功但发现提示我跟同事一样的问题,Podfile.lock文件需要提交,于是便提交了,然而同事 ...
- Java之集合(十八)DelayQueue
转载请注明源出处:http://www.cnblogs.com/lighten/p/7493735.html 1.前言 本章介绍阻塞队列DelayQueue,这是一个无界阻塞队列.其存储延时的元素,只 ...
- 你误解了Windows的文件后缀名吗?
一.背景说明 有很多的小伙伴对windows下的文件后缀名不能很好地理解作用和区别,更不用说高深的使用了,在这里给大家说一下这些文件后缀名到底有什么区别,有什么作用呢? 二.说明 简单的说来,wind ...
- Struts文件上传(FormFile)
Struts中FormFile用于文件进行上传 1.在jsp文件中进行定义 <form action="/StrutsFileUpAndDown/register.do" m ...
- 共识算法:PBFT、RAFT
转自:https://www.cnblogs.com/davidwang456/articles/9001331.html 区块链技术中,共识算法是其中核心的一个组成部分.首先我们来思考一个问题:什么 ...
- php的$GLOBALS例子
<?php $test = "test"; function show1($abc){//直接把参数传入函数,函数能用 echo $abc.'<br>'; } f ...
- 用java实现一个简易编译器1-词法解析入门
本文对应代码下载地址为: http://download.csdn.net/detail/tyler_download/9435103 视频地址: http://v.youku.com/v_show/ ...
- SpringMVC源码阅读:视图解析器
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- RxJS - Subject(转)
Observer Pattern 观察者模式定义 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态 ...
- 2017年10月21日 CSS常用样式&鼠标样式 以及 jQuery鼠标事件& jQuery图片轮播& jQuery图片自动轮播代码
css代码 背景与前景 background-color:#0000; //背景色,样式表优先级高 background-image:url(路径); //设置背景图片 background-atta ...