2010-05-19 79 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的內部類。