jmu-Java-03面向对象基础-04-形状-继承 PTA

jmu-Java-03面向对象基础-04-形状-继承 PTA

  • 题目
    • 本题描述:
    • 思考
  • 分析
  • 答案

题目

前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。

本题描述:

1.定义抽象类Shape
属性:不可变静态常量double PI,值为3.14
抽象方法:public double getPerimeter(),public double getArea()

2.RectangleCircle类均继承自Shape类。
Rectangle类( 属性:int width,length)、Circle类(属性:int radius)。
带参构造函数为Rectangle(int width,int length),Circle(int radius)toString方法(Eclipse自动生成)

3.编写double sumAllArea方法计算并返回传入的形状数组中所有对象的面积和
double sumAllPerimeter方法计算并返回传入的形状数组中所有对象的周长和

4.main方法

  • 4.1 输入整型值n,然后建立n个不同的形状。如果输入rect,则依次输入宽、长。如果输入cir,则输入半径。
  • 4.2 然后输出所有的形状的周长之和,面积之和。并将所有的形状信息以样例的格式输出。 提示:使用Arrays.toString
  • 4.3 最后输出每个形状的类型与父类型.使用类似shape.getClass() //获得类型, shape.getClass().getSuperclass() //获得父类型;

注意:处理输入的时候使用混合使用nextInt与nextLine需注意行尾回车换行问题。

思考

  • 1.你觉得sumAllArea和sumAllPerimeter方法放在哪个类中更合适?
  • 2.是否应该声明为static?

输入样例:

4
rect
3 1
rect
1 5
cir
1
cir
2

输出样例:

38.84
23.700000000000003
[Rectangle [width=3, length=1], Rectangle [width=1, length=5], Circle
[radius=1], Circle [radius=2]]
class Rectangle,class Shape
class Rectangle,class Shape
class Circle,class Shape
class Circle,class Shape

分析

本题主要考察的是对继承的理解
解题思路:
1.将sumAllArea和sumAllPerimeter方法放在Shape类中作为静态变量
2.可以进行重载,如:
double sumAllPerimeter():返回所有形状的周长之和
void sumAllPerimeter(Rectangle rect):输入矩形并将其周长加入周长和
void sumAllPerimeter(Circle cir):输入圆形并将其周长加入周长和
double sumAllArea():返回所有形状的面积之和
void sumAllArea(Rectangle rect):输入矩形并将其面积加入面积和
void sumAllArea(Circle cir):输入圆形并将其面积加入面积

答案

import java.util.Arrays;
import java.util.Scanner;


/**
 *
 * @author 梓叶枫林
 * @date 2020/10/31
 */
public class Main {

    public static void main (String [] args) {

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        //存储每个形状的实例,用于之后的输出各个形状的信息
        Shape [] shapes = new Shape[n];

        for (int i = 0; i < n; i++) {

            String str = scanner.next();

            if ("rect".equals(str)) {

                Rectangle rectangle = new Rectangle(scanner.nextInt(), scanner.nextInt());
                shapes[i] = rectangle;
                Shape.sumAllArea(rectangle);
                Shape.sumAllPerimeter(rectangle);
            } else if ("cir".equals(str)) {

                Circle circle = new Circle(scanner.nextInt());
                shapes[i] = circle;
                Shape.sumAllArea(circle);
                Shape.sumAllPerimeter(circle);
            }
        }
        scanner.close();

        //输出所有形状的周长之和
        System.out.println(Shape.sumAllPerimeter());
        //输出所有形状的面积之和
        System.out.println(Shape.sumAllArea());
        //输出所有形状的信息
        System.out.println(Arrays.toString(shapes));

        //输出每个形状的类型及其父类型
        for (int i = 0; i < n; i++) {
            System.out.print(shapes[i].getClass() + ",");
            System.out.println(shapes[i].getClass().getSuperclass());
        }
    }
}


abstract class Shape {

    final static double PI = 3.14;

    /**
     * 存所有形状的面积之和
     * */
    private static double area = 0.0;

    /**
     * 存所有形状的周长之和
     * */
    private static double perimeter = 0.0;

    /**
     * 返回该形状的周长
     * */
    public abstract double getPerimeter();
    /**
     * 返回该形状的面积
     * */
    public abstract double getArea();

    @Override
    public abstract String toString();


    /**
    * double sumAllArea():返回所有形状的面积之和
    * void sumAllArea(Rectangle rect):输入矩形并将其面积加入面积和
    * void sumAllArea(Circle cir):输入圆形并将其面积加入面积
    * */
    static double sumAllArea() {
        return area;
    }

    static void sumAllArea(Rectangle rect) {
        area += rect.getArea();
    }

    static void sumAllArea(Circle cir) {
        area += cir.getArea();
    }

    /**
     * double sumAllPerimeter():返回所有形状的周长之和
     * void sumAllPerimeter(Rectangle rect):输入矩形并将其周长加入周长和
     * void sumAllPerimeter(Circle cir):输入圆形并将其周长加入周长和
     * */
    static double sumAllPerimeter() {
        return perimeter;
    }

    static void sumAllPerimeter(Rectangle rect) {
        perimeter += rect.getPerimeter();
    }

    static void sumAllPerimeter(Circle cir) {
        perimeter += cir.getPerimeter();
    }


}


class Rectangle extends Shape {

    private int width;
    private int length;

    Rectangle(int width, int length) {
        this.width = width;
        this.length = length;
    }


    @Override
    public double getPerimeter() {
        return 2 * (width + length);
    }

    @Override
    public double getArea() {
        return width * length;
    }

    @Override
    public String toString() {
        return "Rectangle [width=" + width + ", length=" + length + "]";
    }

}


class Circle extends Shape {

    private int radius;

    Circle (int radius) {
        this.radius = radius;
    }


    @Override
    public double getPerimeter() {
        return 2 * PI * radius;
    }

    @Override
    public double getArea() {
        return  PI * radius * radius;
    }

    @Override
    public String toString() {
        return "Circle [radius=" + radius + "]";
    }
}

你可能感兴趣的:(PTA算法题(部分),java,算法,继承)