2013-10-14 83 views

回答

3

A Class對象仍然是一個對象,您可以在任何對象上調用getClass,這要歸功於Object#getClass的存在。所以,你得到:

this.getClass(); // Class<YourClass> 
this.getClass().getClass(); // Class<Class<YourClass>> 
this.getClass().getClass().getClass(); //Class<Class<Class<YourClass>>> 

最終你會耗盡堆棧內存,時間,或者磁盤空間如此巨大的項目,或到達一個Java內部限制。

+2

您將遞歸與身份操作混淆。 – Ingo

+0

@AnthonyGrist約10秒前編輯, – hexafraction

+1

@hexafraction是的,編輯彈出,就像我輸入我的評論。我會刪除! –

10

這裏沒有無限遞歸:getClass()返回java.lang.Class對象,它本身就是一個java.lang.Object對象,因此它支持getClass()方法。在第二次致電getClass()後,無論您撥打getClass()多少次,您都會得到相同的結果。

+1

可以鏈接的方法數量的上限是多少?當然必須有一些限制,可能會受到堆棧大小或其他因素的限制? –

+1

@RohitJain我不認爲這裏涉及到堆棧:編譯器通過「展開」調用鏈來完成所有工作,通過調用前一個調用來準備下一個調用的調用目標,並存儲引用。 – dasblinkenlight

+0

啊!我錯過了。所以這個將會運行,直到內存爆發,並最終以OutOfMemoryError結束。 –

1

這不是遞歸。

遞歸是一種方法在最終返回之前調用自己(鬆散地定義)有限次數的地方。

例如:

public int sumUpTo(int i) { 
    if (i == 1) { 
     return 1; 
    } else { 
     return i + sumUpTo(i-1); 
    } 
} 

你所做的是調用一個方法來獲取該對象的類,然後獲取類的類(java.lang.Class)和重複它,只要你願意輸入。

2

每班延伸Object班。 Class本身就是一個類,它繼承了getClass()方法。允許您撥打Class#getClass().getClass()等。

1
public final Class<? extends Object> getClass() 

getClass()返回一個Class對象。由於Class是Object的衍生物,它也有一個getClass方法。你應該打印幾次迭代。在第一次通話後您應該注意到重複模式...