为什么私有构造函数的私有内部类可以被分类?

Nic*_*Div 3 java inheritance

class ClassA
{    
    private ClassA() 
    {
    }        
}

class ClassB extends ClassA
{
    //here we will get a compiler error that cannot extend a class with private constructor
}

public class GenericTestClass 
{        
    private class TestingInnerPrivateClass
    {    
         private TestingInnerPrivateClass() 
         {
         }

        public void display()
        {
            System.out.print("Test");
        };       
    }

    public class InnerPublicClass extends TestingInnerPrivateClass
    {
        //here i am able to extend a private class
    }

    public static void main(String[] args)
    {
        GenericTestClass genericTestClass = new GenericTestClass();
        GenericTestClass.InnerPublicClass innerPublicClassInstance = genericTestClass.new InnerPublicClass();
        innerPublicClassInstance.display();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你看一下上面的代码,你可以看到,我不能够延长classBclassA,但我能延长InnerPublicClassInnerPrivateClass.

我无法理解私有类和私有构造函数的类是如何在内部类时被子类化的.

Era*_*ran 6

InnerPublicClass在内部定义GenericTestClass,因此可以访问此类的所有私有成员,包括内部类TestingInnerPrivateClass.因此它可以扩展TestingInnerPrivateClass.

以下是JLS 6.6.1的相关引用:

如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.