2013-03-30 88 views
1

我一直在看我的源代碼,無法弄清楚它有什麼問題。 我認爲這個問題與Circle類有關。當我從 DriverCircle類中調用mutators和訪問器時,它會給我提供錯誤的輸出。對於getDiameter,它只是打印出0。爲什麼我的setter和getter方法不起作用?

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);} 
    } 
} 
+1

您的setter方法應該有參數並使用參數來設置字段。否則它們實際上並不是setter方法。你當前的setter方法應該全部丟棄。 –

+0

您不應該將直徑,圓周和麪積存儲爲變量。只需在使用半徑的getter方法中計算它們即可。 – Ignacio

回答

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; 
} 
+0

有道理謝謝 – anonymous

+0

@anonymous:不客氣,歡迎您的加入! –

1

PI未初始化。此外,將pi存儲爲實例成員有點奇怪。只需在您的計算中使用Math.PI即可。

1

您從不打電話setDiameter()。你的構造函數設置半徑的值,但它沒有做任何關於設置直徑變量的事情!

你可能只是想改寫getDiameter()

public double getDiameter() { 
    return 2.0 * radius; 
} 
+0

我剪下了setDiameter,並創建了一個getDiameter方法。謝謝! – anonymous

0

您構建一個Circle對象,其設置半徑,但你永遠不設置直徑。應該從構造函數調用setDiameter()。

更好的是,刪除setDiameter()方法,因爲它完全沒有必要。只需使getDiameter()返回2 *半徑即可。

0

我看到兩個問題。

首先,如果您使用雙重構造函數,則不要將值設置爲pi。你也應該使用無參數的構造以及設置你的半徑值:

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約定並在設置值後立即調用它。
  • 強烈建議您爲getArea做同樣的事情,但我會將這部分作爲練習留給讀者。

在代碼中,一個簡單的例子:

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

public void setRadius(double r) { 
    radius = r; 
    calculateDiameter(); 
} 
0

只設置半徑不更新使用半徑各項功能;你必須明確地調用這些函數,否則它們仍然是Java的默認值0. 我也會在Circle(radius)方法中執行任何錯誤檢查;這種方式沒有負數將它變成半徑集合。