Class 当一个类有一个相同类的字段时,它怎么不是StackOverflowException呢?

Class 当一个类有一个相同类的字段时,它怎么不是StackOverflowException呢?,class,language-agnostic,stack-overflow,Class,Language Agnostic,Stack Overflow,如果一个类T有一个类型为T的字段,怎么会没有StackOverflow异常呢?因为如果你创建一个T的对象,它里面会有另一个T对象,这个T对象会有它自己的T对象,等等等等 好吧,我知道这个问题很让人困惑,这可能不是回答这些问题的网站,但我只是好奇 编辑: 好的,这里有一个例子让我更清楚我的意思: class T { T t = new T(); } 如果你创建了一个T的对象,你也将创建另一个T的对象,它将有自己的T对象,依此类推。我想问的是,为什么这不是一个堆栈溢出,因为将创建一个无限的

如果一个类T有一个类型为T的字段,怎么会没有StackOverflow异常呢?因为如果你创建一个T的对象,它里面会有另一个T对象,这个T对象会有它自己的T对象,等等等等

好吧,我知道这个问题很让人困惑,这可能不是回答这些问题的网站,但我只是好奇

编辑:

好的,这里有一个例子让我更清楚我的意思:

class T {
    T t = new T();
}
如果你创建了一个T的对象,你也将创建另一个T的对象,它将有自己的T对象,依此类推。我想问的是,为什么这不是一个堆栈溢出,因为将创建一个无限的T链

我不知道这是否有帮助。

通常,在大多数(所有?)编程语言中,具有复杂数据项属性的对象不会在其分配的空间中存储这些完整的数据项,而是为指向该对象的指针或引用分配足够的空间。要使用Perl术语:

package T;
use Moo;
use Types::Standard -all;
has ref_to_t => (is => 'ro', isa => InstanceOf['T']); # notice not "required"
1;
然后是:

my $obj1 = T->new;
my $obj2 = T->new(ref_to_t => undef);
my $obj3 = T->new(ref_to_t => $obj2);
这说明了三种情况不会导致世界末日的方式:

  • $obj1
    完全没有为
    ref\u to\u t
    分配空间(因为这就是Perl的
    Moo
    的工作方式)
  • $obj2
    已分配空间,但仅足以引用另一个空或未定义的对象
  • $obj3
    还分配了空间,也仅用于参考
通常,在大多数(所有?)编程语言中,具有复杂数据项属性的对象不会在其分配的空间中存储这些完整的数据项,而是为指向该对象的指针或引用分配足够的空间。要使用Perl术语:

package T;
use Moo;
use Types::Standard -all;
has ref_to_t => (is => 'ro', isa => InstanceOf['T']); # notice not "required"
1;
然后是:

my $obj1 = T->new;
my $obj2 = T->new(ref_to_t => undef);
my $obj3 = T->new(ref_to_t => $obj2);
这说明了三种情况不会导致世界末日的方式:

  • $obj1
    完全没有为
    ref\u to\u t
    分配空间(因为这就是Perl的
    Moo
    的工作方式)
  • $obj2
    已分配空间,但仅足以引用另一个空或未定义的对象
  • $obj3
    还分配了空间,也仅用于参考

什么语言?我相信他(或她)在问一个一般的概念性问题。我认为它是有效的,所以我+1-ed它。@ed。然而,没有“一般的,概念性的”答案。答案因语言而异。在C++中,例如,它是堆栈溢出,或者可能是编译错误,因为对象大小是无限的。术语
StackOverflowException
强烈建议使用Java。听起来我的答案需要编辑,那么?@Ed。我不知道。由OP来澄清。什么语言?我相信他(或她)在问一个一般的概念性问题。我认为它是有效的,所以我+1-ed它。@ed。然而,没有“一般的,概念性的”答案。答案因语言而异。在C++中,例如,它是堆栈溢出,或者可能是编译错误,因为对象大小是无限的。术语
StackOverflowException
强烈建议使用Java。听起来我的答案需要编辑,那么?@Ed。我不知道。由OP来澄清。