为什么私有基类构造函数导致“隐式超级构造函数不可见”

时间:2015-07-03 11:49:54

标签: java inheritance constructor private

如果构造函数不在Java中继承,为什么我会得到编译错误(默认构造函数不能看到隐式超级构造函数A()。必须定义一个显式构造函数)?

class A {
    private A() {
    }
}

public class B extends A {

}

UPD。我知道在隐式B构造函数中调用super()。但我不明白为什么它无法使用super()访问私有构造函数。那么,如果我们只有私有构造函数,那么事实上的类是final

7 个答案:

答案 0 :(得分:10)

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

请记住,构造函数始终调用A。 所以在这里,super()的隐式无参数构造函数无法调用B构造函数。

答案 1 :(得分:3)

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

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

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

此外,您可能会认为private构造函数的用途是什么。 private构造函数主要用于您不希望任何外部类中的其他人在您的类上调用new()时。因此,在这种情况下,我们提供了一些getter()方法来提供类object。在该方法中,您可以创建/使用您的类的现有对象&从那个方法中返回。

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

答案 2 :(得分:1)

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

现在,如果你将这个构造函数设置为超类私有,那么上面提到的概念就会失败。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

可以工作

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

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

或删除私有A(),默认为public A(), 除非你有另一个构造函数

class A {

}

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

答案 5 :(得分:0)

B的实例创建了类A的实例,因此如果B实现非默认约束,super(...)必须调用A。因此构造函数应为protected B能够调用super(...)

答案 6 :(得分:0)

public class B extends A {

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

因此,您应该定义一个可由类B

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