前言
前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。
本题描述
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需注意行尾回车换行问题。
输入样例:
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.*;
abstract class Shape{
final double PI=3.14;
// 抽象方法,子类必须实现计算周长和面积的方法
abstract public double getPerimeter();
abstract public double getArea();
}
class Rectangle extends Shape {
int width;
int length;
// 矩形构造函数,接收宽度和长度作为参数
Rectangle(int width,int length){
this.width=width;
this.length=length;
}
// 重写父类的抽象方法,计算矩形周长
@Override
public double getPerimeter() {
return (width+length)*2;
}
// 重写父类的抽象方法,计算矩形面积
@Override
public double getArea() {
return width*length;
}
// 重写toString方法,以便打印矩形对象信息
@Override
public String toString() {
return "Rectangle [" +
"width=" + width +
", length=" + length +
']';
}
}
class Circle extends Shape{
int radius;
// 圆形构造函数,接收半径作为参数
Circle(int radius){
this.radius=radius;
}
// 重写父类的抽象方法,计算圆形周长(圆周率乘以直径)
@Override
public double getPerimeter() {
return 2*radius*PI;
}
// 重写父类的抽象方法,计算圆形面积(圆周率乘以半径的平方)
@Override
public double getArea() {
return radius*radius*PI;
}
// 重写toString方法,以便打印圆形对象信息
@Override
public String toString() {
return "Circle [" +
"radius=" + radius +
']';
}
}
public class Main{
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
// 读取形状的数量
int n= in.nextInt();
// 创建一个Shape类型的数组来存储不同形状的对象
Shape shape[]=new Shape[n];
// 初始化总周长和总面积变量
double all_s=0;
double all_l=0;
// 遍历所有输入的形状并创建相应对象
for (int i=0;i<n;i++){
String j=in.next();
// 根据用户输入判断创建矩形或圆形对象
if (j.equals("rect")) {
int a=in.nextInt(); // 宽度
int b=in.nextInt(); // 长度
shape[i]=new Rectangle(a,b);
} else {
int a=in.nextInt(); // 半径
shape[i]=new Circle(a);
}
// 计算当前形状的周长和面积,并累加到总和中
all_s+=shape[i].getArea();
all_l+=shape[i].getPerimeter();
}
// 打印总周长和总面积
System.out.println(all_l);
System.out.println(all_s);
// 打印所有形状的信息
System.out.print("["+shape[0].toString());
for (int i=1;i<n;i++) System.out.print(", "+shape[i].toString());
System.out.println("]");
// 打印每个形状对象的实际类名及其父类
for (int i=0;i<n;i++) System.out.println(shape[i].getClass()+",class Shape");
}
}
abstract class 类名 {
// 抽象方法
abstract 返回类型 方法名(参数列表);
// 非抽象方法
返回类型 方法名(参数列表) {
// 方法体
}
}