如何使用circle.java计算圆柱体的getVolume。 [2班]

时间:2013-10-24 14:38:13

标签: java geometry

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;原因:实际和正式的参数列表长度不同。“

有人能把我推向正确的方向吗?我做错了什么?

4 个答案:

答案 0 :(得分:2)

这是因为你构造函数的第一次调用是隐式super()

来自Java Tutorials

的引用
  

如果构造函数没有显式调用超类构造函数,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;
      }
 }