爲什麼在Java中這是可能的:。這是爲什麼可能在Java中:this.getClass()的getClass()的getClass()......等
this.getClass().getClass().getClass().getClass()...
爲什麼會出現這種無限遞歸?
只是好奇。
爲什麼在Java中這是可能的:。這是爲什麼可能在Java中:this.getClass()的getClass()的getClass()......等
this.getClass().getClass().getClass().getClass()...
爲什麼會出現這種無限遞歸?
只是好奇。
A Class
對象仍然是一個對象,您可以在任何對象上調用getClass
,這要歸功於Object#getClass
的存在。所以,你得到:
this.getClass(); // Class<YourClass>
this.getClass().getClass(); // Class<Class<YourClass>>
this.getClass().getClass().getClass(); //Class<Class<Class<YourClass>>>
最終你會耗盡堆棧內存,時間,或者磁盤空間如此巨大的項目,或到達一個Java內部限制。
您將遞歸與身份操作混淆。 – Ingo
@AnthonyGrist約10秒前編輯, – hexafraction
@hexafraction是的,編輯彈出,就像我輸入我的評論。我會刪除! –
這裏沒有無限遞歸:getClass()
返回java.lang.Class
對象,它本身就是一個java.lang.Object
對象,因此它支持getClass()
方法。在第二次致電getClass()
後,無論您撥打getClass()
多少次,您都會得到相同的結果。
可以鏈接的方法數量的上限是多少?當然必須有一些限制,可能會受到堆棧大小或其他因素的限制? –
@RohitJain我不認爲這裏涉及到堆棧:編譯器通過「展開」調用鏈來完成所有工作,通過調用前一個調用來準備下一個調用的調用目標,並存儲引用。 – dasblinkenlight
啊!我錯過了。所以這個將會運行,直到內存爆發,並最終以OutOfMemoryError結束。 –
這不是遞歸。
遞歸是一種方法在最終返回之前調用自己(鬆散地定義)有限次數的地方。
例如:
public int sumUpTo(int i) {
if (i == 1) {
return 1;
} else {
return i + sumUpTo(i-1);
}
}
你所做的是調用一個方法來獲取該對象的類,然後獲取類的類(java.lang.Class
)和重複它,只要你願意輸入。
每班延伸Object
班。 Class
本身就是一個類,它繼承了getClass()
方法。允許您撥打Class#getClass().getClass()
等。
public final Class<? extends Object> getClass()
getClass()返回一個Class對象。由於Class是Object的衍生物,它也有一個getClass方法。你應該打印幾次迭代。在第一次通話後您應該注意到重複模式...
無限?不完全的。 '對象#的getClass()'。 –
@SotiriosDelimanolis類是對象本身,所以是的,相當無限 –
因爲Class是Object的一個子類。 –