Java继承构造函数问题

时间:2016-07-17 23:09:59

标签: java inheritance constructor

我正在尝试用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);

    } 
}


}

2 个答案:

答案 0 :(得分:0)

所有构造函数在调用super()调用自己的构造函数之前调用其超类的构造函数。如果您忽略对super()的呼叫,则会隐式插入呼叫。

在你的情况下,你没有在超类中指定一个带有0个参数的构造函数,因此Java无法推断super()的参数应该是什么,因此它会抛出编译器错误并要求你要指定那些参数应该是什么。

要修复代码,您有2个选项

  1. RoundShape中创建一个带有0个参数的构造函数。
  2. 明确调用您在其中指定参数的super()
  3. 选项#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;
    }
}


}