“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()); } 

那里有哪些新的运营商? 我从来没有见过这样的语法,任何人都可以解释?

有谁知道在哪里可以find这个在Java规范?

它们是内部 (嵌套的非静态)类:

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

你可以做:

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

或者干脆:

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

这是因为Inner有一个外部类的特定实例的引用。 让我给你一个更详细的例子:

 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 

注意:嵌套类也可以是static 。 如果是这样的话,他们并没有暗示this外部类的引用:

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

通常情况下,静态嵌套类是private因为它们倾向于实现细节,并且封装问题的一部分而不会污染公共名称空间。

BookListUpdaterCallbackStoreOrderCallback是BookStore的内部类。

请参阅Java教程 – http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html和http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html

我还没有看过这个语法,但是我认为它会创build一个BookStore的内部类。