2013-05-06 2 views
4

다음 코드를 감안할 때 :왜 다음 Java 코드에 StackOverflowError가 있습니까?

public class Classa { 

    int x=10; 

    void func(){ 

    } 

    Classa inner=new Classa(){ 
     void func(){ 
       x=90; 
     } 

    }; 

    public static void main(String[] args) { 
     Classa c=new Classa(); 
     c.inner.func(); 

    } 
} 

왜 인스턴스화하는 동안 내 응용 프로그램 충돌을합니까? (디버거에 accouching) 그것은 일종의 무한 재귀 적으로 들어갑니다. 어떤 생각?

+1

재귀 생성자 호출. –

+0

아 .. 그래, 고마워. – user2162550

답변

2

. 그러면 클래스가 생성됩니다.

이제 생각해보십시오. inner 변수는 어떻게 인스턴스화됩니까? 생성자 호출에서 재귀 호출 inner = new Classa()

이제 호출이 어떻게됩니까? 스택 오버플로가 발생할 때까지 프로세스가 반복적으로 반복됩니다.

1

Classa 생성자에서 new Classa()으로 전화를 걸었습니다. 새 Classa 객체를 생성하려고하는 동안

1

, 인스턴스 변수 innerClassa 생성자에 다른 전화를 발생시킨 건설 과정의 일환으로 초기화됩니다 따라서 코드는 무한 재귀로 가져옵니다.

3

는 따라서 인스턴스 무한대를 생성 포함하는 클래스의 동일한 유형 인 내부 변수의 인스턴스를 유지

class Classa { 
    Classa inner; 

    Classa() { 
    inner = new Classa(); 
    } 
} 

동등

Classa inner=new Classa() 

을 갖고 있기 때문에.

당신이 Classa 유형의 인 내부 변수를 할당 할 필요가 Classa 인스턴스를 초기화하기 위해, 여기가 무한 재귀입니다.

1

클래스에 정의 된 inner 인스턴스 변수가 있습니다. 익명의 하위 클래스 Classa으로 초기화하고 있습니다. 그러면 Classa의 또 다른 인스턴스가 생성됩니다. 하지만이 새로운 인스턴스는 inner이라는 인스턴스를 만들어서 Classa이라는 인스턴스를 만드는 데 무한 루프를 반복합니다. 각 호출은 스택에 물건을 놓고 결과적으로 StackOverflowError 결과를 얻습니다. 그것을 막을

한 가지 방법은 innerstatic을 만들 수 있기 때문에 전체 클래스에 대해 하나의 inner을가합니다 : 당신은() 새를 ​​ClassA를 호출

static Classa inner = new Classa(){ 
관련 문제