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

时间:2010-05-19 05:47:46

标签: java syntax inner-classes

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

3 个答案:

答案 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)

BookListUpdaterCallbackStoreOrderCallback是BookStore的内部类。

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

答案 2 :(得分:1)

我之前没有看过这种语法,但我认为它会创建一个BookStore的内部类。