Java:访问内部类'继承的受保护成员

时间:2010-12-13 19:33:07

标签: java inner-classes protected

我有一个类CircularBuffer,它扩展了AbstractList。

我有第二个类ExponentialUnrolledLinkedList,它有一个扩展CircularBuffer的内部类Node。

我可以在ExponentialUnrolledLinkedList(在Node之外)访问Node实例的一些受保护成员,即使它们是在Node之外声明的(例如,在CircularBuffer中声明的受保护大小字段),但不是声明的受保护字段modCount AbstractList中。

我可以从内部类定义本身访问modCount,但不能从封闭类中访问。

例如

public class ExponentialUnrolledLinkedList<E> extends AbstractSequentialList<E> {
     ...
     private Node last = new Node(1){
          protected int firstIndex(){
               return 0;
          }
     };

     private class Node extends CircularBuffer<E> {
          ...
          private void dirty(){
               this.modCount++; // works
          }
          protected int firstIndex(){
               return store.length;
          }
     }

     public int size(){
          return last.firstIndex() + last.size; // access to last.size works
     }

     public boolean add(E item){
          ...
          last.modCount++; // can't access modCount, have to call last.dirty()
          ...
          return true;
     }
}

为什么我可以在内部类和outter类中访问大小,但我只能访问内部类中的modCount?我认为外部类可以访问其内部类可以访问的所有内容(显然是错误的)。显然,一些受保护的成员可以访问,但有些则不可访问。我通过在(私有)方法中包装modCount增量并调用该方法来解决这个问题,但这看起来很不优雅。

1 个答案:

答案 0 :(得分:0)

CircularBuffer.size的可见性是什么? (它不是AbstractList或其超类的成员。)

您无法访问CircularBuffer.modCount,因为它的可见性在AbstractList类中是“受保护的”。这意味着只能在自己的包中以及在另一个包(例如CircularBuffer)中通过其类的子类访问该成员。