一、实验内容

1. 设计一个扩展自抽象类GeometriObject的新的Triangle类。绘制Triangle类和GeometricObject类的UML图并实现Triangle类。编写一个测试程序,提示用户输入三角形的三条边、一种颜色以及一个表明该三角形是否填充的布尔值。程序应该根据用户的输入,使用这些边以及颜色和是否填充的信息,创建一个Triangle对象。程序应该显示面积、周长、颜色以及真或者假来表明是否被填充。

2. 创建名为ComparableCircle的类,它继承自Circle类,并实现Comparable接口。画出UML图并实现compareTo方法,使其根据面积比较两个圆。编写一个测试程序求出ComparableCircle对象的两个实例中的较大者。

3. 设计一个名为Colorable的接口,其中有名为howToColor()的void方法。可着色对象的每个类必须实现Colorable接口。设计一个扩展GeometricObject类并实现Colorable接口的名为Square的类。实现howToColor方法,显示消息“给所有的四条边着色”。画出包含Colorable、Square和GeometricObject的UML图。编写一个测试程序,创建有五个GeometricObject对象的数组。对于数组中的每个对象而言,如果对象是可着色的,那就调用howToColor方法。

二、实验分析与结果

1.1 UML图

1.2 运行结果

测试案例1:

测试案例2:

测试案例3:

1.3 实验分析

首先定义GeometricObject为从抽象类,同时在GeometricObject中定义两个抽象方法。

public abstract class GeometricObject
public abstract double getArea();
public abstract double getPerimeter();

由于抽象类无法实例化,所以抽象类必须继承,本题中是由Triangle类来继承GeometricObject类

class Triangle extends GeometricObject

注意抽象类被继承后,类中的抽象方法必须被重写,否则编译器会报错。

@Overridepublic double getArea(){if(side1+side2-side3<Math.pow(10,-6) || side1+side3-side2<Math.pow(10,-6)|| side2+side3-side1<Math.pow(10,-6)){return 0.0;}else {double s = (side1 + side2 + side3) / 2;double ans = Math.sqrt(s * (s - side1) * (s - side2) * (s - side3));return ans;}}@Overridepublic double getPerimeter() {return side1 + side2 +side3 ;}

最后在写一个Test.java测试文件来对写的抽象类和继承类进行测试。

在输入过程中,用户输入的三条边未必能构成三角形,在这里我采取的处理方法是用异常中的try-catch类提醒用户输入正确的三边。

while(flag)
{try{side1 = input.nextDouble();side2 = input.nextDouble();side3 = input.nextDouble();if(side1<side2+side3 && side2<side3+side1 && side3<side1+side2)flag = false;elsethrow new InputMismatchException();}catch(InputMismatchException exception){System.out.println("您输入的三条边构不成三角形,请重新输入:");}
}

这里throw的异常是我设置的是InputMismatchException,当然也可以不用try-catch来处理,直接简单的if-else也可以,只是程序会直接结束运行。

2.1 UML图

2.2 运行结果

测试案例1:

测试案例2:

2.3 实验分析

在ComparableCircle类中继承Circle类并实现Comparable接口

class ComparableCircle extends Circle implements Comparable

在Comparable接口中,我们设置一个抽象方法compareTo

public abstract void compareTo(ComparableCircle circle2);

此处的public 和 abstract可以省略,接口默认方法是公共的抽象方法

然后在ComparableCircle类中进行对接口中抽象方法的重写

@Overridepublic void compareTo(ComparableCircle circle2){if(circle2.radius<this.radius) {System.out.println("第一个圆面积较大,较大圆半径为:" + this.radius);System.out.println("其面积为" + String.format("%." +"3f",this.getArea()));}else {System.out.println("第二个圆面积较大,较大圆半径为:" + circle2.radius);System.out.println("其面积为" + String.format("%." +"3f",circle2.getArea()));}}

此处对要输出的圆的面积进行了保留三位小数的处理

最后在创建一个Test.java文件对上述两个类和接口进行测试

3.1 UML图

3.2 实验结果

测试案例:

输出结果:

3.3 实验分析

本题中的GeometricObject可以直接使用第一题的代码,为了减少不必要的代码,我去掉了第一题中的两个抽象方法。

接口同样也是同第二题定义一个抽象方法。

public abstract void howToColor();

最后在Square类中实现这个抽象方法。

@Overridepublic void howToColor() {System.out.println("给所有的四条边着色");}

题目中要求我们判断是否可以涂色,所以我在数组中定义了五个不同类的对象(有些类是前面实验用到的),并用instanceof关键字来判断其是否为实现Colorable接口的类。注意,此处题目要求要定义有五个GeometricObject对象的数组,这里就需要掌握Java中的方法匹配与绑定机制。Java中匹配方法的签名和绑定方法的实现是两个独立的事情。引用变量的声明类型决定了编译时匹配哪个方法。编译器会在编译时,根据参数类型、参数个数和参数顺序找到匹配的方法。一个方法可能在几个子类中都被实现。Java虚拟机在运行时动态绑定方法的实现,这是由变量的实际类型决定的。

GeometricObject[] geometricObject = {new Square(),new Rectangle(),new Circle(),new Triangle(),new Square()};
for(int i=0;i<5;i++){System.out.println("第" + (i+1) + "个对象");if(geometricObject[i] instanceof Colorable)((Square)geometricObject[i]).howToColor();elseSystem.out.println("不可着色");
}

三、源代码

T1:

  GeometricObject.java

public abstract class GeometricObject {private String color;private boolean filled;private java.util.Date dataCreated;protected GeometricObject(){dataCreated = new java.util.Date();}protected GeometricObject(String color,boolean filled){dataCreated = new java.util.Date();this.color = color;this.filled = filled;}public String getColor(){return color;}public void setColor(String color){this.color = color;}public boolean isFilled(){return filled;}public void setFilled(boolean filled){this.filled = filled;}public java.util.Date getDataCreated(){return dataCreated;}public String toString(){return "created on "+ dataCreated + "\ncolor: " + color +" and filled: " + filled;}public abstract double getArea();public abstract double getPerimeter();
}

Triangle.java

class Triangle extends GeometricObject{double side1;double side2;double side3;public Triangle(){}public Triangle(double side1,double side2,double side3){this.side1 = side1;this.side2 = side2;this.side3 = side3;}public void setSide1(double s1){side1 = s1;}public void setSide2(double s2){side2 = s2;}public void setSide3(double s3){side3 = s3;}public double getSide1(){return side1;}public double getSide2(){return side2;}public double getSide3(){return side3;}@Overridepublic double getArea(){if(side1+side2-side3<Math.pow(10,-6) || side1+side3-side2<Math.pow(10,-6)|| side2+side3-side1<Math.pow(10,-6)){return 0.0;}else {double s = (side1 + side2 + side3) / 2;double ans = Math.sqrt(s * (s - side1) * (s - side2) * (s - side3));return ans;}}@Overridepublic double getPerimeter() {return side1 + side2 +side3 ;}
}

Test.java

import java.util.Scanner;
public class Test {public static void main(String []args) {double side1 = 0;double side2 = 0;double side3 = 0;System.out.println("请输入三角形三条边:");Scanner input = new Scanner(System.in);boolean flag = true;while(flag){try{side1 = input.nextDouble();side2 = input.nextDouble();side3 = input.nextDouble();if(side1<side2+side3 && side2<side3+side1 && side3<side1+side2)flag = false;elsethrow new ArrayIndexOutOfBoundsException();}catch(ArrayIndexOutOfBoundsException exception){System.out.println("你输入的三条边构不成三角形,请重新输入:");}}System.out.println("请输入填充的颜色");String color = input.next();System.out.println("请输入填充状态(0表示false,1表示true)");boolean flag1 = true;boolean isFilled = false;while(flag1){try {int intFilled = input.nextInt();if (intFilled == 0 || intFilled == 1) {flag1 = false;if (intFilled == 1)isFilled = true;elseisFilled = false;} else {throw new ArrayIndexOutOfBoundsException();}}catch(ArrayIndexOutOfBoundsException exception){System.out.println("您输入的格式有误,请按照提示重新输入:");}}Triangle triangle = new Triangle(side1,side2,side3);triangle.setColor(color);triangle.setFilled(isFilled);System.out.println("该三角形面积为:" + String.format("%." +"3f",triangle.getArea()));System.out.println("该三角形周长为:" + triangle.getPerimeter());System.out.println("该三角形颜色为:" + triangle.getColor());System.out.println("该三角形填充状态为:" + triangle.isFilled());}
}

T2:

  Circle.java

public class Circle {public static final double PI = 3.14;public double radius;protected Circle(){}protected Circle(double radius){this.radius = radius;}public double getRadius(){return this.radius;}public void setRadius(double radius){this.radius = radius;}public double getArea(){return PI*this.radius*this.radius;}public double getPerimeter(){return 2*PI*this.radius;}
}

Comparable接口和ComparableCircle类

class ComparableCircle extends Circle implements Comparable{Circle c1;ComparableCircle(){}@Overridepublic void compareTo(ComparableCircle circle2){if(circle2.radius<this.radius) {System.out.println("第一个圆面积较大,较大圆半径为:" + this.radius);System.out.println("其面积为" + String.format("%." +"3f",this.getArea()));}else {System.out.println("第二个圆面积较大,较大圆半径为:" + circle2.radius);System.out.println("其面积为" + String.format("%." +"3f",circle2.getArea()));}}
}interface Comparable{public abstract void compareTo(ComparableCircle circle2);
}

Test.java

import java.util.Scanner;
public class Test {public static void main(String []args){Scanner input = new Scanner(System.in);System.out.println("请输入两个圆的半径");double radius1 = input.nextDouble();double radius2 = input.nextDouble();ComparableCircle c1 = new ComparableCircle();ComparableCircle c2 = new ComparableCircle();c1.setRadius(radius1);c2.setRadius(radius2);c1.compareTo(c2);}
}

T3:

  GeometricObject类

public abstract class GeometricObject {private String color;private boolean filled;private java.util.Date dataCreated;protected GeometricObject() {dataCreated = new java.util.Date();}protected GeometricObject(String color, boolean filled) {dataCreated = new java.util.Date();this.color = color;this.filled = filled;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public boolean isFilled() {return filled;}public void setFilled(boolean filled) {this.filled = filled;}public java.util.Date getDataCreated() {return dataCreated;}public String toString() {return "created on " + dataCreated + "\ncolor: " + color +" and filled: " + filled;}
}

Colorable接口和Square类

public class Square extends GeometricObject implements Colorable{Square(){}@Overridepublic void howToColor() {System.out.println("给所有的四条边着色");}
}interface Colorable {public abstract void howToColor();
}

Test.java

public class Test {public static void main(String []args){GeometricObject[] geometricObject = {new Square(),new Rectangle(),new Circle(),new Triangle(),new Square()};for(int i=0;i<5;i++){System.out.println("第" + (i+1) + "个对象");if(geometricObject[i] instanceof Colorable)((Square)geometricObject[i]).howToColor();elseSystem.out.println("不可着色");}}
}

Java 实验8 《抽象类与接口》相关推荐

  1. Java模式设计卖电脑实验报告,面向对象(Java)实验0继承、接口和多态

    <面向对象(Java)实验0继承.接口和多态>由会员分享,可在线阅读,更多相关<面向对象(Java)实验0继承.接口和多态(11页珍藏版)>请在金锄头文库上搜索. 1.电子信息 ...

  2. java笔记之抽象类和接口

    前言 java笔记之抽象类和接口是开发人员的设计工具 正文 1.抽象类 客观存在的一类事物,当这类事物都是抽象的,无法具体的描述. 1)语法: 修饰符 abstract class 类名{ } 2)特 ...

  3. Java提高篇 —— 抽象类与接口

    一.前言 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间 ...

  4. Java 中的抽象类和接口

    Java 中的抽象类和接口 1.参考资料 深入理解Java的接口和抽象类 Java抽象类与接口的区别 2.前言 有一次旁听面试的时候,听到面试官问了一句:既然 JDK8 中接口有了默认方法实现,那接口 ...

  5. Java中类、抽象类、接口之间的区别和联系。

    Java中类.抽象类.接口之间的区别和联系. 程序设计所面对的问题域--客观世界,是由许多事物构成的,这些事物既可以是有形的(比如一辆汽车),也可以是无形的(比如一次会议).把客观世界中的事物映射到面 ...

  6. Java自学笔记——Java面向对象——04.抽象类、接口、内部类

    Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...

  7. Java复习之抽象类和接口

    Java复习之抽象类和接口 Java复习之抽象类和接口 什么是抽象类和接口 抽象类与接口的区别 什么情况下使用抽象类或接口 一个demo引起来的对于java方法区堆栈的研究 首先我们需要明白抽象类与接 ...

  8. JAVA中的抽象类与接口

    JAVA中的抽象类与接口 接口和抽象类的区别: 接口和抽象类是支持抽象类定义的两种机制. 接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现. 抽象类 ...

  9. Java面向对象编程——抽象类和接口

    Java面向对象编程--抽象类和接口 定义类的过程就是抽象和封装的过程,而抽象类与接口则是对实体类进行更高层次的抽象,进定义公共行为和特征. 抽象类: 如果一个类没有足够的信息去描述一个具体的对象,那 ...

  10. Java笔记:抽象类和接口

    Java笔记:抽象类和接口 抽象类 接口 接口多重实现 接口继承接口 嵌套接口 工厂模式 抽象类 在普通类中,一个类必须实现自身写的所有方法,每个方法必须含有自己的方法体.即便先创建一个父类,再由后续 ...

最新文章

  1. Impala使用笔记(一)
  2. 构造函数= default;_Python Collections之defaultdict 和 default_factory关系
  3. (2) 第二章 WCF服务与数据契约 服务契约详解(三)- [ServiceContract]特性
  4. [转载] python学习-基础教程、深度学习
  5. 人力资源管理系统erp
  6. 程序员微信名昵称_微信营销手段之昵称命名
  7. 招商银行/招银网络科技面经、答案
  8. java阿拉伯转大写_JAVA编写将阿拉伯数字转换成中文大写不要...
  9. win10便签如何卸载?win10便签卸载和安装方法
  10. 6.MySQL列Cardinality(基数)
  11. vue动态切换背景图片background
  12. 《那封08年收到的情书》
  13. 计算机视觉基础知识:射影变换,仿射变换,相似变换(比例变换),刚性变换
  14. 4年亏损超6亿,摩贝化学赴美上市能否输血成功?
  15. ZYNQ学习之路19.在SDx中使用xfOpenCV图像加速处理
  16. AsyncTask 的参数
  17. apicloud影视解析APP源码 HTML
  18. 模糊神经网络(二)神经网络
  19. 视频教程-2020最新微信小程序基础+实战精讲视频-微信开发
  20. 论文翻译——Facial Emotion Recognition using Deep Convolutional Networks

热门文章

  1. ogg_for_bigdata (oracle 数据通过ogg到hbase)
  2. python仿360界面_python实现360的字符显示界面
  3. 基于tensorflow2.0的深度学习 一
  4. 最新vue实战视屏 vue2.x thinkPHP5.0后台 nodejs+mong0DB
  5. java实现微博后台登录后台发送微博
  6. 真牛,大神将Windows 10改造成Windows XP(EXPERIENCE Freestyle)
  7. ionic组件-Slides轮播图
  8. 湖仓一体架构下的数据研发及管理
  9. 利用Windows自带的计算器计算十六进制(八进制、二进制)数据
  10. 电子学会2023年3月青少年软件编程python等级考试试卷(四级)真题,含答案解析