2013-07-17 4 views
4

Когда я проходил через this статью, в разделе Частные члены суперкласса, я видел эту линиюНаследование Вложенные классы в Подкласс

Вложенный класс имеет доступ ко всем закрытым членам его ограждающих класс - оба поля и методы. Следовательно, открытый или защищенный вложенный класс , унаследованный подклассом, имеет косвенный доступ ко всем частным членам суперкласса .

Мой вопрос заключается в том, как мы можем получить непосредственный доступ к Nested классу Base в Derived (как мы можем получить доступ к любому public, protected поля)?

и

, если есть способ, как можно Derived доступ p который является частным полем Base через Nested?

public class Base { 

    protected int f; 
    private int p; 

    public class Nested { 

     public int getP() { 
      return p; 
     } 
    } 
} 

class Derived extends Base { 

    public void newMethod() { 
     System.out.println(f); // i understand inheriting protected field 

     // how to access the inherited Nested class here? and if accessed how to retrieve 'p' ? 
    } 

} 

Заранее благодарю за ваше время и усилия в этой теме!

ответ

3
Base.Nested theClassBro= new Base.Nested(); 

Или для производного класса, это должно работать:

Derived.Nested theClassBro= new Derived.Nested(); 

Я не уверен, что если вам нужно использовать супер ключевое слово или не

+3

Обратите внимание, что 'Nested' зависит от экземпляра' Base', поэтому экземпляр «Вложенный» может получить доступ к материалам «Base». «Базовый» экземпляр подразумевается на 'new Base.Nested()'. I. e. вы можете написать: 'Base myBase = new Base(); Base.Nested theClassBro = myBase.new Nested(); ' –

1

нестатический внутренний класс всегда требуется вложенный экземпляр класса, в который он вложен. Внутри кода, определенного в классе Base или классе Derived (поскольку он наследует внутренний класс), вы можете просто написать

Nested nested = new Nested(); 

Чтобы создать новый экземпляр. Затем вы можете вызвать метод getP() на вложенной ссылке, чтобы получить значение частного значения p. Это значение является частью экземпляра класса Base, который включает экземпляр Nested.

Поскольку внутренний класс является общедоступным, код, определенный вне Base или Derived, также может создавать экземпляр. Но для этого требуется прилагаемый экземпляр Derived или Base. Java имеет специальный синтаксис для этого, где вы вызываете новый оператор на экземпляр окружающего класса. Так за пределами базы или производными вы можете сделать:

Base base = new Base(); 
Base.Nested baseNested = base.new Nested();  
Derived derived = new Derived(); 
Derived.Nested derivedNested = derived.new Nested(); 
Base.Nested d = derivedNested; 

Также можно импортировать Base.Nested, так что вы можете написать:

Base base = new Base(); 
Nested baseNested = base.new Nested(); 
Derived derived = new Derived(); 
Nested derivedNested = derived.new Nested(); // Base.Nested reference 

Это хорошо знать этот синтаксис, но я чувствую код как правило, чище (проще понять, лучше инкапсулировать), если только вмещающему классу разрешено создавать новые экземпляры внутреннего класса. Вы также можете использовать статический вложенный класс, если вам нужен класс, который логически относится только к Base, но не нуждается в закрывающем экземпляре.

0

Как вы знаете, Nested может быть создан только в том случае, если имеется класс экземпляра класса, содержащий определение класса Nested, в нашем случае это класс Enclosing.Чтобы иметь доступ к частным членам класса Enclosing путем наследования его класса Nested, нам необходимо предоставить конструктору класса Derived, содержащий экземпляр, содержащий Enclosing.Nested. Следующий код должен быть понятнее. Я изменил имена переменных и классов из исходного примера для лучшего понимания:


public class Enclosing { 

    protected int protectedMember = 3; 
    private int privateMember = 7; 

    public class Nested { 

     public int getPrivate() { 
      return privateMember; 
     } 

     public int getProtected() { 
      return protectedMember; 
     } 

    } 

} 

class Derived extends Enclosing.Nested { 

    //Provide the enclosing instance that contains Enclosing.Nested 
    public Derived() { 
     new Enclosing().super(); 
    } 

    //Access protected member of Enclosing class 
    public void accessProtectedMember() { 
     System.out.println(getProtected()); 
    } 

    //Access private Member of Enclosing class 
    public void accessPrivateMember() { 
     System.out.println(getPrivate()); 
    } 

} 

public class Test { 
    public static void main(String... args) { 
     Derived derived = new Derived(); 
     derived.accessProtectedMember(); 
     derived.accessPrivateMember(); 
    } 
} 
Смежные вопросы