1

编辑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类中的构造函数Circle不能应用于给定类型;required:double; 发现:noarguments; 原因:实际参数列表和形式参数列表的长度不同。”

有人可以将我推向正确的方向吗?我究竟做错了什么?

4

4 回答 4

2

发生这种情况是因为您的构造函数的第一次调用是隐式的super()

引用Java 教程

如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。

你需要在你的Circle类中创建一个无参数的构造函数,或者像这样改变你的Cylinder构造函数:

public Cylinder(double r, double h) {
    super(r);
    height = h;
}
于 2013-10-24T14:43:16.550 回答
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;
  }
}

使用组合(几乎总是更好):

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;
  }
}
于 2013-10-24T14:42:34.180 回答
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
        // …
    }
}

(为简洁起见,我在上面的代码示例中省略了琐碎的赋值和字段。)

于 2013-10-24T14:45:52.347 回答
0

问题1:

您的程序中的问题是您的 Circle 中没有默认构造函数。在创建 Cylinder 对象时,它会在 Circle 中寻找默认构造函数。

如果您按以下方式修改您的圈子,它将起作用

 class Circle {     
      public Circle(){

      } 
 }

问题 2

“base.circleArea”方法只存在于 Circle 中,你忘记了“()”

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;
      }
 }
于 2013-10-24T14:42:13.947 回答