这是Shape类中的代码。它一个抽象类,它定义了两个图形的基本方法 getPerimeter()
和 getArea()。
public abstract class Shape {
//定义一个用于计算周长的方法
public abstract double getPerimeter();
//定义一个用于计算面积的方法
public abstract double getArea();
}
这是rec类中的代码。rec
是一个矩形类,它继承自父类 Shape
,并重写了父类的抽象方法。rec
有两个私人属性:chang
(长)和 kuan
(宽),可以通过 setChang()
和 setKuan()
方法设置它们的值。(注:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。)
public class rec extends Shape{
private double chang;
private double kuan;
public double getChang() {
return chang;
}
public void setChang(double chang) {
this.chang = chang;
}
public double getKuan() {
return kuan;
}
public void setKuan(double kuan) {
this.kuan = kuan;
}
@Override
//计算矩形的周长
public double getPerimeter() {
return (chang+kuan)*2;
}
@Override
//计算矩形的面积
public double getArea() {
return chang*kuan;
}
}
这是rou中的代码。rou
是一个圆形类,它同样继承自父类Shape
,并重写了父类的抽象方法。rou
有一个属性 r
(半径),可以通过 setR()
方法设置它的值。
public class rou extends Shape{
private double r;
public rou() {
this.r = r;
}
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
@Override
//计算圆的周长
public double getPerimeter() {
return 2*r*Math.PI;
}
@Override
//计算圆的面积
public double getArea() {
return r*Math.PI;
}
}
最后这是实现类。首先在begin()
方法中,如果传入的 shape
是 rec
类型,会将其向下转型为 rec
类型,并通过用户输入设置矩形的长和宽。然后调用 getPerimeter()
和 getArea()
方法获取周长和面积,并打印输出。(注:向下转型是指将父类对象强制转换为子类对象的过程。但它需要满足一个前提条件,即父类对象实际上是子类对象,如果不是则会导致ClassCastException 异常。而且向下转型会破坏了面向对象的封装性原则。父类对象通常是通过父类接口来操作的,而子类对象可能具有额外的属性和行为。当我们将父类对象向下转型为子类对象后,可能会无意中访问到子类特有的属性和方法。所以我们在写代码时应该进来避免使用向下转型,必要时可以使用instanceof运算符来判断对象的类型。)
在 main()
方法中,先通过用户输入获取想要计算的图形类型,然后使用 switch
语句根据用户输入创建对应的图形对象。如果用户输入的是 “圆形”,则创建一个 rou
对象,如果用户输入的是 “矩形”,则创建一个 rec
对象。然后调用 begin()
方法传入对应的图形对象进行计算和输出。
public class ShapeBegin {
public static void begin(Shape shape) {
Scanner input = new Scanner(System.in);
if (shape instanceof rec) {
System.out.println("请输入矩形的长:");
double chang = input.nextInt();
System.out.println("请输入矩形的宽:");
double kuan = input.nextInt();
//像下转型,父类转成子类(慎用)
rec myrec = (java807.rec) shape;
myrec.setChang(chang);
myrec.setKuan(kuan);
System.out.println("矩形的周长是:" + myrec.getPerimeter() + "矩形的面积是:" + myrec.getArea());
} else if (shape instanceof rou) {
System.out.println("请输入圆的半径:");
double rou = input.nextInt();
rou myrou = (java807.rou) shape;
myrou.setR(rou);
System.out.println("圆的周长是:" + myrou.getPerimeter() + "圆的面积是:" + myrou.getArea());
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入形状:(圆形/矩形)");
String xingzhuang = input.next();
switch (xingzhuang) {
case "圆形":
Shape shape = new rou();
begin(shape);
break;
case "矩形":
Shape shapea = new rec();
begin(shapea);
break;
}
}
}
结果展示