如何解决“隐式超构造函数类A()”不可见。必须显式调用另一个构造函数'?

2022-09-04 19:27:42

我有一个类“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

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


答案 1

将类 A 的构造函数可见性从 更改为 。privateprotected

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


答案 2

我会建议组合而不是继承(也许这就是设计者对类使用的意图。例:ClassA

public class ClassB {
   private ClassA classA;

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

   public ClassA asClassA() {
       return classA;
   }

   // other methods and members for ClassB extension
}

可以将方法从 委托给或重写它们。ClassBClassA