2013-08-11 2 views
4

나는이 다음 코드와 오류가 점점 오전에 과부하는 생성자 자바

오류 : x를 참조 할 수 없습니다 슈퍼 생성자 호출 (및 주석 1에서 문을 지적)

class Con{ 
    int x =10; 

    Con(){ 
     this(++x); //1 
     System.out.println("x :"+x); 
    } 

    Con(int i){ 
     x=i++; 
     System.out.println("x :"+x); 
    } 
} 
되기 전에

주요 방법 나는이 문장

Con c1=new Con(); 

내가 오류를 이해하지 못하고 있습니다. 누군가 여기서 실제로 일어나고있는 것을 설명 할 수 있습니까?

+1

나는 그것이 무엇을 의미 하는지를 의미합니다. super()를 호출 할 때까지 x를 참조 할 수 없습니다. 일반적으로 이것은 암묵적으로 발생하지만,'this' 호출이 있기 때문에'super' 호출은 억제됩니다. 나는 당신이 원하는 것을 할 수있는 방법을 조금 생각하지 않고서는 생각할 수 없다. –

+0

this()를 생성자 내에서 호출하는 용도는 무엇입니까? 누군가 설명 할 수 있습니까? 나는 이것을 (...) 호출하는 매개 변수화 된 생성자로 상황을 생각할 수있다. –

+1

@boxed__l this()는 동일한 클래스에있는 오버로드 된 생성자를 호출하는 데 사용됩니다. 4 개의 매개 변수를 사용하는 호출 된 생성자가 있지만 2 개의 필드에 이미 초기화를 수행하는 다른 생성자가 있습니다.이 경우에는이 함수를 사용해야합니다. (x, y) 두 인수의 생성자를 호출한다. – Algorithmist

답변

5

을 사용할 필요가 생성자가 먼저 슈퍼 클래스 필드를 초기화하는 슈퍼 클래스 생성자의 호출합니다. 모든 수퍼 클래스 생성자가 실행되면 현재 생성자 만 자신의 필드를 계속 초기화합니다.

이제는 생성자에서 this() 호출을 추가 할 때 상위 클래스 생성자를 호출하지 않습니다. 이는 생성자의 첫 번째 문이 super()을 사용하는 체인 또는 수퍼 클래스 생성자 체인이거나 동일한 클래스의 다른 생성자 인 경우 this()을 사용하기 때문입니다.

필드가 아직 초기화되지 않았으므로 this()에 필드를 전달할 수 없습니다. 그러나 그것은 정말로 의미가 없습니다. 왜 그런 식으로하려고합니까?

컴파일러는 클래스의 각 생성자 내부에서 필드 초기화 코드를 이동합니다.

Con() { 
    this(++x); //1 

    // This is where initialization is done. You can't access x before it. 
    x = 10; 
    System.out.println("x :"+x); 
} 

이도 super() 호출 사실이다 : 그래서, 당신의 생성자에 효과적으로 동일합니다. 그래서, 아래의 코드는 또한 당신에게 같은 오류를 줄 것이다 (Con을 고려하여 매개 변수화 된 생성자와 다른 클래스를 확장) : 그들 중 누구도 그들의없는 경우 생성자 내부

Con() { 
    super(++x); //1 
    System.out.println("x :"+x); 
} 
+0

나는 어떤 클래스도 확장하지 않기 때문에 매개 변수화 된 생성자에 수퍼 클래스 생성자를 말할 수 있습니까? – chathura

+1

@ chathura2020. 클래스가 어떤 클래스도 확장하지 않으면,'super()'를 사용하여'Object' 클래스의 0-arg 생성자를 호출해야합니다. –

+3

@ chathura2020. 모든 클래스는 적어도 하나의 클래스를 확장합니다. 그래서, 당신은 말할 수 없습니다, 당신의 클래스는 다른 클래스를 확장하지 않습니다. 명시 적으로 처리하지 않으면'Object' 클래스가 암시 적으로 수퍼 클래스입니다. –

2
Con(){ 
    this(++x); //1 
    System.out.println("x :"+x); 
} 

이 순간에 Con은 아직 존재하지 않습니다. 먼저 다른 생성자를 호출하여 인스턴스를 생성합니다. 이는 x이 아직 존재하지 않음을 의미합니다 (다른 생성자가 인스턴스를 생성하자 마자 생성됩니다). 그래서 당신은 아직 그것을 참조 할 수 없습니다. 당신이 정말로 그것을 참조해야하는 경우

, 당신은 클래스의 인스턴스를 생성 할 때 정적 변수

private static int x = 10; 
0

첫 번째 호출은, this() 또는 super() 될 수 있습니다 컴파일러는 자동으로 super에 대한 호출을 삽입하지만 생성자에서는 this()를 사용하여 다른 생성자를 호출했습니다. 기본적으로 을 생성 할 때 수퍼 클래스가 먼저 초기화되면 하위 클래스의 멤버가 초기화됩니다. 따라서 초기화되지 않은 멤버는 수퍼 클래스의 멤버와 수퍼 클래스 자체 이후에 초기화되므로이를 참조 할 수 없습니다.