题目
前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。
本题描述:
1.定义抽象类Shape
属性:不可变静态常量double PI,值为3.14,
抽象方法:public double getPerimeter(),public double getArea()
2.Rectangle与Circle类均继承自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 + "]";
}
}