Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中静态内部类的私有构造函数_Java_Inheritance_Constructor_Static - Fatal编程技术网

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() {

我是Java新手,我发现我们不能对构造函数为
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