解题思路
- 该题目要求需要采用抽象类/接口进行编程,可知这些所有形状可以有一个共同点,一个共同的父类,结合题目可知这个共同点即为求面积,但是因为每个形状求面积的具体方法不同,故可以在父类中放置一个抽象方法。
- 所有父类和子类都放在shape包中
//抽象类的代码
package shape;
abstract class shape {
shape(){}
abstract public double getArea();
}
-
每一个子类都需要建立自己的数据域,构造方法,和覆盖父类的求面积方法
-
因为此题目仅需要求钢板的面积利用率,即只需要知道钢板面积即所有形状的面积和,
故在此处不建立每一个子类实例对象,直接调用子类的方法递加求得所有形状的面积和。实际上还是用new建立对象并调用这个方法,只是没有设置一个变量来指向这个建立的新实例对象。或者用类名来调用static方法,但此处getArea()在逻辑上需要继承父类中的abstract方法,abstract和static又冲突,此处不能这么做。 -
因为程序需要具有较好的扩展性,例如增加一种形状三角形(类型符为D,记录三角形的三条边长)时,计算利用率的代码不会被修改。故在此题中**不直接涉及统计的所有形状的面积中有几个形状**,而是只求得面积,当新形状加入时,只需要修改计算面积的while循环,在if语句中添加一条新的判断方式,调用该新子类的getArea()方法以递加面积。
项目结构
包结构
Main类
package main;
import shape.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入钢板的宽度和高度(格式为: xx xx)");
double width = sc.nextInt();
double height = sc.nextInt();
double usingArea = 0.0;
A steel = new A(width, height);//建立钢板对象,属于A类矩形对象
System.out.println("请继续输入每一个形状的具体数据,具体形状对应格式如下");
System.out.println("矩形: A 宽度 高度");
System.out.println("圆形: B 半径");
System.out.println("梯形: C 上底宽 下底宽 高度");
System.out.println("当输入字母为'0'时代表输入结束,将退出数据录入");
Character letter = sc.next().charAt(0);
while (!letter.equals('0')) {
if (letter.equals('A')) {
double width01 = sc.nextDouble();
double height01 = sc.nextDouble();
usingArea += new A(width01,height01).getArea();
} else if (letter.equals('B')) {
double radius = sc.nextDouble();
usingArea += new B(radius).getArea();
} else if (letter.equals('C')) {
double upWidth = sc.nextDouble();
double downWidth = sc.nextDouble();
double height01 = sc.nextDouble();
usingArea += new C(upWidth,downWidth,height01).getArea();
}
System.out.println("请继续输入数据");
letter = sc.next().charAt(0);
}
String rate = String.format("%.6f", usingArea/steel.getArea()*100) + "%";
System.out.println("钢板利用率为" + rate);
}
}
shape类
package shape;
abstract class shape {
shape(){}
abstract public double getArea();
}
A类
package shape;
public class A extends shape {
//这是一个矩形类
private double width;
private double height;
public A(double width,double height){
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return height*width;
}
}
B类
package shape;
public class B extends shape {
//这是一个圆形类
private double radius;
public B(double radius){
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI*radius*radius;
}
}
C类
package shape;
public class C extends shape{
//这是一个梯形类
private double upWidth;
private double downWidth;
private double height;
public C(double upWidth, double downWidth, double height){
this.upWidth = upWidth;
this.downWidth = downWidth;
this.height = height;
}
@Override
public double getArea() {
return (upWidth/2+downWidth/2)*height;
}
}