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

标签 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 规范中哪里可以找到这个吗?

最佳答案

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

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,因为它们往往是实现细节和封装问题的一部分而不污染公共(public)命名空间的巧妙方式。

关于java - "object.new"是如何工作的? (Java 有 .new 运算符吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2863157/

相关文章:

java - Java中使用流比较两个List元素并返回

java - 为什么允许 "extends T"但不允许 "implements T"?

scala - "` 类声明 head` { val_name : Type => `class body` }"的语法含义是什么

java - 从 JSON Volley 请求中获取值的正确方法是什么?

c# - 嵌套类和接口(interface)

java - 搜索时,在表格布局中以不同的方式设置替代行的样式

java - 循环,随机数生成器,然后检查器

ruby - 有没有一种快速的方法可以在 Ruby 中找到缺失的结尾?

java - 如何避免内部类的名称冲突?

java - java的正则表达式