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

71

我今天在阅读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());
}

这些新的运算符是干什么用的?我从来没有见过这样的语法,有人能解释一下吗?

有人知道在Java规范中可以找到这个吗?


17
+1 对于我之前从未见过的 Java 语法也是个新鲜事。 - Justin Ardini
1
我知道内部类,但我常常将它们创建为:new outer.SomeClass() - OscarRyz
Oscar,这个语法是用来创建一个新的静态内部类的。 - chickeninabiscuit
2
@Ash Kim 内部类不能是静态的。正确的术语是静态嵌套类。 - Inquisitive
3个回答

67

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

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
如果有人对此感到困惑,这里详细解释了一切:http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html - chickeninabiscuit
请参考这里的讨论:https://dev59.com/GXVD5IYBdhLWcg3wJIIK - chickeninabiscuit
1
@cleutus说:“往往情况下,静态内部类是私有的”。这是错误的陈述。内部类不能是静态的。应该称之为“静态嵌套类”。请参见链接https://dev59.com/GXVD5IYBdhLWcg3wJIIK。 - Inquisitive
最后一行代码不应该是 new Outer.Nested().foo(); 吗? - AplusKminus
根据我的经验,最后一段是相反的;内部类通常是私有的(因为它们实现一些需要访问顶层类的特权接口,如 Iterator),而静态嵌套类是数据类型,比如命令对象或只适用于一个特定上下文的异常。 - chrylis -cautiouslyoptimistic-

4

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接