“怎么做?”;对象。新的“;工作(Java是否有一个.new操作符?)

“怎么做?”;对象。新的“;工作(Java是否有一个.new操作符?),java,syntax,inner-classes,Java,Syntax,Inner Classes,我今天在阅读时遇到了这个代码 那些新的运营商在那里做什么?我从未见过这样的语法,有人能解释一下吗 有人知道在java规范中的何处可以找到它吗?我以前也没有见过这种语法,但我认为它将创建一个书店的内部类,它们是内部(嵌套的非静态)类: 你可以做: Outer outer = new Outer(); outer.new Inner().foo(); 或者简单地说: new Outer().new Inner().foo(); 这样做的原因是internal引用了外部类的特定实例。让我给你一个更

我今天在阅读时遇到了这个代码

那些新的运营商在那里做什么?我从未见过这样的语法,有人能解释一下吗


有人知道在java规范中的何处可以找到它吗?

我以前也没有见过这种语法,但我认为它将创建一个
书店
的内部类,它们是内部(嵌套的非静态)类:

你可以做:

Outer outer = new Outer();
outer.new Inner().foo();
或者简单地说:

new Outer().new Inner().foo();
这样做的原因是
internal
引用了外部类的特定实例。让我给你一个更详细的例子:

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
注意:嵌套类也可以是静态的。如果是,则它们没有对外部类的隐式
引用:

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

new Outer.Nested.foo();

通常情况下,静态嵌套类是私有的,因为它们往往是实现细节,是封装问题的一部分而不污染公共名称空间的一种简洁方式。

BookListUpdaterCallback
StoreOrderCallback
是书店的内部类


参见Java教程-和

+1,了解我以前从未见过的Java语法。我知道内部类,但我使用它来创建它们:
new outer.SomeClass()
Oscar该语法用于创建新的静态内部类class@AshKim内部类不能是静态的。正确的术语是静态嵌套类。如果有人对此不太清楚,这里会详细说明:这里也有一个很好的讨论:@cleutus“通常情况下,静态内部类是私有的”。这是一种错误的说法。内部类不能是静态的。这应该称为“静态嵌套类”。请参阅链接,最后一行代码不应读取
new Outer.Nested().foo()?根据我的经验,最后一段是向后的;内部类通常是私有的(因为它们实现了一些需要对顶级类进行特权访问的接口,如
Iterator
),而静态嵌套类是应用于特定上下文的命令对象或异常等数据类型。
Hello World
public class Outer {
  public static class Nested {
    public void foo() { System.out.println("Foo"); }
  }
}

new Outer.Nested.foo();