2010-05-19 60 views
60

今天我遇到了这个代码,同时阅读Accelerated GWT (Gupta) - page 151“object.new”是如何工作的? (Java是否有.new运算符?)

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规范中找到这个位置?

+12

+1的Java语法我从来没有见过任何。 – 2010-05-19 05:52:11

+1

我知道内部类,但我用它们来创建它们:'new outer.SomeClass()' – OscarRyz 2010-05-20 23:19:42

+0

奥斯卡语法用于创建新的静态内部类 – 2010-05-20 23:57:24

回答

59

他们(嵌套的非静态)类:

public class Outer { 
    public class Inner { public void foo() { ... } } 
} 

你可以这样做:

Outer outer = new Outer(); 
outer.new Inner().foo(); 

或者干脆:

new Outer().new Inner().foo(); 

这样做的原因是Inner有一个th的特定实例的引用外部类。让我给你的这一个更详细的例子:

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,因为他们往往是实施细则,并不会污染封装环节出了问题的一种巧妙的方法公共命名空间。

+0

啊我看到了 - 谢谢! – 2010-05-19 05:59:27

+1

如果有人对此感到朦胧,这里全是拼写出来的:http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html – 2010-05-19 06:19:13

+0

以及这里的一个很好的讨论:http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class – 2010-05-19 06:21:25

2

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