Как “object.new” работает? (Java имеет .new оператор?)

Я столкнулся с этим кодом сегодня при чтении Ускоренного GWT (Gupta) - страница 151.

public static void getListOfBooks(String category, BookStore bookStore) {
    serviceInstance.getBooks(category, bookStore.new BookListUpdaterCallback());
}
public static void storeOrder(List books, String userName, BookStore bookStore) {
    serviceInstance.storeOrder(books, userName,    bookStore.new StoreOrderCallback());
}

Что те новые операторы делают там? Я никогда не видел такой синтаксис, кто-либо может объяснить?

Кто-либо знает, где найти это в спецификации Java?

65
задан chickeninabiscuit 27 December 2011 в 06:30
поделиться

3 ответа

Это внутренние (вложенные нестатические) классы:

public class Outer {
  public class Inner { public void foo() { ... } }
}

Вы можете сделать:

Outer outer = new Outer();
outer.new Inner().foo();

или просто:

new Outer().new Inner().foo();

Причина в том, что Внутренний имеет ссылку на конкретный экземпляр внешнего класса. Позвольте мне привести более подробный пример этого:

public class Outer {
  private final String message;

  Outer(String message) {
    this.message = message;
  }

  public class Inner {
    private final String message;

    public Inner(String message) {
       this.message = message;
    }

    public void foo() {
      System.out.printf("%s %s%n", Outer.this.message, message);
    }
  }
}

и запустить:

new Outer("Hello").new Inner("World").foo();

Выходы:

Hello World

Примечание: вложенные классы также могут быть статическими . Если это так, у них нет неявной this ссылки на внешний класс:

public class Outer {
  public static class Nested {
    public void foo() { System.out.println("Foo"); }
  }
}

new Outer.Nested.foo();

Чаще всего статические вложенные классы частные , поскольку они, как правило, являются деталями реализации и изящным способом инкапсуляции части проблемы без загрязнения общедоступного пространства имен.

63
ответ дан 24 November 2019 в 15:32
поделиться

BookListUpdaterCallback и StoreOrderCallback являются внутренними классами BookStore.

См. Руководство по Java - http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html и http://docs.oracle.com/javase /tutorial/java/javaOO/innerclasses.html

4
ответ дан 24 November 2019 в 15:32
поделиться

Я тоже не видел этого синтаксиса раньше, но думаю, что он создаст внутренний класс BookStore .

1
ответ дан 24 November 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: