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


67

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


14
+1是我从未见过的Java语法。
贾斯汀·阿迪尼

1
我知道内部类,但是我经常将它们创建为:new outer.SomeClass()
OscarRyz 2010年

Oscar语法是用于创建新的静态内部类的
chickeninabiscuit 2010年

2
@Ash Kim内部类不能是静态的。正确的术语是静态嵌套类。
好奇的2012年

Answers:


65

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

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
如果有人对此
感到迷惑

并且也是一个很好的讨论在这里:stackoverflow.com/questions/70324/...
chickeninabiscuit

1
@cleutus“静态内部类通常是私有的”。这是一个错误的陈述。内部类不能是静态的。这应该称为“静态嵌套类”。参见链接stackoverflow.com/questions/70324/…–
好奇

最后的代码行不应该阅读new Outer.Nested().foo();吗?
AplusKminus

以我的经验,最后一段是倒退的。内部类通常是私有的(因为它们正在实现某种接口Iterator,需要对顶级类的特权访问),而静态嵌套类是适用于一个特定上下文的数据类型,例如命令对象或异常。
克莱里斯-cautiouslyoptimistic-


1

我之前也从未见过这种语法,但是我认为它将创建一个内部类BookStore

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.