2014-11-04 4 views
0

Я читал около class fromal parameters и возникает вопрос, почему следующий код плохо сформирован?Внутреннее классное строительство в Java

класс A:

package org.gradle; 

public class A extends B.Inner{ 

    public A(B s){ 
     s.super(new B()); //error 
     s.super();  //OK 
    } 
} 

класс B:

package org.gradle; 

public class B{ 

    public class Inner{ 
    } 
} 

Ключевая часть того, что было сказано есть:

Конструктор незакрытом внутреннего класса членов неявно объявляет в качестве первого формального параметра переменную, представляющую немедленно ограждающих экземпляр класса

Итак, я полагаю, что, кроме конструктора по умолчанию, мы должны иметь конструктор со следующей подписью:

Inner(B b); 

Почему нет?

ответ

1

«Дополнительный» параметр эффективно скрыт от вас - как при его объявлении, так и при его выполнении. При выполнении этого, вы обеспечиваете значение по-другому - в вашем случае, с помощью s:

s.super(); 

Вот проходящее s как скрытый дополнительный аргумент к B.Inner конструктора. Синтаксис для всего этого немного странный - и я лично попытался бы избежать использования внутренних классов в подобной ситуации ... они просто становятся странными очень быстро. Обычно я предпочитаю статические вложенные классы, и если мне нужен внутренний класс, он почти всегда является приватным. Подклассификация внутреннего класса, объявленного в другом классе верхнего уровня, является странной ситуацией, ИМО.

+0

Спасибо, но не совсем понятно, почему я не могу явно вызвать этот конструктор, скажем, следующим образом: http://ideone.com/igXgCM? Может ли JLS предоставить ограничения, которые я потерял? –

+1

@ St.Antario: Это не то, как работают внутренние классы - вы должны использовать 'new B(). Вместо этого вместо этого нужно использовать новый Inner(). Вы не должны думать об этом как о дополнительном параметре - вы должны думать об этом как о экземпляре окружающего класса, используемого для построения экземпляра внутреннего класса. –

+0

Указывает ли JLS это экскрементно? –

1

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

variable representing the immediately enclosing instance of the class - неявный параметр, и он передается конструктору с использованием специального синтаксиса.

Смежные вопросы