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