如何解析'隐式超级构造函数classA()是不可见的。必须显式调用另一个构造函数'?

时间:2010-10-11 07:42:30

标签: java constructor

我正在使用具有私有构造函数的类'ClassA'。

public final class ClassA{
  private ClassA{
  }

  public static void main(String[] arg) }{
  ;
  ;
  ;
  }
}

现在,我正在扩展课程'ClassA'[最终关键字在此之前被移除]

public class ClassB extends ClassA{
     public static void main(String[] arg) }{
      ;
      ;
      ;
      }

}

现在,我得到了Implicit super constructor classA() is not visible. Must explicitly invoke another constructor。它是什么意思以及如何解决这个问题?

注意我无法更改ClassA构造函数的访问说明符。

5 个答案:

答案 0 :(得分:7)

将ClassA的构造函数可见性从private更改为protected

构造函数总是从调用超类构造函数开始。如果构造函数显式包含对超类构造函数的调用,则使用该构造函数。否则暗示无参数构造函数。如果无参数构造函数不存在或子类不可见,则会出现编译时错误。

答案 1 :(得分:7)

我建议使用合成而不是继承(也许这就是ClassA的设计者用于课程用法的内容。例如:

public class ClassB {
   private ClassA classA;

   ClassB() {
       // init classA
       ...
   }

   public ClassA asClassA() {
       return classA;
   }

   // other methods and members for ClassB extension
}

您可以将方法从ClassB委托给ClassA或覆盖它们。

答案 2 :(得分:3)

Java将隐式创建一个没有ClassB参数的构造函数,它将调用super()。在你的情况下,ClassA中的构造函数是不可见的,因此你得到的错误。将可见性更改为public或protected将解决错误。

答案 3 :(得分:2)

private ClassA{}更改为protected ClassA{}听起来像是一个很好的解决方案。

父构造函数总是在子类中调用:隐式或不隐式。因此,您的ClassB定义相当于

public ClassB extends ClassA {
    public ClassB() {
        super();
    }

    // all other methods you have go here...
}

如果ClassA的唯一构造函数是私有的,则无法从ClassB调用它。

答案 4 :(得分:0)

因为儿子必须调用父亲的构造函数才能完成父参数的初始化。

现在 ClassA 是最终类,它的构造函数是私有的。如果 ClassB 扩展了 ClassA。

  1. 删除ClassA的final
  2. 调用 super() 或 super(**),将 private 更改为 public/protected,或为 ClassA 添加构造函数
public class ClassA {
    private ClassA() {
    }

    // add
    protected ClassA(String str) {
    }

    public void display() {
        System.out.println("Father's display");
    }
}
class ClassB extends ClassA {
    public ClassB() {
        // add
        super(null);
    }

    public void display() {
        System.out.println("Son's display");
    }
}