"object.new"如何运作?(Java有.new运算符吗?)

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通常是实现细节,并且在不污染公共命名空间的情况下封装部分问题的巧妙方式.