出现错误消息,编译派生类

时间:2019-05-10 20:39:54

标签: java inheritance constructor

当我尝试编译派生类IntSearchTree时,错误消息

IntSearchTree.java:3: error: constructor IntBinTree in class IntBinTree
cannot be applied to given types;

IntSearchTree(int node, IntSearchTree left, IntSearchTree right) {

required: int,IntBinTree,IntBinTree

found: no arguments

reason: actual and formal argument lists differ in length

1 error

,出现。

以下代码显示了基类最重要的几行:

 class IntBinTree {
   int node;
   IntBinTree left;
   IntBinTree right;

   IntBinTree(int node, IntBinTree left, IntBinTree right) {
     this.node = node;
     this.left = left;
     this.right = right;
   }
 }

以及派生类最重要的几行:

 class IntSearchTree extends IntBinTree {
 IntSearchTree left;
 IntSearchTree right;

   IntSearchTree(int node, IntSearchTree left, IntSearchTree right) {
     this.node = node;
     this.left = left;
     this.right = right;
   }
 }

我试图通过为基类中的构造函数提供private修饰符来解决该问题

 private IntBinTree(int node, IntBinTree left, IntBinTree right) {...}

,但是编译错误消息是相同的。

第一个问题是,如何以一种在基类中可见但在派生类中不可见的方式定义构造函数?

第二个问题是,即使我使用了private修饰符,为什么基类构造函数在派生类中仍然可见?

2 个答案:

答案 0 :(得分:0)

您需要一个无参数的构造函数。

将其放入您的IntBinTree类:

IntBinTree()
{
}

或者您也可以在IntSearchTree类中使用它:

IntSearchTree(int node, IntSearchTree left, IntSearchTree right) {
     super(node,left,right);
  }

当超类中没有no-args构造函数时,您需要在子类中显式调用要使用的构造函数。这个super()将调用从node, left, right中提取IntBinTree()的构造函数。

答案 1 :(得分:0)

我可以看到该实现有两个问题。

  1. 您可能不想在派生类中再次声明 left right 字段-这不会引起编译错误,但是可以肯定会导致一些问题以后再调试。
  2. 创建派生类需要调用其父类的构造函数-在这种情况下,您可以在当前构造函数中调用super(node, left, right)super()。请记住,默认情况下,java为您创建的任何类创建公共的无参数构造函数。