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

(备注:本人是一个小小的知识搬运工,内容包含个人见解,如有错误请多多指教!)

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需注意行尾回车换行问题。

思考

  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

源代码:

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;
	}
	public double getPerimeter() {//重写求周长
		// TODO Auto-generated method stub
		return 2 * (wide + len);
	}
	public double getArea() {//重写,求面积
		// TODO Auto-generated method stub
		return wide * len;
	}
	public String toString(){//定义输出格式,在eclipse本身就有的,展现长方形的相关信息
		return "[width=" + wide + ", length=" + len + "]";
	}
}
class Circle extends Shape {//圆形类
	int radius;
 
	Circle(int _radius) {//构造函数,初始化
		radius = _radius;
	}
	public double getPerimeter() {//重写,求周长
		return radius * 2 * PI;
	}
	public double getArea() {//重写,求面积
		return radius * radius * PI;
    }
	public String toString(){//定义输出格式,在eclipse本身就有的,展现圆的相关信息
		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")) {//判断其为长方形还是圆形, equals() 方法用于比较两个字符串的内容是否相等。
				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) {//instanceof常用于多态中进行下转型进行类型判断
					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();
	}
}

测试效果:

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

7-1 jmu-Java-03面向对象基础-04-形状-继承 (10 分)_第2张图片

你可能感兴趣的:(7-1 jmu-Java-03面向对象基础-04-形状-继承 (10 分))