“object.new”是如何工作的?(Java 是否有 .new 运算符?

2022-08-31 14:13:50

我今天在阅读加速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规范中哪里可以找到它?


答案 1

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

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

注意:嵌套类也可以。如果是这样,它们没有对外部类的隐式引用:staticthis

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

new Outer.Nested.foo();

通常,静态嵌套类往往是实现细节,并且是在不污染公共命名空间的情况下封装部分问题的整洁方式。private


答案 2

BookListUpdaterCallback并且是书店的内部类。StoreOrderCallback

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