2014-02-25 32 views
1

我不太確定如何將標題字也沒有,但我會盡量做到儘可能具體。我創建了一個包含構造函數的類,該構造函數允許我創建「Circle」類型的對象,並且此圓圈具有參數半徑。這裏是這個類:聲明一個私有的實例變量,並引用它在不同的類

public class Circle { 
    private double radius; 

    public Circle(double radius) { 
     this.radius = radius; // this.radius refers to the instance variable above 
    } 

    public Circle() { 
    } 

    public double getArea() { 
     double area = radius * radius * Math.PI; 
     return area; 
    } 

    public double getCircumference() { 
     double circumference = 2 * Math.PI * radius; 
     return circumference; 
    } 
} 

我認爲這個代碼中包含的方法是直截了當的。我創建一個給定半徑的對象,並計算周長和麪積。

我還有另一個類CircleTester,其中我創建了兩個Circle類型對象c1和c2,它們的半徑分別爲5和10。

public class CircleTester { 
    public static void main (String[] args) { 
     Circle c1 = new Circle(5); 
     double circumference1 = c1.getCircumference(); 
     double area1 = c1.getArea(); 
     System.out.println("Radius of c1: " + c1.radius); 
     System.out.printf("The circle c1 with circumference %.3f has area %.3f%n", circumference1, area1); 

     Circle c2 = new Circle(10); 
     double area2 = c2.getArea(); //objectReference.methodName() 
     double circumference2 = c2.getCircumference(); //objectReference.methodName() 
     System.out.println("Radius of c2: " + c2.radius); 
     System.out.printf("The circle c2 with circumference %.3f has area %.3f%n", circumference2, area2); 
    } 
} 

我有錯誤,有以下2行:

System.out.println("Radius of c2: " + c2.radius); 

System.out.println("Radius of c2: " + c2.radius); 

該項目未能作爲實例變量「半徑」被聲明爲Circle類的私人識別c2.radius。

我的問題是有沒有辦法讓CircleTester程序讀取每個對象的半徑值,而不需要將實例變量從private改爲public? c1.radius和c2.radius不起作用 - 錯誤是「Circle.radius不可見」(因爲它是私人的)**

我不想讓它公開的原因是因爲我我的導師告訴我,宣佈一個實例變量是公開的,可以被看作是糟糕的編程,我們可能會在考試中受到懲罰。

對不起,如果這是模糊或愚蠢 - 解釋從來就不是我的強項。我對Java也很新,所以我不能100%確定是否正確使用我的所有術語。

回答

0

當您定義一個對象時,請考慮所有您可能想要詢問的對象。例如,對於一個圓形對象,您可能需要詢問面積,半徑,直徑,周長......所以

不要引誘直接暴露對象的內部參數。

public class Circle { 
    private double radius; 

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

    public double getArea() { return radius*radius*Math.PI; } 
    public double getRadius() { return radius;} 
    public double getDiameter() { return 2*radius;} 
    public double getCircumference() { return Math.PI*getDiameter();} 
} 
+0

啊,所以我沒有聲明所有使用的方法干將? – user3186023

+0

我其實很喜歡這種方法,並試圖實施它,工作一種享受,謝謝:) – user3186023

+0

很好。將其標記爲答案?還是你需要別的東西? – ErstwhileIII

3

只是做一個getter方法:

public double getRadius() { 
    return radius; 
} 
1

最簡單的(標準)的方法是在Circle類申報了 「消氣」 的方法,即

public double getRadius() { 
    return radius; 
} 

或者,你可以使用反思,但它並不意味着用於像問題中描述的情況。所以,getter方法就是解決方案。

+0

我應該提到我確實嘗試過,在circle類中聲明它,而circle類加載時,CircleTester沒有。我不知道我做錯了什麼(我會用什麼替換c1.radius - 只是c1.getRadius吧? – user3186023

+0

是的,c1.getRadius()會做的。 – PNS

+0

對不起,我應該添加錯誤代碼I當修改c1.radius到c1.getRadius時得到「getRadius無法解析或不是字段」 – user3186023

1

最好的辦法是在你的類圓創建一個getter你變半徑

public double getRadius(){ 
    return radius; 
} 

,並使用

System.out.println("Radius of c2: " + c2.getRadius()); 
0

只需使用getter來獲取變量:

public double getRadius() { 
    return radius; 
} 

這實際上是一個很好的編程習慣。如果你想改變這個值,你可以同樣做一個setter。

+0

您是否同意將實例聲明爲public不好的編程,但是 - 或者是我的導師只是其中一個傢伙誰說他的** **?感謝您對我的問題的快速反應! – user3186023

+0

避免廣告hominem攻擊第二。我會建議不暴露爲公衆除常數外的其他任何東西你可能需要改變內部工作,最好隱藏在方法調用後面 – ErstwhileIII

+0

我還有一個問題與這個不完全相關,而不是鍵入「半徑c 1:...「和」c1的圓周...「,有沒有什麼方法可以引用該對象,而不是爲我創建的每個對象顯式鍵入」c1「和」c2「等等?不知道這是否有道理。對不起,將它添加到這個評論中,我還不能回答我的問題 – user3186023

0

雖然getter方法是最好的方法,但下面是使用反射的方法。除非你想讓你的Circle對象有效地不可變,否則我不會推薦使用它。

Circle circle = new Circle(10.0); 

Field radius; 
try { 
    radius = circle.getClass().getDeclaredField("radius"); 
    radius.setAccessible(true); // required since field is private 
    System.out.println(radius.getDouble(circle)); 
    radius.setAccessible(false); 
} catch (NoSuchFieldException | IllegalAccessException e) { 
    e.printStackTrace(); 
} 
相關問題