2014-12-09 2 views
3
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.Почему частный класс с частным конструктором может быть подклассифицирован?

Я не могу понять, как класс, который является частным и имеет частный конструктор, может быть подклассифицирован, когда он является внутренним классом.

ответ

6

InnerPublicClass определяется внутри GenericTestClass и поэтому имеет доступ ко всем частным членам этого класса, который включает внутренний класс TestingInnerPrivateClass. Поэтому он может распространяться на TestingInnerPrivateClass.

А вот отношение цитата из JLS 6.6.1:

если член или конструктор объявлен частным, то доступ разрешен, если и только если оно происходит в теле класса верхнего уровня (§7.6), что включает объявление участника или конструктора.

+0

Хорошо, я понял. Простое и эффективное объяснение. Благодарю. –