【问题标题】:Inheritance classes (Java), explicit constructor error message继承类 (Java),显式构造函数错误消息
【发布时间】:2015-06-15 05:08:15
【问题描述】:

所以我正在尝试学习继承类。

首先我创建了一个名为 Box 的类来计算盒子的面积。

然后我创建了一个 TestBox 类,在其中我创建了一个名为 fedEx 的盒子对象。

盒子类:

public class Box {
    private String boxName;

    public void calculateArea(int length, int width) {
        System.out.println("Area of " + getBoxInfo() + (length * width));
    }

    public Box(String boxName) {
        this.boxName = boxName;
    }

    public String getBoxInfo() {
        return boxName;
    }
}

TestBox 类:

public class TestBox {

    public static void main(String[] args) {

        Box fedEx = new Box("fedEx");
        fedEx.calculateArea(23, 2);
    }
}

到目前为止,如果我运行此代码,一切正常,并且我的打印屏幕显示 联邦快递 46 号区域

所以现在我去创建一个新的类,叫NewBox,并用“extends”继承Box类的方法,这个类是用来计算体积的

NewBox 类:

public class NewBox extends Box {

    public void calculateVolume(int length, int width, int height) {
        System.out.println("Volume = " + (length * width * height));
    }
}

现在为了测试这一点,我在我的 TestBox 类中创建了一个名为 UPS 的新对象,现在我的 TestBox 类如下所示:

public class TestBox {

    public static void main(String[] args) {

        Box fedEx = new Box("fedEx");
        fedEx.calculateArea(23, 2);

        NewBox UPS = new NewBox("UPS");
        UPS.calculateArea(3, 2);
        UPS.calculateVolume(3, 2, 2);
    }
}

当我尝试运行此程序时,我收到以下错误消息:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The constructor NewBox(String) is undefined
    at day3.inheritence.TestBox.main(TestBox.java:10)

我使用 eclipse 作为我的 IDE。

我可以做些什么来修复我的代码,错误消息是什么意思?

【问题讨论】:

    标签: java inheritance compilation extends


    【解决方案1】:

    NewBox 必须有一个构造函数转发给父类的构造函数。试试这个:

    public class NewBox extends Box{ 
    
      public NewBox(String name) {
        super(name);
      }
    
      public void calculateVolume(int length, int width, int height){ 
        System.out.println("Volume = " + (length*width*height));
      }
    }
    

    【讨论】:

    • 所以这行得通,但我不明白为什么,你介意解释一下为什么行得通吗?
    • 在Java中,父类的构造函数不被子类继承。因此,您必须在子类上创建一个构造函数,然后告诉该构造函数调用父类上的构造函数。 “super”关键字是引用父类的内容。有关 super 关键字的更多信息,请参阅 docs.oracle.com/javase/tutorial/java/IandI/super.html
    【解决方案2】:

    在您的NewBox 类中添加以下内容。

    public NewBox(String name){
        super(name);
    }
    

    现在NewBox 变成了

    public class NewBox extends Box{
        public NewBox(String name){
            super(name);
        }
    
        public void calculateVolume(int length, int width, int height){
            System.out.println("Volume = " + (length*width*height));
        }
    }
    

    【讨论】:

      【解决方案3】:

      由于你的父类(Box)有一个参数化的构造函数,你的子类(NewBox)必须有一个参数化的构造函数,然后应该调用它的超级构造函数。所以在 NewBox 类中添加下面的构造函数

      public NewBox(String name){
         super(name)
      }
      

      【讨论】:

        【解决方案4】:

        我们先说default constructors。如果您自己不创建构造函数,则隐式声明默认构造函数。

        public class SomeClass {
            // field and method declarations to follow
        }
        

        如果你声明了一个构造函数,那么就没有默认构造函数;只有声明的构造函数。

        public class Box {
        
            private final String boxName;
        
            public Box(String boxName) {
                this.boxName = boxName;
            }
        }
        

        通过继承,如果子级隐式声明了默认构造函数,但父级确实没有具有类似签名的构造函数,则会发生编译时错误。

        更具体地说:

        如果隐式声明了默认构造函数,但超类没有可访问的构造函数(第 6.6 节),该构造函数不接受参数且没有 throws 子句,则会出现编译时错误。

        在您的情况下,添加 super 关键字,并将参数直接传递给父级。

        public class NewBox extends Box {
            public NewBox(String boxName) {
                super(boxName);
            }
        }
        

        作为另一个例子,Beta 类可以正常编译,因为 Alpha 声明了一个与默认构造函数签名匹配的构造函数,但 Delta 不会编译,因为 Gamma 没有匹配的构造函数。

        class Alpha {
            public Alpha() {
        
            }
        }
        
        class Beta extends Alpha {
        
        }
        
        class Gamma {
            private final int count;
        
            public Gamma(int count) {
                this.count = count;
            }
        }
        
        class Delta extends Gamma {
        
        }
        

        这可以通过向 `Gam 提供无参数构造函数来解决

        class Gamma {
            private final int count;
        
            public Gamma(int count) {
                this.count = count;
            }
        
            public Gamma() {
                count = 0;
            }
        }
        

        【讨论】:

          【解决方案5】:

          你的类 NewBox 应该是这样的

          public class NewBox extends Box{
          
              public NewBox(String boxName){
                 super(boxName);        
              }
          
              public void calculateVolume(int length, int width, int height){
                  System.out.println("Volume = " + (length*width*height));
              }
          }
          

          通过在您的TestBox 中写入NewBox UPS = new NewBox("UPS");JVM 期望在NewBox 中使用字符串作为参数的构造函数,但那里缺少它。因此,我们在 NewBox 中创建了一个以字符串为参数的构造函数,并在该构造函数中编写 super(boxName),表示调用父类的构造函数,此处为 Box。

          【讨论】:

            猜你喜欢
            • 2012-08-13
            • 2013-03-21
            • 2011-09-09
            • 2010-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-07
            • 1970-01-01
            相关资源
            最近更新 更多