2011-09-09 4 views
1

I 클래스가해야한다고 생각하는 방법을 작동하지 않는 나는 새로운 ANDGate 객체를 호출 할 때 그러나슈퍼 생성자 나는 그것이

public class ANDGate extends LogicGate { 

    private OutputTerminal output; 
    private Terminal input0; 
    private Terminal input1; 

    public ANDGate() { 
     super("images/AND.gif"); 
     System.out.println(this.output); 
    } 
} 

output는 때를 널 슈퍼 생성자에 따라 할당되어야합니다.

이제 확실히 하위 클래스 생성자를 이해할 수 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

7

이 상황을 field hiding이라고합니다. 서브 클래스 필드 output은 수퍼 클래스에서 같은 이름의 필드를 숨기고 있습니다.

당신은 당신의 슈퍼 클래스 하위 클래스 모두에서

private OutputTerminal output; 

을 정의했습니다. 하위 클래스의 output에 대한 참조는 해당 필드에 있지만 상위 클래스에서 출력을 설정하고 있습니다. 하위 클래스 필드는 null로 유지됩니다.

를 해결하려면 :

  • 는 서브 클래스에서
  • 변화 protected에 슈퍼 클래스의 output의 선언 (그래서 서브 클래스가 액세스 할 수 있습니다)
+0

음. 고마워 –

3

모두를 output의 선언을 삭제 출력 변수는 각 클래스에 로컬입니다. 그들은 두 개의 다른 멤버를 나타냅니다.

당신은 오히려 class ANDGate에서

private OutputTerminal output; 

을 제거하고 단순히

System.out.println(output); 

슈퍼 클래스에

private OutputTerminal output; 

protected을 확인하십시오.

1

super 클래스의 클래스 변수를 protected로 설정하고 system.out.println() 행에서 'this'대신 'super'키워드를 사용할 수 있습니다.

예제 코드.

//superclass 
class A { 
protected int a; 

public A(){ 
    a=50; 
} 
} 

//sublcass 
class B extends A{ 

private int a; 

public B(){ 
    super(); 
    System.out.println(super.a); 
} 

} 모든 고정

관련 문제