2014-12-24 3 views
0

У меня есть следующий сценарий - класс, который содержит внутренний абстрактный класс:Создать анонимный класс, расширяющий внутренний абстрактный класс

class A { 

    private int Afield; 
    public void Amethod() { ... } 

    protected abstract class InnerOfA { 
     ... 
     protected abstract void doSomething(); 
    } 
} 

Теперь внутри методу другого класса, я хочу, чтобы создать анонимный класс простирающихся InnerOfA:

class B { 
    public void Bmethod(A instanceOfA) 
    { 
     A.InnerOfA instance = instanceOfA.new InnerOfA() 
     { 
      @Override 
      protected void doSomething() 
      { 
       // Here I want to use the private fields and methods of A. 
      } 
     } 
    } 
} 

Но по какой-то причине (я не понимаю) я не могу использовать Afield и Amethod внутри отключением doSomething. Почему это происходит? Анонимный экземпляр должен по-прежнему находиться внутри instanceOfA и, следовательно, должен иметь доступ к его внутренним элементам.

+0

Перечитайте определение 'private'. «B» (и его анонимные внутренние классы) не должны иметь доступ к «частным» членам. –

ответ

3

Частные поля/методы могут быть доступны только внутри класса они объявили (подклассов не достаточно, чтобы получить доступ к private).

1

если определить

public void Bmethod(final A instanceOfA) 

можно назвать

@Override 
protected void doSomething() 
{ 
    instanceOfA.Amethod(); 
} 

, но вы не можете получить доступ к Afield, потому что это частная