Java继承与向上转型

1 篇文章 0 订阅
0 篇文章 0 订阅

题目要求:

在画图软件中,可以画出不同大小或颜色的圆形、矩形等几何图形。几何图形之间有许多共同的特征,如它们可以是用某种颜色画出来的,可以是填充的或者不填充的。此外还有些不同的特征,比如,圆形都有半径,可以根据半径计算圆形的面积和周长,矩形都有宽和高,可以根据宽高来计算矩形的面积和周长。
1、编写Java程序。
(1)使用继承机制,分别设计实现抽象基类图形类,派生类圆形类、正方形类、长方形类,要求:
①抽象图形类中有属性画笔颜色、图形是否填充,有方法获取图形面积、获取图形周长等;
②使用构造方法为其成员属性赋初值;
③在每个派生类中都重写toString()方法,返回所有属性的信息;
④根据文字描述合理设计类的其他成员属性和方法。
(2)设计实现画板类,要求:
①画一个红色、无填充、长和宽分别为10.0与5.0的长方形;
②画一个绿色、有填充、半径为3.0的圆形;
③画一个黄色、无填充、边长为4.0的正方形;
④分别求三个对象的面积和周长,并将每个对象的所有属性信息打印到控制台。

 
2、基于上题背景,设计实现以下程序:
(1)设计Comparable接口,接口中设计compareTo()方法,用来比较对象。此方法的返回值类型设计为int类型。此方法接收一个参数,参数类型为图形类。
(2)在图形类中实现compareTo()方法,用来比较两个图形的面积大小。
(3)在测试类中,创建图形类的数组,数组中存放多个圆形、正方形、长方形对象,使用compareTo()方法找出数组中面积最大的图形。
提示:比较对象时,可以将compareTo()方法的返回值设置为1、0、-1,来代表比较结果,当前对象大、两者相等或者当前对象小。再次提醒,此题涉及的代码全部展示在此题的题号下,与上一题相独立。

 

接口中声明方法

public interface Comparable {
    /**
     * 用来比较两个图形的面积大小
     * @param geometry
     * @return 1、0、-1,来代表比较结果,当前对象大、两者相等或者当前对象小
     */
    public int compareTo(Geometry geometry);
}

 

图形类

public abstract class Geometry implements Comparable{
    String color;
    String fill;
    private String name;
    
    public Geometry(String name, String color,String fill){
        this.name = name;
        this.color = color;
        this.fill = fill;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 计算面积
     */
    public abstract double getGraphicArea();
    
    /**
     * 计算周长
     */
    public abstract double getGraphicCircumference();
    
    /**
     * 实现接口
     * 1、0、-1,来代表比较面积结果,当前对象大、两者相等或者当前对象小
     * this 当前对象
     */
    public int compareTo(Geometry geometry){
        int result = 0;
        if (this.getGraphicArea() > geometry.getGraphicArea()) {
            result = 1;
        } else if (this.getGraphicArea() < geometry.getGraphicArea()) {
            result = -1;
        }else if (this.getGraphicArea() == geometry.getGraphicArea()) {
            result = 0;
        }
        return result;
    }
    
    @Override
    public String toString() {
        return "图形属性 [颜色=" + color + ", 是否填充=" + fill + "]";
    } 

圆形类

public class Circular extends Geometry {
    private double radius;
    
    public Circular(String name,String color,String fill, double radius){
        super(name, color, fill);
        this.radius = radius;
    }

    @Override
    public double getGraphicArea() {
        //System.out.println("圆的面积是"+radius*radius*Math.PI);
        return radius*radius*Math.PI;
    }

    @Override
    public double getGraphicCircumference() {
        return radius*2*Math.PI;
    }

    @Override
    public String toString() {
        System.out.println("圆的面积是"+getGraphicArea());
        System.out.println("圆的周长是"+getGraphicCircumference());
        return "圆的属性 [radius=" + radius + ", color=" + color + ", fill=" + fill + "]";
    }

}

长方形类

public class Rectangle extends Geometry {
    private double wide;
    private double hight;

    
    public Rectangle(String name, String color, String fill, double wide, double hight) {
        super(name, color, fill);
        this.wide = wide;
        this.hight = hight;
    }

    @Override
    public double getGraphicArea() {
        //System.out.println("长方形的面积是"+wide*hight);
        return wide*hight;
    }

    @Override
    public double getGraphicCircumference() {
        return wide*2+hight*2;
        
    }

    @Override
    public String toString() {
        System.out.println("长方形的面积是"+getGraphicArea());
        System.out.println("长方形的周长是"+getGraphicCircumference());
        return "长方形的属性 [wide=" + wide + ", hight=" + hight + ", color=" + color + ", fill=" + fill + "]";
    }

}

正方形类

public class Square extends Geometry {
    private double side;

    public Square(String name ,String color, String fill, double side) {
        super(name, color, fill);
        this.side = side;
    }

    @Override
    public double getGraphicArea() {
        //System.out.println("正方形的面积是"+side*side);
        return side*side;
    }

    @Override
    public double getGraphicCircumference() {
        return side*4;
    }

    @Override
    public String toString() {
        System.out.println("正方形的面积是"+getGraphicArea());
        System.out.println("正方形的周长是"+getGraphicCircumference());
        return "长方形的属性是 [side=" + side + ", color=" + color + ", fill=" + fill + "]";
    }

}

第一题中的画板类

public class DrawingBoard {
    public static void main(String[] args){
        //向上转型
        Geometry circular  = new Circular("圆形", "green", "is fill", 3.0);
        Geometry rectangle = new Rectangle("长方形", "red", "No fill", 10.0, 5.0);
        Geometry square = new Square("正方形", "yellow", "No fill", 4.0);
        
        System.out.println(circular);
        System.out.println(rectangle);
        System.out.println(square);
    }
}

第二题中的测试类

public class Test {
    ArrayList<Geometry> geometries = new ArrayList<>();
    
    /**
     * 
     * @param geometry
     */
    public void add(Geometry geometry){
        geometries.add(geometry);
    }
    
    /**
     * 判断最大值
     * @return
     */
       public Geometry logic(){
        Geometry geometry = geometries.get(0);
        for (int i = 0; i < geometries.size(); i++) {
            if (geometry.compareTo(geometries.get(i)) != 1) {
                geometry = geometries.get(i);
            }
        }
        return geometry;
    }
    
    public static void main(String[] args){
       Geometry circular  = new Circular("圆形", "green", "is fill", 3.0);
        Geometry rectangle = new Rectangle("长方形", "red", "No fill", 10.0, 5.0);
        Geometry square = new Square("正方形", "yellow", "No fill", 4.0);
        Test test = new Test();
        
        test.add(circular);
        test.add(rectangle);
        test.add(square);
        
        System.out.println("面积最大的是:"+test.logic().getName());
        System.out.println(test.logic());
    }
}

第一题输出结果

圆的周长是18.84955592153876
圆的属性 [radius=3.0, color=green, fill=is fill]
长方形的面积是50.0
长方形的周长是30.0
长方形的属性 [wide=10.0, hight=5.0, color=red, fill=No fill]
正方形的面积是16.0
正方形的周长是16.0
长方形的属性是 [side=4.0, color=yellow, fill=No fill]

第二题输出结果

面积最大的是:长方形
长方形的面积是50.0
长方形的周长是30.0
长方形的属性 [wide=10.0, hight=5.0, color=red, fill=No fill]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值