[英]why is my setter and getter methods not working?
我一直在查看我的源代码,无法弄清楚它有什么问题。 我认为问题在于Circle类。 当我从DriverCircle类调用mutators和accessors时,它给了我错误的输出。 对于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);}
}
}
您的setter方法应该有参数并使用参数来设置字段。 否则它们实际上不是setter方法。 除了setRadius(...)
之外,你当前的setter方法都应该被丢弃,并且大多数计算都是在相应的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;
}
在构造函数中提供值时,不会初始化pi。 此外,将pi存储为实例成员有点奇怪。 只需在计算中使用Math.PI即可。
你永远不会调用setDiameter()
。 您的构造函数设置半径的值,但它不会设置直径变量!
您可能只想重写getDiameter()
:
public double getDiameter() {
return 2.0 * radius;
}
您构造了一个圆形对象,用于设置半径,但您从未设置直径。 应该从构造函数中调用setDiameter()。
更好的是,删除setDiameter()方法,因为它完全没必要。 只需使getDiameter()返回2 *半径即可。
我看到两个问题。
首先,如果使用双构造函数,则不要设置pi
的值。 您还应该使用no-args构造函数以及设置radius的值:
public Circle(double radius){
this(); // calls the no-args constructor
this.radius = radius;
}
其次,没有明确调用setDiameter()
。 有趣的是,这种方法用词不当 - 应该在半径非零时计算。 setArea
是一样的 - 你没有把任何东西传递给那个方法调用。 这是我建议的:
setDiameter
重命名为calculateDiameter
以使其意图清晰。 重命名的原因是让此类遵循关于set和get的JavaBean约定。 public Circle(double radius)
,之后立即调用calculateDiameter()
。 setRadius()
,要么立即调用calculateDiameter
要么违反JavaBean约定,并在设置值后立即调用它。 getArea
做同样的事情,但我会将这部分作为练习留给读者。 在代码中,一个简短的例子:
public Circle(double radius){
this(); // calls the no-args constructor
this.radius = radius;
calculateDiameter();
}
public void setRadius(double r) {
radius = r;
calculateDiameter();
}
仅设置半径不会更新使用半径的每个函数; 你必须明确地调用这些函数,否则它们保持Java的默认值0.我也会在Circle(radius)方法中进行任何错误检查; 这样,没有负数使其成为半径集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.