2014-10-04 9 views
-2

주어진 클래스 내에서 객체가 만들어 질 때까지는 특정 객체에 메모리가 할당됩니다. 이 경우 있지만 :두 클래스가 서로의 객체를 만들면 어떻게됩니까?

2 개 클래스가 서로의 개체를 만들 때 사물의 메모리 할당 측이 경우에는 어떻게됩니까
public class KindA { 
    KindB b = new KindB(); 
    // rest of the code 
} 
public class KindB { 
    KindA a = new KindA(); 
    // rest of the code 
} 

?

+0

JVM이 관리합니다. 왜 신경 씁니까? –

+0

그러나이 상황에서는 재귀가 없습니까? 이 모델을 사용하여 코드를 작성하기 전에 정확히 무슨 일이 발생했는지 알고 싶었습니다. –

+0

클래스는 자체에 대한 참조를 가질 수도 있습니다. JVM은 이것을 관리한다. 자바 개발자는 명시 적 메모리 관리에 관심을 가질 필요가 없다. (실제로 ** 명시 적 메모리 관리가 없다.) –

답변

4

당신이 클래스 중 하나를 초기화하려고하면 KindA의 초기화 유형 KindAKindA의 새로운 객체를 생성 유형 KindB의 새로운 객체 따라서 KindB 실행의 초기화를 생성하기 때문에 당신이하는 StackOverflowError를 얻을 수 있습니다 이니셜 라이저가 다시 실행되어 KindB 유형의 새 객체를 초기화합니다.

이것은 무한 재귀이며 따라서 stackoverflow입니다.

+0

KindA 클래스에서 KindB 객체의 Stack (java.util 클래스)을 만들 때도 마찬가지입니까? (또는 그 반대) –

+0

스택 오버플로입니까? JVM 메모리 관리에 익숙하지 않지만 C++에서는 힙에서 이러한 객체를 할당하고 스택을 분쇄했기 때문에 결국 메모리가 부족하게됩니다. – adrianmcmenamin

+0

@KeshavSonni :'Stack'을 만들면 자동으로 "요소 유형"의 인스턴스를 생성하지 않습니다. 그러므로'KindA'에'Stack '을 생성하면 재귀가 발생하지 않습니다. (그러나'KindB b = new KindB();'를 유지하고'KindB'는 변경하지 않습니다). – fabian

관련 문제