6

为什么这在 Java 中是可能的:

this.getClass().getClass().getClass().getClass()...

为什么会有这种无限递归?

只是好奇。

4

5 回答 5

10

这里没有无限递归:getClass()返回一个java.lang.Class对象,它本身就是一个java.lang.Object对象,因此它支持getClass()方法。在第二次打电话给getClass()你之后,无论你打电话多少次,都会得到同样的结果getClass()

于 2013-10-14T15:26:23.453 回答
4

一个Class对象仍然是一个对象,你可以调用getClass任何对象,这要归功于Object#getClass. 所以你得到:

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

最终,对于如此庞大的程序,您将耗尽堆栈内存、时间或磁盘空间,或者达到 Java 内部限制。

于 2013-10-14T15:26:11.773 回答
2

每个类都扩展了Object类。Class作为一个类本身,它继承了该getClass()方法。让你打电话Class#getClass().getClass()等等。

于 2013-10-14T15:26:58.670 回答
1

那不是递归。

递归是一个方法在最终返回之前调用自身(松散地定义)有限次的地方。

例如:

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

您所做的是调用一个方法来获取该对象的类,然后获取该类的类 ( java.lang.Class) 并在您愿意键入时重复它。

于 2013-10-14T15:26:43.327 回答
1
public final Class<? extends Object> getClass()

getClass() 返回一个 Class 对象。由于 Class 是 Object 的派生,它也有一个 getClass 方法。您应该打印一些迭代。在第一次通话后,您应该注意到重复的模式......

于 2013-10-14T15:31:31.133 回答