为什么私有基础 class 构造函数会导致 "Implicit super constructor is not visible"

Why does a private base class constructor result in "Implicit super constructor is not visible"

如果 Java 中的构造函数不继承,为什么会出现编译错误(隐式超级构造函数 A() 对于默认构造函数不可见。必须定义显式构造函数)?

class A {
    private A() {
    }
}

public class B extends A {

}

更新。我知道 super() 在隐式 B 构造函数中被调用。但我不明白为什么它不能使用 super() 访问私有构造函数。所以,如果我们只有私有构造函数,class 事实上是 final?

如果 B extends AB 必须有权访问 A 构造函数。

请记住,构造函数总是调用 super()。 所以这里,B的隐式无参数构造函数是不能调用A构造函数的。

在 Java 中,如果您创建 Child Class 的实例,则会隐式创建 Parent Class 实例。 因此,Child Class 构造函数应该对 Child Class 可见,因为它在第一个语句本身中使用 super() 调用 Parent Class 构造函数的构造函数。

因此,如果将 Parent Class 的构造函数更改为 privateChild Class 将无法访问它并且无法创建自己的任何实例,因此编译器在第一手只是根本不允许这样做。

但是如果你想在 Parent Class 中使用 private 默认构造函数,那么你需要在 Parent Class 中明确创建一个重载的 public 构造函数,然后在 Child class 构造函数,您需要使用 super(param) 调用 Parent Class 的 public 重载构造函数。

此外,您可能会想 private 构造函数有什么用。 private 构造函数主要用于当您不希望来自任何外部 class 的其他人在您的 class 上调用 new() 时。因此,在这种情况下,我们提供了一些 getter() 方法来提供 class 的 object。在该方法中,您可以 create/use 您的 class 的现有对象 & return 它来自那个方法。

例如。 Calendar cal = Calendar.getInstance();。这实际上构成了 Singleton 设计模式的基础。

重要的一点是理解任何构造函数的第一行都是调用超级构造函数。如果您自己不调用超级构造函数,编译器会通过在幕后插入 super() 来缩短您的代码。

现在,如果您将超类中的构造函数设为私有,上述概念将失败。

可以工作

class A {
    private A() {
    }
    public A(int i){
    }
}

public class B extends A {
    private A(){
        super(10);
    }
}

或者去掉私有的A(),默认为publicA​​(), 除非你有另一个构造函数

class A {

}

public class B extends A {
    private A(){
        super();
    }
}

class B 的实例创建 class A 的实例,因此 B 必须调用 super(...) 如果 A 实现非默认构造函数。所以构造函数应该是 protected 因为 B 能够调用 super(...)

public class B extends A {

/*
* The default constructor B means
* public () B {super();}
*/
   public B() {
   }
}

所以你应该定义一个可以被classB

访问的构造函数
  1. 您可以更改父构造函数的访问修饰符
  2. 或者您可以在父 class 中定义其他构造函数,可由 class B 访问并调用该构造函数。

您的 class B 有一个默认构造函数 B() - 因为您没有明确定义任何其他构造函数。 该构造函数隐式调用其超级构造函数 A()。 但是你已经明确地让 class A 私有,所以你已经明确声明没有其他 class,包括 B,可以访问它。