创建一个抽象类来获取周长和面积?

时间:2017-05-02 05:05:38

标签: java

我遇到的问题是:

写一个封装形状的抽象超类:一个形状有两个抽象方法:一个返回形状的周长,另一个返回鞋子的区域。它还有一个名为PI的常量字段。这个类有两个非抽象的子类:一个封装一个圆圈,另一个封装一个矩形。圆圈有一个附加属性,即半径。矩形有2个附加属性,即宽度和高度。您还需要包含一个客户端类来测试这两个类。

这是我完成的工作:

Shape.java

public abstract class Shape 
{

public abstract double getPerimeter();
public abstract double getArea();

}

Circle.java

public class Circle extends Shape 
{
private double radius;
final double pi = Math.PI;

//Defualt Constructor, calls Shape default constructor
public Circle() 
{
    //Set default value to radius
    this.radius = 1;
}   

public Circle(double radius) 
{
    this.radius = radius;
}

public double getArea() 
{
    //Return πr^2 (area formula)
    //Use Math.pow method (page 141) in order to calculate exponent
    return (pi * Math.pow(radius, 2));
}

public double getPerimeter() 
{
    //Return 2πr (perimeter formula)
    return (2 * pi * radius);
}}

Rectangle.java

public class Rectangle extends Shape 
{
private double width, height; 
public Rectangle() 
{
    //set default value to width and height
    this.width = 1;
    this.height = 1;
}
public Rectangle(double width, double height) 
{
    this.width = width;
    this.height = height;
}

public double getArea() 
{
    return width * height;
}

public double getPerimeter() 
{
    return 2 * (width + height);
}}   

ShapeClient.java

public class ShapeClient {
public static void main(String [] args) 
{

    // To test Rectangle...
    double width = 13, length = 9;
    Shape rectangle = new Rectangle(width, length);
    System.out.println("The rectangle width is: " + width 
            + " and the length is: " + length
            + "The area is: " + rectangle.getArea()
            + "and the perimeter is: " + rectangle.getPerimeter() + ".");

    //To test Circle...
    double radius = 3;
    Shape circle = new Circle(radius);
    System.out.println("The radius of the circle is: " + radius
        + "The area is: " + circle.getArea()
        + "and the perimeter is: " + circle.getPerimeter() + ".");


}}

我的问题是:PI的常量字段是否需要在Shape类而不是Circle类中?如果是这样,我应该如何将它从圆圈类中取出,我应该如何将它放在Shape类中?

3 个答案:

答案 0 :(得分:1)

PI属性肯定需要在Circle类上。抽象Shape类应该包含其所有子类将要使用或实现的属性和方法。在这种情况下,Rectangle类不需要PI属性。

答案 1 :(得分:1)

抽象类应该只包含字段&适用于所有形状的通用方法,例如getAreagetPerimeter

在这种情况下,PI仅针对Circle形状或重新定义,广场对常量PI没有用处。因此,PI只应位于“圈子”中。 class而不是Shape类。

答案 2 :(得分:0)

将常量移动到抽象类。