为什么在Java中可以实现这一点:
this.getClass().getClass().getClass().getClass()...
为什么会出现这种无限递归?
好奇。
答案 0 :(得分:10)
这里没有无限递归:getClass()
返回一个java.lang.Class
对象,它本身就是一个java.lang.Object
对象,因此它支持getClass()
方法。在第二次拨打getClass()
后,无论您拨打getClass()
多少次,您都会获得相同的结果。
答案 1 :(得分:4)
Class
对象仍然是一个对象,由于存在getClass
,您可以在任何对象上调用Object#getClass
。所以你得到:
this.getClass(); // Class<YourClass>
this.getClass().getClass(); // Class<Class<YourClass>>
this.getClass().getClass().getClass(); //Class<Class<Class<YourClass>>>
最终,这个庞大的程序会耗尽堆栈内存,时间或磁盘空间,或者达到Java内部限制。
答案 2 :(得分:2)
每个类都扩展了Object
类。 Class
作为一个类本身,它继承了getClass()
方法。允许您拨打Class#getClass().getClass()
等等。
答案 3 :(得分:1)
那不是递归。
递归是一个方法在最终返回之前调用自身(松散地定义)有限次数的地方。
例如:
public int sumUpTo(int i) {
if (i == 1) {
return 1;
} else {
return i + sumUpTo(i-1);
}
}
你所做的就是调用一个方法来获取这个对象的类,然后获取类的类(java.lang.Class
),并在你需要输入的时候重复它。
答案 4 :(得分:1)
public final Class<? extends Object> getClass()
getClass()返回一个Class对象。由于Class是Object的衍生物,因此它也有一个getClass方法。你应该打印几次迭代。第一次通话后你应该注意到一个重复的模式...