Java 实验8 《抽象类与接口》

一、实验内容

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图

Java 实验8 《抽象类与接口》_第1张图片

1.2 运行结果

测试案例1:

Java 实验8 《抽象类与接口》_第2张图片

测试案例2:

Java 实验8 《抽象类与接口》_第3张图片

测试案例3:

Java 实验8 《抽象类与接口》_第4张图片

1.3 实验分析

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

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

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

class Triangle extends GeometricObject

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

@Override
    public double getArea(){
        if(side1+side2-side3

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

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

while(flag)
{
    try{
        side1 = input.nextDouble();
        side2 = input.nextDouble();
        side3 = input.nextDouble();
        if(side1

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

2.1 UML图

Java 实验8 《抽象类与接口》_第5张图片

2.2 运行结果

测试案例1:

Java 实验8 《抽象类与接口》_第6张图片

测试案例2:

Java 实验8 《抽象类与接口》_第7张图片

2.3 实验分析 

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

class ComparableCircle extends Circle implements Comparable

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

public abstract void compareTo(ComparableCircle circle2);

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

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

@Override
    public void compareTo(ComparableCircle circle2){
        if(circle2.radius

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

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

3.1 UML图

Java 实验8 《抽象类与接口》_第8张图片

3.2 实验结果

测试案例:

输出结果:

Java 实验8 《抽象类与接口》_第9张图片

3.3 实验分析

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

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

public abstract void howToColor();

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

@Override
    public 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();
    else
        System.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;
    }

    @Override
    public double getArea(){
        if(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

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

    @Override
    public void compareTo(ComparableCircle circle2){
        if(circle2.radius

  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(){}
    @Override
    public 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();
            else
                System.out.println("不可着色");
        }
    }
}

你可能感兴趣的:(java,抽象类,接口)