2012-05-02 3 views
1

나는이 개 수업이 있습니다특성 및 다형성

public class Increase { 
public int a=3; 
public void add(){ 
    a+=5; 
    System.out.println("f"); 
} 
} 

class SubIncrease extends Increase{ 
    public int a=8; 
    public void add(){ 
     a+=5; 
     System.out.println("b" + a); 

    } 
} 

을하지만

Increase f=new SubIncrease(); 
    System.out.println(f.a); 
    f.add(); 
    System.out.println(f.a); 

을 실행할 때 나는이 출력을 가지고 :

3 
b13 
3 

사람이 이런 이유를 이해하는 데 도움이 수를 ? a 속성의 값은 두 번째 outpuy 행에 표시된 것처럼 add 메소드에서 변경되었습니다 ... 원래 값으로 돌아간 이유는 무엇입니까?

답변

5

Java에서 필드는 무시되지 않고 숨겨져 있습니다. 즉, Increase.aSubIncrease.a별도 필드이며 별도로 변경하고 쿼리 할 수 ​​있습니다. 변수 f의 유형이 Increase이므로 표현식 f.a은 수퍼 클래스 필드의 값을 반환합니다. 그러나 add() 메소드 이며, f.add()은 subclass 메소드를 호출하여 서브 클래스 필드를 수정합니다.

필드를 숨기는 것은 거의 의미가 없으므로 피해야합니다. 서브 클래스에 다른 기본값이있는 필드를 가지려면 수퍼 클래스에서만 필드를 정의하고 서브 클래스 생성자에서 필드에 값을 할당하십시오.