2017-08-29 15 views
0

如果一個類T有一個T類型的字段,那麼沒有一個StackOverflow異常怎麼樣?因爲如果你創建了一個T對象,那麼它內部會有另一個T對象,並且這個T對象又將擁有它自己的T對象,以及on和on。當一個類有一個相同類的字段時,它不是StackOverflowException嗎?

好的我知道這個問題很混亂,這可能不是網站回答這些類型的問題,但我只是好奇。

編輯:

好了,所以這裏是讓自己上了我的意思更清晰的例子:

class T { 
    T t = new T(); 
} 

因此,如果你創建T的對象,你也將創造另一個T的對象,T又有它自己的對象,等等等等。我在問的是爲什麼不是StackOverflow,因爲T的無限鏈將被創建?

我不知道這是否有幫助。

+2

什麼語言? –

+0

我相信他(或她)正在提出一個概括的概念問題。我認爲這是有效的,所以我+ 1版。 –

+2

@Ed。儘管如此,沒有「一般的,概念的」答案。答案因語言而異。在C++中,例如,它*可能是堆棧溢出,也可能是編譯錯誤,因爲對象大小是無限的。術語'StackOverflowException'強烈建議Java。 – EJP

回答

2

通常,在大多數(所有?)編程語言中,具有複雜數據項屬性的對象不會將這些完整數據項存儲在其分配的空間內,而是爲指向該對象的指針或引用分配足夠的空間。使用Perl方面:

my $obj1 = T->new; 
my $obj2 = T->new(ref_to_t => undef); 
my $obj3 = T->new(ref_to_t => $obj2); 

這表明三種方式的情況不會導致世界末日:

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

然後

  • $obj1有(因爲這是怎麼Perl的Moo作品)根本沒有空間分配ref_to_t
  • $obj2已分配空間,但僅用於引用另一個對象,即null或undefined。
  • $obj3也有空間分配,也僅供參考。
相關問題