Java中静态内部类的私有构造函数
我是Java新手,我发现我们不能对构造函数为Java中静态内部类的私有构造函数,java,inheritance,constructor,static,Java,Inheritance,Constructor,Static,我是Java新手,我发现我们不能对构造函数为private的类进行子类化。然而,我遇到了这个问题,它创建了一个子类,其超类的构造函数是私有的 简言之: 这项工作: class A { static class B { private B() { out.println("Constructor of B"); } } static class C extends B { C() {
private
的类进行子类化。然而,我遇到了这个问题,它创建了一个子类,其超类的构造函数是私有的
简言之:
这项工作:
class A {
static class B {
private B() {
out.println("Constructor of B");
}
}
static class C extends B {
C() {
out.println("Constructor of C");
}
}
}
但这并不是:
class B {
private B() {
out.println("Constructor of B");
}
}
class C extends B {
C() {
out.println("Constructor of C"); // No default constructor available for super class
}
}
有人能帮我理解这里发生了什么吗?关于
private
有一个微妙之处,你可能还没有探索过。发件人:
否则,该成员或构造函数被声明为私有,并且只有当且仅当它发生在包含该成员或构造函数声明的顶级类型(§7.6)的主体内时,才允许访问
所以暂时忘记继承,这意味着顶级类型中的所有代码,包括嵌套类型中的代码,都可以访问同一顶级类型中声明的所有私有成员,包括嵌套类型中声明的成员
下面是一个例子:
公共类顶级{
私有静态void foo(){
}
嵌套的静态类1{
私有静态无效条(){
}
}
嵌套的静态类2{
私有静态void callFooBarFromNested(){
foo();
Nested1.bar();
}
}
私有静态void callFooBarFromTopLevel(){
foo();
Nested1.bar();
}
}
从这里开始,只需一小步就可以看出为什么第一个示例是好的,C
中的无参数构造函数需要链接到B
中的无参数构造函数,当它们都嵌套在同一个顶级类中时,可以这样做,但并非如此。我们不能将构造函数为private的类划分为子类:我认为这不太准确。它应该是…没有子类可以访问的构造函数。在这种情况下(工作代码),C
可以访问B