EDIT2
对不起,别介意我刚刚添加了
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
中的构造函数
Circle
无法应用于给定类型;required:double
;发现:noarguments
;原因:实际和正式的参数列表长度不同。“
有人能把我推向正确的方向吗?我做错了什么?
答案 0 :(得分:2)
这是因为你构造函数的第一次调用是隐式super()
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。
您需要在Circle
课程中创建无参数构造函数,或者像这样更改Cylinder
构造函数:
public Cylinder(double r, double h) {
super(r);
height = h;
}
答案 1 :(得分:1)
你隐式调用没有参数的超级构造函数,但是没有这样的构造函数。
但是你有一个设计问题:你正试图同时使用组合和继承。一个就足够了。
使用继承:
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 :(得分: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
// …
}
}
(为简洁起见,我在上面的代码示例中省略了琐碎的赋值和字段。)
答案 3 :(得分:0)
问题1:
您的程序中的问题是您的Circle中没有默认构造函数。在创建Cylinder对象时,它会在Circle中查找默认构造函数。
如果你修改你的Circle如下,它将起作用
class Circle {
public Circle(){
}
}
问题2
只有Circle中存在“base.circleArea”方法,你忘了“()”
base.circleArea
需要更改为base.circleArea().
public class Cylinder extends Circle {
public double getVolume() {
return base.circleArea() * height;
}
}
问题3
你的气缸应如下所示。您已经扩展了圆圈,因此无需在Cylinder中创建变量Circle base。
class Cylinder extends Circle {
public double height;
public Cylinder(double r, double h) {
super(r);
height = h;
}
public double getVolume() {
return circleArea * height;
}
}