1

我一直在查看我的源代码,但无法弄清楚它有什么问题。我认为问题在于 Circle 类。当我从 DriverCircle 类调用变异器和访问器时,它给了我错误的输出。对于 getDiameter,它只是打印出 0。

public class Circle{
    private double radius;  
    private double pi;
    private double diameter;
    private double circumference;
    private double area; 

    public Circle(){
        pi = Math.PI;
        radius = 0;
    }

    public Circle(double radius){
        this.radius = radius;
    }
    public void setDiameter(){
        diameter = (2 * radius);
    }
    public double getDiameter(){
        //diameter = 2 * radius;
        return diameter;
    }
    public void setCircumference(){
        circumference = (2 * pi * radius);
    }
    public double getCircumference(){
        //circumference = 2 * pi * radius;
        return circumference;
    }
    public double getArea(){
        //area = pi * Math.pow(radius, 2);
        return area;
    }
    public void setArea(){
        area = (pi * Math.pow(radius, 2));
    }
    public void setRadius(double radius){
        this.radius = radius;
    }
    public double getRadius(){
        return radius;
    }
    public String toString(){
        return "The radius is " + radius;
    }
}

(测试者)...

import java.util.Scanner;

public class CircleDriver {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        System.out.println("Please enter the radius: ");
        Circle[] circles = new Circle[10];
        Circle objectCircle = new Circle();
        objectCircle.setRadius(input.nextDouble());


        circles[1] = new Circle();
        circles[2] = new Circle(2.0);
        circles[3] = new Circle(3.5);
        circles[4] = new Circle(5.0);
        circles[5] = new Circle(0.0);
        circles[6] = new Circle(15);
        circles[7] = new Circle(25);
        circles[8] = new Circle(-7);
        circles[9] = new Circle(-10.0);

        System.out.println("Initial call to toString():");
        for (Circle c : circles)
            {System.out.println("\t" + c);}

        System.out.println("Call to getRadius (should be same as above):");
        for (Circle r : circles)
            {if (r != null)
                {System.out.println("\t" + r.getRadius());}}

        System.out.println("Call to getDiameter (should be twice the value shown above):");
        for (Circle d : circles)
            {if (d != null)
                {System.out.println("\t" + d.getDiameter());}}

        System.out.println("Calls to getCircumference:");
        System.out.println("\tShould be 2 * PI:  " + circles[1].getCircumference());
        System.out.println("\tShould be 0.0:  " + circles[5].getCircumference());

        System.out.println("\nCall to getArea:");
        System.out.println("\tShould be PI:  " + circles[1].getArea());
        System.out.println("\tShould be 0.0:  " + circles[5].getArea());

        System.out.println("Testing out the setRadius method:");
        for (int i = 0; i < circles.length / 2; i++)
            {if (circles[i] != null)
                {circles[i].setRadius(i);}}

        System.out.println("Call to toString after setting the first half of the objects:");
        for (Circle c : circles)
            {System.out.println("\t" + c);}
    }
}
4

6 回答 6

2

您的 setter 方法应该有参数并使用参数来设置字段。否则,它们实际上不是 setter 方法。您当前的 setter 方法应该全部丢弃,除了可能setRadius(...),并且大部分计算都在各自的 getter 方法中完成。

即,不是

public void setCircumference(){
    circumference = (2 * pi * radius);
}

public double getCircumference(){
    //circumference = 2 * pi * radius;
    return circumference;
}

反而

public double getCircumference(){
    return 2 * Math.PI * radius;
}
于 2013-03-30T03:11:10.800 回答
1

在构造函数中提供值时,不会初始化 pi。此外,将 pi 存储为实例成员有点奇怪。只需在计算中使用 Math.PI。

于 2013-03-30T03:10:12.087 回答
1

你从不打电话setDiameter()。您的构造函数设置了半径的值,但它对设置直径变量没有任何作用!

您可能只想重写getDiameter()

public double getDiameter() {
    return 2.0 * radius;
}
于 2013-03-30T03:10:30.637 回答
0

您构造了一个圆形对象,它设置了半径,但您从未设置过直径。应该可能从构造函数调用 setDiameter() 。

更好的是,删除 setDiameter() 方法,因为它完全没有必要。只需让 getDiameter() 返回 2*radius。

于 2013-03-30T03:12:22.970 回答
0

我看到两个问题。

pi首先,最重要的是,如果使用 double 构造函数,则不设置值。您还应该使用无参数构造函数并设置半径值:

 public Circle(double radius){
    this(); // calls the no-args constructor
    this.radius = radius;
 }

其次,没有明确调用setDiameter(). 有趣的是,这种方法用词不当——只要半径不为零,就应该计算它。setArea是一样的——你没有将任何东西传递给那个方法调用。以下是我的建议:

  • 重命名setDiametercalculateDiameter以明确其意图。重命名的原因是为了让这个类遵循JavaBean关于 set 和 get 的约定。
  • 在,之后立即public Circle(double radius)调用。calculateDiameter()
  • 每当setRadius()被调用时,要么立即调用它,要么calculateDiameter违反 JavaBean 约定,并在设置值后立即调用它。
  • It's strongly encouraged to do the same thing for getArea, but I'll leave that portion as an exercise to the reader.

In code, a brief example:

 public Circle(double radius){
     this(); // calls the no-args constructor
     this.radius = radius;
     calculateDiameter();
 }

 public void setRadius(double r) {
     radius = r;
     calculateDiameter();
 }
于 2013-03-30T03:16:49.447 回答
0

Just setting the radius does not update every function that uses radius; you have to call those functions explicitly or else they remain at Java's default of 0. I would also do any error checking at the Circle(radius) method; that way no negative numbers make it into the set of radii.

于 2013-03-30T04:05:42.387 回答