我正在尝试用Java实现一个程序,它有一个父类RoundShapes和两个孩子Sphere和Cone。当我尝试在我的子类中创建一个构造函数时,它给出了一个错误,即构造函数不能应用于该给定类型。 然后我研究并发现了一个关于继承的教程,他们使用了一个超级构造函数。我尝试使用它,但现在它给了我一个错误,在超级构造函数之前不能使用半径?!我没有在构造函数的范围内,所以我不确定这是什么表明。
import java.util.*;
public class Miller_A03Q4 {
public static void main(String[] args) {
Sphere sphere1 = new Sphere();
RoundShape cone1 = new RoundShape();
RoundShape.setRadius(4);
}
public static class RoundShape{
double area;
double volume;
double radius;
String shape;
//
public RoundShape(double r){
radius = r;
}
// set radius method
public void setRadius(double r){
radius = r;
}
// get area method
public double getArea(){
return area;
}
// get volume
public double getVolume(){
return volume;
}
}
// sphere is-a from roundshape
static class Sphere extends RoundShape{
public Sphere(double r){
radius = r;
}
//set area
public void setArea(){
area = 4 * Math.PI * radius * radius;
}
// get volume
public void setVolume(){
volume = (4/3) * Math.PI * radius * radius * radius;
}
}
//cone class is-a from roundshape
class Cone extends RoundShape{
double height;
//set area
public void setArea(){
area = Math.PI * radius * (radius + Math.sqrt( height * height + radius * radius));
}
// cone volume
public void setVolume(){
volume = Math.PI * radius * radius * (height/3);
}
}
}
答案 0 :(得分:0)
所有构造函数在调用super()
调用自己的构造函数之前调用其超类的构造函数。如果您忽略对super()
的呼叫,则会隐式插入呼叫。
在你的情况下,你没有在超类中指定一个带有0个参数的构造函数,因此Java无法推断super()
的参数应该是什么,因此它会抛出编译器错误并要求你要指定那些参数应该是什么。
要修复代码,您有2个选项
RoundShape
中创建一个带有0个参数的构造函数。super()
。选项#2看起来像这样。请注意,对super()
的调用必须在任何其他语句之前。
public Sphere(double r) {
super(r);
// other statements here
}
答案 1 :(得分:0)
感谢本论坛的建议和一些额外的研究,我能够纠正我的计划。我在发布的原始代码中也有几个运行时错误,所以我想提供更新的代码,以防像我这样的新手偶然发现。
一些专业是:1。我不需要包含setArea()和setVolume()方法,而是将公式放在getArea()和getVolume()中。 2.我不需要在构造函数中包含体积和面积。 3.我还包含了一个toString()方法,因此我可以访问我的数据。
我确信这远不是最好和最有效的代码,但似乎有效。我在下面提供了我的新代码和更新代码以供参考。感谢所有容忍我愚蠢问题的人!
import java.util.*;
public class Miller_A03Q4 {
public static void main(String[] args) {
Sphere sphere1 = new Sphere(4);
Cone cone1 = new Cone(3,7);
System.out.println(cone1.toString());
System.out.println(sphere1.toString());
cone1.setHeight(10);
sphere1.setRadius(3);
System.out.println(cone1.toString());
System.out.println(sphere1.toString());
}
// parent Roundhape
public static class RoundShape{
double area;
double volume;
double radius;
String shape;
double height;
//
//constructor
public RoundShape(double r){
radius = r;
}
// set radius method
public void setRadius(double r){
radius = r;
}
// get area method
public double getArea(){
return area;
}
// get volume
public double getVolume(){
return volume;
}
//toString
public String toString(){
return "Shape: " + shape +" Radius: " + radius + " Height: "
+ height+ " Volume: " + this.getVolume() + " Area: "+ this.getArea();
}
}
// sphere is-a from roundshape
public static class Sphere extends RoundShape{
//constructor
public Sphere(double r){
super(r);
radius = r;
shape = "sphere";
}
//get area
public double getArea(){
area = 4 * Math.PI * radius * radius;
return area;
}
// get volume
public double getVolume(){
volume = 4 * Math.PI * (radius * radius * radius)/3;
return volume;
}
}
//cone class is-a from roundshape
public static class Cone extends RoundShape{
// cone with radius and height
public Cone(double r, double h){
super(r);
radius = r;
height = h;
shape = "cone";
}
//set height
public void setHeight(double h){
height = h;
}
// get area
public double getArea(){
area = Math.PI * radius * (radius + Math.sqrt( height * height + radius * radius));
return area;
}
// get volume
public double getVolume(){
volume = Math.PI * radius * radius * (height/3);
return volume;
}
}
}