четверг, 1 декабря 2011 г.

Конструкции .this и .new

Если вам понадобится получить ссылку на объект внешнего класса, запишите имя внешнего класса, за которым следует точка, а затем ключевое слово this. Полученная ссылка автоматически относится к правильному типу, известному и проверяемому на стадии компиляции, поэтому дополнительные издержки на стадии выполнения не требуются. Следующий пример показывает, как использовать конструкцию .this:

public class Outer{
    void f(){ System.out.println("Outer.f()"); }
    public class Inner{
        public Outer outer(){
            return Outer.this;
        }
    }
    public Inner inner(){
        return new Inner();
    }
    public static void main(String[] args){
        Outer o = new Outer();
        Outer.Inner oi = o.inner();
        oi.outer().f();
    }
}
результатом будет:
Outer.f()

Иногда бывает нужно приказать другому объекту создать объект одного из его внутренних классов. Для этого перед .new указывается ссылка на другой объект внешнего класса:
public class Outer{
    public class Inner{}
    public static void main(String[] args){
        Outer o = new Outer();
        Outer.Inner oi = o.new Inner();
    }
}
При создании объекта внутреннего класса указывается не имя внешнего класса Outer, а имя объекта внешнего класса. Это также решает проблему видимости имен для внутреннего класса, поэтому мы не можем использовать запись вида o.new Outer.Inner().
Невозможно создать объект внутреннего класса, не имея ссылки на внешний класс. Но если создать вложенный класс(статический внутренний класс), то ссылка на объект внешнего класса не нужна.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.