2015-01-22 2 views
2

이 코드를 실행하면 값 0이 출력되는 이유는 무엇입니까? SubClass 생성자에서 어떤 일이 발생하는지 정확히 이해하지 못하는 이유는 무엇입니까? 재정의 된 메소드 implicitValue를 지우면 인쇄됩니다. 10. SubClass 생성자가 SuperClass 생성자를 사용합니까? 감사합니다.Java 하위 클래스 생성자 상속 된 멤버

class SuperClass { 
    protected int superClassValue; 

    public SuperClass() { 
     superClassValue = implicitValue(); 
    } 

    public int implicitValue() { 
     return 10; 
    } 

    public int getValue() { 
     return superClassValue; 
    } 
} 

class SubClass extends SuperClass { 
    private int subClassValue; 

    public SubClass() { 
     subClassValue = 20; 

    } 

    public int implicitValue() { 
     return subClassValue; 

    } 
} 

class Example { 
    public static void main(String argv[]) { 
     SubClass ss = new SubClass(); 
     System.out.println("The value is " + ss.getValue()); 

    } 
} 

답변

3

TL; DR

문제 subClassValue = 20; 하위 클래스 생성자에서 실행되기 전에 그 subClassValue의 디폴트 값을 반환되도록 SubClass에서 implicitValue는, implicitValue() 방법을 통해 수퍼 암시 수퍼 클래스 생성자 (super())에 의해 사용되는 인 int위한 필드는 0입니다.


는 서브 클래스의 생성자는 슈퍼 클래스의 생성자를 사용합니다 하는가?

예, 시작에서 하위 클래스 생성자는 항상

public SubClass() { 
    subClassValue = 20; 
} 

이 같은

public SubClass() { 
    super();//superclass constructor 
    subClassValue = 20; 
} 

같다하지만 당신의 코드를 살펴 수 있습니다 슈퍼 클래스 생성자, 그래서 코드를 호출합니다. 당신은 당신이 superClassValue의 값을 반환시피 당신의 슈퍼 클래스

public int getValue() { 
    return superClassValue; 
} 

에 존재 getVlaue() 방법의 결과를 인쇄 할 수 있습니다. 당신은 당신이 ss 인스턴스를 생성하는, 그래서 당신은 당신이 implicitValue() 방법의 반환 값으로 초기화됩니다 그래서

public SuperClass() { 
    superClassValue = implicitValue(); 
} 

this.superClassValue처럼 보이는 슈퍼 클래스의 생성자를 호출하는 것을 의미 코드

super();//superclass constructor 
subClassValue = 20; 

를 호출 할 getVlaue()를 호출하기 전에 , dynamic binding (늦은 바인딩) 때문에 JVM은 실제 클래스 this에서 시작하여 SubClass 인이 메소드의 구현을 검색하려고 시도합니다.이 클래스는 자체 재정의 덴 버전은이

public int implicitValue() { 
    return subClassValue; 
} 

를 호출하지만 subClassValue은 아직 아무것도에

super();// <-- we are still here 
subClassValue = 20;// this line was not executed yet 

그래서 subClassValue 여전히 의미 기본값 0을 가지고 설정되지 않았습니다 그래서

superClassValue = implicitValue(); //will be initialized with 0; 

public int getValue() { 
    return superClassValue; 
} 

0을 반환합니다.

-1

Override 메서드 또는 하위 클래스에 문제가있는 것 같습니다. 그것은 변수를 구현할 때처럼 들리므로 값이 인스턴스화되지 않아 기본값 0이 된 다음 수퍼 클래스를 제거하면 값 10을 얻습니다.

1

예, 하위 클래스 생성자 그런 호출이 명시 적으로 주어지지 않으면 암시 적으로 수퍼 클래스 생성자를 호출합니다. 그러나 0implicitValue 메서드가 SubClass에서 재정의 되었기 때문에 인쇄됩니다.

  1. 수퍼 클래스 생성자가 호출됩니다. 여기에서 객체의 일부인 SuperClass이 생성됩니다. 모든 변수가 초기화됩니다. 명시 적 값이 없기 때문에 컴파일러는 의 기본값 인 0을 제공합니다. 그런 다음 수퍼 클래스 생성자는 서브 클래스의 메서드를 호출하는 implicitValue()을 호출합니다. 이 메서드는 0으로 초기화 된 superClassValue을 반환합니다. 이 값은 superClassValue에 명시 적으로 다시 할당됩니다.
  2. 하위 클래스는 subClassValue10으로 초기화합니다.
  3. getValue() 메서드가 호출되며 superClassValue0을 반환합니다. The value is 0이 인쇄됩니다. 당신이 SubClassimplicitValue 방법을 제거한다면

, 그것은 10을 반환하는 방법의 SuperClass의 버전을 상속합니다. 당신이 5를 반환하는 SubClass에서 implicitValue 방법을 수정한다면

, 그것은 5superClassValue을 초기화 할 것이며, 그것은 The value is 5를 인쇄 할 것이다.

1
  1. 귀하의 경우 : SuperClass 생성자가 기본적으로 호출됩니다.

  2. Java 프로세스 인 경우 : new SubClass(). 먼저 SuperClass 생성자를 호출합니다. SuperClass의 생성자가 호출 될 때 - implicitValue()의 값 반환이 superClassValue에 지정됩니다 - 호출되는 메소드 implicitValue()는 생각한대로 SupperClass가 호출되지 않는 SubClass 메소드입니다 (OOP의 다형성 기능) . SubClass의 implicitValue()가 호출 될 때 subClassValue가 아직 초기화되지 않았으므로 (subClassValue = 20, 아직 실행되지 않음) subClassValue는 여전히 0입니다. 그것이 출력에서 ​​Zero를 보는 이유입니다.

  3. SubClass에서 override implicitValue를 제거 할 때. 호출되는 implicitValue()는 SupperClass의 implicitValue입니다. -> 이것이 출력에서 ​​10을 보는 이유입니다.