7-1 jmu-Java-03面向对象基础-04-形状-继承 (10 分)

前言

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

本题描述:

  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()(获得父类型);

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

思考

你觉得sumAllArea和sumAllPerimeter方法放在哪个类中更合适?

输入样例:

4
rect
1 1
rect
2 2
cir
1
cir
2

输出样例:

30.840000000000003
20.700000000000003
[Rectangle [width=1, length=1], Rectangle [width=2, length=2], Circle [radius=1], Circle [radius=2]]
class Rectangle,class Shape
class Rectangle,class Shape
class Circle,class Shape
class Circle,class Shape
import java.util.Scanner;

abstract class Shape {
	double PI = 3.14;

	public abstract double getPerimeter();

	public abstract double getArea();
}

class Rectangle extends Shape {
	int wide, len;

	Rectangle(int a, int b) {
		wide = a;
		len = b;
	}

	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return 2 * (wide + len);
	}

	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return wide * len;
	}
	
	public String toString(){
		return "[width=" + wide + ", length=" + len + "]";
	}
}

class Circle extends Shape {
	int radius;

	Circle(int _radius) {
		radius = _radius;
	}

	@Override
	public double getPerimeter() {
		// TODO Auto-generated method stub
		return radius * 2 * PI;
	}

	@Override
	public double getArea() {
		// TODO Auto-generated method stub
		return radius * radius * PI;
	}

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

}

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		in.nextLine();
		Shape A[] = new Shape[n];
		int k = 0, j = 0;
		double sumAllArea = 0, sumAllPerimeter = 0;
		for (int i = 0; i < n; i++) {
			String S = in.next();
			if (S.equals("rect")) {
				int wide = in.nextInt(), len = in.nextInt();
				in.nextLine();
				A[i] = new Rectangle(wide, len);
			} else if (S.equals("cir")) {
				int radius = in.nextInt();
				in.nextLine();
				A[i] = new Circle(radius);
			}
			sumAllArea += A[i].getArea();
			sumAllPerimeter += A[i].getPerimeter();
		}

		System.out.println(sumAllPerimeter);
		System.out.println(sumAllArea);
		System.out.print("[");
		for (int i = 0; i < n; i++) {
			if(i != 0)
				System.out.print(", ");
			if (A[i] instanceof Rectangle) {
					System.out.print("Rectangle ");
				System.out.print(A[i].toString());
			}
			else {
					System.out.print("Circle ");
				System.out.print(A[i].toString());	
			}
		}

		System.out.println("]");

		for(int i = 0;i < n;i++) {
			if(A[i] instanceof Rectangle) {
				System.out.println("class Rectangle,class Shape");
			}else {
				System.out.println("class Circle,class Shape");

			}
		}
		in.close();
	}
}

 

你可能感兴趣的:(Java)