chi*_*uit 65 java syntax inner-classes
我今天在阅读Accelerated 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());
}
Run Code Online (Sandbox Code Playgroud)
这些新运营商在那里做什么?我从未见过这样的语法,任何人都可以解释一下吗?
有谁知道在java规范中哪里可以找到这个?
cle*_*tus 63
它们是内部(嵌套的非静态)类:
public class Outer {
public class Inner { public void foo() { ... } }
}
Run Code Online (Sandbox Code Playgroud)
你可以做:
Outer outer = new Outer();
outer.new Inner().foo();
Run Code Online (Sandbox Code Playgroud)
或者干脆:
new Outer().new Inner().foo();
Run Code Online (Sandbox Code Playgroud)
原因是它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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并运行:
new Outer("Hello").new Inner("World").foo();
Run Code Online (Sandbox Code Playgroud)
输出:
Hello World
Run Code Online (Sandbox Code Playgroud)
注意:嵌套类也可以static.如果是这样,它们没有this对外层的隐式引用:
public class Outer {
public static class Nested {
public void foo() { System.out.println("Foo"); }
}
}
new Outer.Nested.foo();
Run Code Online (Sandbox Code Playgroud)
通常,静态嵌套类private通常是实现细节,并且在不污染公共命名空间的情况下封装部分问题的巧妙方式.