【问题标题】:How to resolve 'Implicit super constructor classA() is not visible. Must explicitly invoke another constructor'?如何解决“隐式超级构造函数 classA() 不可见。必须显式调用另一个构造函数'?
【发布时间】:2010-10-11 07:42:30
【问题描述】:

我有一个具有私有构造函数的类“ClassA”。

public final class ClassA{
  private ClassA{
  }

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

现在,我正在扩展类 'ClassA' [在执行此操作之前删除了 final 关键字]

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

}

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

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

【问题讨论】:

  • 我以为您注意到您无法更改 ClassA 构造函数的访问权限...
  • @Bivas:是的,但除了将私有更改为公共/受保护之外似乎没有人回答
  • 我做了(组合解决方案):-)

标签: java constructor


【解决方案1】:

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

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

【讨论】:

  • 由于所有答案都是关于更改访问说明符,因此我接受了先出现的那个。 :)
【解决方案2】:

我建议使用组合而不是继承(也许 ClassA 的设计者打算使用类。示例:

公共类B类{ 私人A类A类; 类B(){ //初始化类A ... } 公共类 A asClassA() { 返回A类; } // ClassB 扩展的其他方法和成员 }

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我无法将构造函数更改为公共
    【解决方案4】:

    private ClassA{} 更改为protected ClassA{} 听起来是个不错的解决方案。

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

    public ClassB extends ClassA {
        public ClassB() {
            super();
        }
    
        // all other methods you have go here...
    }
    

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

    【讨论】:

      【解决方案5】:

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

      现在 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");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-17
        • 2020-09-29
        • 2014-11-06
        • 2023-04-08
        • 1970-01-01
        • 2013-03-03
        • 2014-10-02
        • 2011-07-26
        相关资源
        最近更新 更多