-6

如果我创建一个没有任何内容的类然后实例化它n,是否可能OutOfMemory发生错误?

如果我创建一个类并在该类的构造函数中创建一个自身的实例,我会无限嵌套同一个类吗?会出现OutOfMemory错误吗?

假设我创建了一个类,该类应该获取对象并检查它们是否对自己有任何变量引用,如果没有,则将它们包含在列表中。当传递给它的对象是它自己时,我的班级将如何反应?

我最感兴趣的是这如何应用于 Java,而不是 C x,但如果它们的行为可能不同,仍然会很有趣。

4

1 回答 1

2

如果我创建一个没有任何内容的类,然后实例化它 n 次,是否可能发生 OutOfMemory 错误?

是的。如果 N 足够大。

如果我创建一个类并在该类的构造函数中创建一个自身的实例,我会无限嵌套同一个类吗?

如果你有无限量的内存,是的。实际上你没有,所以创造必然会失败。

会发生 OutOfMemory 错误吗?

可能。您更有可能收到 StackOverflow 错误……因为您所描述的内容将创建一个递归循环。

假设我创建了一个类,该类应该获取对象并检查它们是否对自己有任何变量引用,如果没有,则将它们包含在列表中。当传递给它的对象是它自己时,我的班级将如何反应?

这是不可能的。这取决于您如何实现代码以“检查它们是否对自己有任何变量引用”。


您似乎正在尝试探索罗素悖论对 Java 程序的影响。简单的答案是它没有任何后果。涉及集合表示的 Java 程序将执行已编码的任何操作。如果您有一个允许“集合”“包含”自身的表示,那么就会发生这种情况。

不过,有一件事应该是显而易见的。Java 中集合的简单表示不允许您表示具有无限数量元素的集合。Java 中的内存(和堆栈)是有限的。这并不意味着不可能代表所有无限集。您只需要以不同的方式进行即可;例如使用“惰性”数据结构或符号表示。


人们很容易认为集合的表示实际上可能数学集合,并且您可能会通过触发罗素悖论来引起未指定的怪异。实际上,不会发生这样的事情。罗素悖论提出的问题是“所有集合的集合都包含它自己吗?”。但是图灵机等效计算机上的程序无法测试简单无限集合中的所有元素……更不用说所有集合的集合了。罗素的问题根本不是一个容易处理的问题。(但是,它从来都不易于处理的。它实际上是关于探索有意义的数学的极限。)

于 2012-12-15T23:45:10.530 回答