2010-06-05 117 views
6

任何人都可以解釋以下代碼的工作...?任何人都可以解釋以下代碼的工作...?

interface myInterface{} 

public class Main { 

    public static void main(String[] args) { 

     System.out.println(new myInterface(){public String toString(){return "myInterfacetoString";}}); 

     System.out.println(new myInterface(){public String myFunction(){return "myInterfacemyFunction";}}); 
    } 
} 

輸出是...

myInterfacetoString 
[email protected] 

所有答案中說的println是MyInterface的()語句是匿名類。但是,因爲我已經將它聲明爲一個接口,爲什麼它允許我創建同名匿名類....?

再次...如果這些都是匿名類,則class主要應該讓我給任何名義向這些匿名classes..But如果嘗試做so..I'm獲得編譯錯誤

+0

這是作業,還是好奇?標記作業問題本身被認爲是一種很好的形式。 – ojrac 2010-06-05 02:17:58

+1

Siddhi,很好的問題。不過,我建議你不要經常用顯着的新內容改變問題。相反,你可以提交一個新的問題並引用這個問題。 – akf 2010-06-05 02:53:37

+0

這使得一個匿名類的實例實現一個空的接口。一個覆蓋toString(),所以System.out.println會自動使用它。另一個有myFunction,它沒有被調用,所以它使用Object的toString(),它提供了一些信息,包括對象的地址。 – mk12 2010-06-05 03:12:37

回答

14

當你打印出一個對象,它會調用toString()方法。在第一個語句中,您創建了新的對象,並且還覆蓋了稱爲toString的方法。因此,當打印對象時,會調用此toString()方法。

在第二條語句,你還可以創建一個對象,但你不重寫toString()方法,使其使用Object類的toString()方法。

對於新的問題,這個鏈接對你的理解一個很好的解釋: Anonymous Classes

下面是解釋的副本:

new className(optional argument list){classBody} 

這個表達式實例從一個無名一個新的對象和此前未定義的類,它自動擴展名爲類名,類和不能明確地實現任何接口。新課程的主體由classBody提供。

執行該表達式的結果是,該延伸的className一個新的類定義,新的類新對象被實例化,並且表達由對新對象基準所取代。

new interfaceName(){classBody} 

該表達從無名和先前未定義類,它可以自動實現名爲接口名接口實例化一個新對象,並自動延伸名爲對象的類。這個類可以明確實現一個,只有一個接口,並不能延長超過對象其他任何類。再一次,新班的主體由classBody給出。

現在是清楚的嗎?

+0

好的......但是這個調用toString方法,因爲默認情況下myAbstractClass是擴展了Object類......但是如果我使用Interface而不是抽象類......它給了我相同的輸出......爲什麼它如此......? – Siddhi 2010-06-05 02:23:27

+2

所有對象直接或間接地,明確或隱含地擴展Object類。如果您使用接口而不是抽象類,那麼您的匿名類仍將隱式擴展Object。 – emory 2010-06-05 02:27:12

+0

我已經爲接口的匿名類添加了一個新的,更清晰的解釋。你也應該看看鏈接,這是非常好的:) – vodkhang 2010-06-05 04:11:04

3

在第一println()你是從匿名myAbstractClass實例重寫toString()方法,所以你得到的字符串你重寫toString()方法返回,這就是println()功能的默認行爲。

在第二println(),你是不是重寫toString()方法,所以println()使用默認的(從Object繼承)。

在附註中,嘗試正確地格式化您的代碼,閱讀和理解起來要容易得多。

abstract class myAbstractClass{} 

public class Main { 
    public static void main(String[] args) { 
     System.out.println(new myAbstractClass(){ 
      public String toString(){ 
       return "myAbstractClass toString"; 
      } 
     }); 

     System.out.println(new myAbstractClass(){ 
      public String myFunction(){ 
       return "myAbstractClass myFunction"; 
      } 
     }); 
    } 
} 
+0

好吧...但這調用toString方法,因爲myAbstractClass默認情況下擴展了Object類...但是如果我使用Interface而不是抽象類...它給了我相同的輸出......爲什麼如此..? – Siddhi 2010-06-05 02:26:39

+1

由於您創建的任何對象實例(即使它來自實現接口的類)都從Object擴展而來。 http://java.sun.com/javase/6/docs/api/java/lang/Object.html – Cesar 2010-06-05 02:33:00

3

myAbstractClass是一個最小類。它從對象繼承。

類主要從myAbstractClass構造兩個匿名內部類,並打印它們的toString輸出。

  1. 內部類重寫toString方法,您會看到它的輸出。
  2. 內部類獲取添加的方法,並且您將默認的toString定義。
1

在這兩種情況下,您都打印了該對象。所以它會調用toString()方法的對象。在第一種情況下,由於您已覆蓋toString()方法,因此它正在打印myAbstractClass toString。在第二種情況下,由於它未被覆蓋,因此它調用Object類中實現的默認toString()

我想你在期待第二種情況下的函數調用是錯誤的。你剛剛重寫了它,但從來沒有打過電話。

相關問題