【问题标题】:How does "object.new" work? (Does Java have a .new operator?)“object.new”是如何工作的? (Java 有 .new 运算符吗?)
【发布时间】:2011-02-21 05:35:09
【问题描述】:

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

【问题讨论】:

  • +1 表示我以前从未见过的 Java 语法。
  • 我知道内部类,但我将它们创建为:new outer.SomeClass()
  • 奥斯卡那个语法是用来创建一个新的静态内部类
  • @Ash Kim 内部类不能是静态的。正确的术语是静态嵌套类。

标签: java syntax inner-classes


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果有人对此模糊不清,这里全部说明:java.sun.com/docs/books/tutorial/java/javaOO/nested.html
    • 这里也是一个很好的讨论:stackoverflow.com/questions/70324/…
    • @cleutus “通常情况下,静态内部类是私有的”。这是一个错误的说法。内部类不能是 static 。这应该被称为“静态嵌套类”。见链接stackoverflow.com/questions/70324/…
    • 最后一行代码不应该是new Outer.Nested().foo();吗?
    • 根据我的经验,最后一段是倒着的;内部类通常是私有的(因为它们正在实现一些像 Iterator 这样的接口,需要对顶级类进行特权访问),静态嵌套类是适用于特定上下文的命令对象或异常等数据类型。跨度>
    【解决方案3】:

    BookListUpdaterCallbackStoreOrderCallback 是 BookStore 的内部类。

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

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 2015-09-03
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多