2015-04-13 6 views
5

Я понимаю понятие класса верхнего уровня, который расширяет внутренний класс:высшего класса уровень расширения внутреннего класса

package pkg1; 
public class A { 
    public class B { 
    } 
} 

package pkg2; 
import pk1.A; 
public class C extends A.B { 
    public C() { 
     new A().super(); 
    } 
} 

Но я не могу понять, какой-либо реальный пример, который иллюстрирует это. Вот почему мы должны использовать такую ​​реализацию?

+0

Зачем использовать вложенные классы? [Docs] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) –

+0

Вы уверены, что это для Java? Потому что этот код не будет компилироваться. Java также не может распространяться на несколько классов. – Leon

+4

Для всех тех, кто говорит, что он не будет компилироваться: он делает, вложенный класс должен быть static tho. И для других, кто говорит, что наследование нескольких классов невозможно, это не так. И никто не говорит, что это так. – Zizouz212

ответ

3

То есть, почему мы должны использовать такую ​​реализацию?

Вы не должны. Если C должен создать свой собственный экземпляр-экземпляр, то он уже не будет семантически «внутренним».

Эта функция является более полезным, когда вы передаете ограничивающий экземпляр в, который ведет себя так же, как внутренний класс:

class C extends A.B { 
    C(A enclosing) { 
     enclosing.super(); // note: invokes a constructor 
    }      //  of the B superclass 
} 

(за исключением мы не можем использовать выражение создания экземпляра класса, как someA.new C() Мы. необходимо использовать new C(someA).)

Но если вам нужно использовать это, это, вероятно, означает, что вы запрограммировали себя в угол. B должен, вероятно, быть классом верхнего уровня или static с явно включенным «охватывающим экземпляром».

+0

@Claudio 'enclosing.super()' не вызывает конструктор 'enclosing', он вызывает конструктор суперкласса' B'. Так много путаницы по этому вопросу ... – Radiodef

+0

Вы правы. Виноват – Claudio