我今天在阅读Accelerated GWT (Gupta) - page 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规范中哪里可以找到它?
答案 0 :(得分:63)
他们是内部(嵌套的非静态)类:
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
,因为它们往往是实现细节,并且在不污染公共命名空间的情况下封装部分问题的巧妙方法。
答案 1 :(得分:4)
BookListUpdaterCallback
和StoreOrderCallback
是BookStore的内部类。
请参阅Java教程 - http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html和http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html
答案 2 :(得分:1)
我之前没有看过这种语法,但我认为它会创建一个BookStore
的内部类。