2012-01-18 87 views
10

我見過一對夫婦在Java中類似這樣的例子,而且我希望有人能解釋發生了什麼。看起來像一個新的類可以定義爲內聯,這對我來說似乎很奇怪。預計第一個打印輸出行,因爲它只是toString。然而,第二個似乎可以被重寫的函數內聯。有這個技術術語嗎?或者更深入的文檔?謝謝!爪哇 - 內嵌類定義

如果我有以下代碼:

public class Apple { 
    public String toString() { 
     return "original apple"; 
    } 
} 

public class Driver { 
    public static void main(String[] args) { 
     System.out.println("first: " + new Apple()); 
     System.out.println("second: " + 
      new Apple() { 
       public String toString() { 
        return "modified apple"; 
       } 
      } 
     ); 
    } 
} 

代碼輸出:

first: original apple 
second: modified apple 

回答

15

它是匿名的內部類。您可以在Inner Classes的Java文檔鏈接中找到關於它的更多信息。 編輯我增加了better link描述匿名內部類,作爲Java文檔極不理想的東西。 /EDIT

大多數人會使用匿名內部類快速定義聽衆。考慮這種情況:

我有一個Button,當我點擊它,我希望它顯示的東西到控制檯。但我不希望有一個不同的文件中創建一個新的類,我不希望有定義一個內部類在這個文件後,我想的邏輯馬上就在這裏。

class Example { 
    Button button = new SomeButton(); 

    public void example() { 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(SomeClickEvent clickEvent) { 
       System.out.println("A click happened at " + clickEvent.getClickTime()); 
      } 
     }); 
    } 

    interface OnClickListener { 
     void onClick(SomeClickEvent clickEvent); 
    } 

    interface Button { 
     void setOnClickListener(OnClickListener ocl); 
    } 
} 

的例子是有點做作,顯然沒有完成,但我認爲它橫跨有想法。

+0

謝謝大家!我會讀這個! – 2012-01-18 16:19:29

+0

我只想補充一點的onClick方法裏面的「這個」值指的是巴頓來說,如果你想參考示例實例的onClick方法,你可以用「Example.this」裏面。儘管靜態內部類沒有這個引用。 – Hoffmann 2014-03-06 16:28:11

2

代碼中發生的事情是,您隱式地將Apple用匿名內部類繼承並覆蓋其toString()方法。

0

這就是所謂的annonymous內部類,你可以看到它herehere