14 图形继承 (20分)
编写程序,实现图形类的继承,并定义相应类对象并进行测试。
类Shape,无属性,有一个返回0.0的求图形面积的公有方法public double getArea();//求图形面积
类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积
类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积
类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法public double getVolume();//求球体积
类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,定义一求立方体体积的方法public double getVolume();//求立方体体积
注意:
每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名
每个类属性均为私有,且必须有getter和setter方法(可用Eclipse自动生成)
输出的数值均保留两位小数
主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;
假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format
输入格式:
共四种合法输入
1 圆半径
2 矩形宽、长
3 球半径
4 立方体宽、长、高
输出格式:
按照以上需求提示依次输出
输入样例1:
在这里给出一组输入。例如:
1 1.0
输出样例1:
在这里给出相应的输出。例如:
Constructing Shape
Constructing Circle
Circle’s area:3.14
输入样例2:
在这里给出一组输入。例如:
4 3.6 2.1 0.01211
输出样例2:
在这里给出相应的输出。例如:
Constructing Shape
Constructing Rectangle
Constructing Box
Box’s surface area:15.26
Box’s volume:0.09
输入样例3:
在这里给出一组输入。例如:
2 -2.3 5.110
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
switch(n) {
case 1:
double r;
r=in.nextDouble();
if(r<0)
{
System.out.println("Wrong Format");
}
else
{
Circle a=new Circle() ;
a.setRadius(r);
System.out.printf("Circle's area:%.2f\n",a.getArea());
}
break;
case 2:
double a,b;
a=in.nextDouble();
b=in.nextDouble();
if(a<=0||b<=0) {
System.out.println("Wrong Format");
}
else
{
Rectangle c=new Rectangle();
c.setWidth(a);
c.setLength(b);
System.out.printf("Rectangle's area:%.2f\n",c.getArea());
}
break;
case 3:
double ra;
ra=in.nextDouble();
if(ra<=0)
{
System.out.println("Wrong Format");
}
else
{
Ball l=new Ball();
l.setRadius(ra);
System.out.printf("Ball's surface area:%.2f\n",l.getArea());
System.out.printf("Ball's volume:%.2f\n",l.getVolume());
}
break;
case 4:
double e,f,g;
e=in.nextDouble();
f=in.nextDouble();
g=in.nextDouble();
if(e<=0||f<=0||g<=0) {
System.out.println("Wrong Format");
}
else
{
Box j=new Box();//怎么打印出三条语句的?
//创建对象同时用了box这个无参构造方法
j.setWidth(e);
j.setLength(f);
j.setHeight(g);
System.out.printf("Box's surface area:%.2f\n",j.getArea());
System.out.printf("Box's volume:%.2f\n",j.getVolume());
}
break;
default :
System.out.println("Wrong Format");
}
}
}
class Shape{
public Shape() {
System.out.println("Constructing Shape");
}
public double getArea() {
return 0.0;
}
}
class Circle extends Shape
{
private double radius;
public Circle()
{
System.out.println("Constructing Circle");
}
public double getArea()
{
return Math.PI*radius*radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
class Rectangle extends Shape{
public Rectangle()
{
System.out.println("Constructing Rectangle");
}
private double width;
private double length;
public double getArea() {
return width*length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
}
class Ball extends Circle{//球继承圆
public Ball()
{
System.out.println("Constructing Ball");
}
public double getArea() {
return 4*super.getArea();
}
public double getVolume() {
double l=getRadius();//在外面不用定义半径,因为父类有,只需要用
return Math.PI*l*l*l*4/3.0;
}
}
class Box extends Rectangle{
public Box()
{
System.out.println("Constructing Box");
}
private double height;
public double getVolume() {
return super.getArea()*height;//父类的面积
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getArea() {
double l=getWidth();
double j=getLength();
return (l*j*2+j*height*2+l*height*2);
}
}