2013-10-24 36 views
1

EDIT2如何使用circle.java來計算圓柱的getVolume。 [2班]

對不起沒關係我只是說

public double cylinderSurfaceArea() { 
     return 2 * base.circleArea() + base.circleCirumference() * 2 * height; 
    } 
} 

由於沒有錯誤代碼。這將是正確的?

編輯:


感謝所有那些誰回答。自那之後,我改變了我之前的Cylinder類閱讀。現在,我希望把它更進了一步,並添加

public double cylinderSurfaceArea() { 
     return 2 * Math.PI * radius * radius + 2 * Math.PI * radius * h; 
    } 

但是現在說半徑(甚至r)返回一個錯誤「無法找到符號 - 可變半徑)不應該的符號被發現/宣告從Circle類?


我所試圖做的是使用一個單獨的Circle.java類計算圓柱體的體積。

因此,舉例來說,我至今對我circle.java以下

public class Circle { 
    public double radius; 

    public Circle(double r) { 
    radius = r; 
    } 

    public double circleArea() { 
     return Math.PI * radius * radius; 
    } 

    public double circleCirumference() { 
     return Math.PI * 2 * radius; 
    } 
} 

現在,這裏是問題的開始。當使Cylinder類我開始:

public class Cylinder extends Circle { 

如果是這樣,總體來說,我有:

public class Cylinder extends Circle { 
    public Circle base; 
    public double height; 

    public Cylinder(double r, double h) { 
    height = h; 
    base = new Circle(r); 
     } 

    public double getVolume() { 
    return base.circleArea * height; 
    } 
} 

不過,我把後得到一個錯誤:

public Cylinder(double r, double h) { 

指出:

構造函數類Circle中的不能應用於給定的類型; required:double;發現:noarguments;原因:實際的和正式的參數列表的長度不同」

有人可以把我在正確的方向我在做什麼錯

+0

爲什麼你們都使用合成與繼承?這裏就夠了(如果有疑問,請選擇合成)。 –

+0

@dystroy「我不知道如何初始化父類作品」是我的猜測。 – millimoose

回答

0

問題1:??在

問題您程序沒有默認的構造函數存在於你的Circle中當創建Cylinder對象時,它尋找Circle中的默認構造函數

如果你修改你的Circle如下所示它將工作

class Circle {  
     public Circle(){ 

     } 
} 

問題2

有「鹼。circleArea」方法只存在於圈,你又忘了 「()」

base.circleArea需要改變,以base.circleArea().

public class Cylinder extends Circle { 

    public double getVolume() { 
    return base.circleArea() * height; 
    } 
} 

問題3

你的汽缸應該像下面。你已經因此不需要在氣缸內創建可變的圓形基座。

class Cylinder extends Circle { 

     public double height; 

     public Cylinder(double r, double h) { 
      super(r); 
     height = h; 
     } 

     public double getVolume() { 
     return circleArea * height; 
     } 
} 
1

Y你無意中調用超級構造函數,但沒有這樣的構造函數。

但是你有一個設計問題:你試圖同時使用組合和繼承。一個就足夠了。

使用繼承:

public class Cylinder extends Circle { 
    public double height; 

    public Cylinder(double r, double h) { 
    super(r); 
    height = h; 
    } 

    public double getVolume() { 
    return circleArea() * height; 
    } 
} 

使用成分(almost always better):

public class Cylinder { 
    public Circle base; 
    public double height; 

    public Cylinder(double r, double h) { 
    height = h; 
    base = new Circle(r); 
    } 

    public double getVolume() { 
    return base.circleArea * height; 
    } 
} 
2

那是因爲你的構造函數的第一個電話是隱含super()

報價從Java Tutorials

如果構造函數沒有顯式調用超類構造函數,那麼Java編譯器會自動將調用插入到超類的無參構造函數中。如果超類沒有沒有參數的構造函數,那麼你會得到一個編譯時錯誤。

你需要做一個參數的構造函數在Circle類或更改Cylinder構造是這樣的:

public Cylinder(double r, double h) { 
    super(r); 
    height = h; 
} 
1

使用繼承時,你不需要在Java中明確base場。初始化基類(或「超」),您需要使用super語句在子類的構造函數:

class Circle { 
    public Circle(double radius) { 
     // … 
    } 
} 

class Cylinder extends Circle { 
    public Cylinder(double radius, double height) { 
     super(radius); // calls the parent class constructor 
     // … 
    } 
} 

或者,你可以使用組成代替繼承 - 可能是在這一個更好的設計案例:

class Circle { 
    public Circle(double radius) { /* … */ } 
} 

class Cylinder { // no `extends` here 
    public Cylinder(Circle base, double height) { 
     // … 
    } 

    public Cylinder(double radius, double height) { 
     this(new Circle(radius)); // calls the above constructor 
     // … 
    } 
} 

(我省略瑣碎的任務和領域爲簡潔上面的代碼示例中)