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

时间:2014-12-09 06:16:44

标签: 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();
    }
}

如果您查看上面的代码,就会发现我无法从classB扩展classA,但我可以从InnerPublicClass扩展InnerPrivateClass

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

1 个答案:

答案 0 :(得分:6)

InnerPublicClassGenericTestClass中定义,因此可以访问此类的所有私有成员,其中包括内部类TestingInnerPrivateClass。因此,它可以扩展TestingInnerPrivateClass

以下是JLS 6.6.1的相关引用:

  

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