2012-12-21 2 views
3

방금 ​​자바를 배우기 시작 했으므로 그 대답이 다소 분명한 경우 저와 함께하시기 바랍니다. 나는 약간의 연구를했으나 아무 소용이 없었다.속성에 대한 Java 필드 숨기기

내가 이해 한 바로는 속성은 무시되지 않고 필드 만 숨겨졌습니다. 수퍼 클래스 또는 서브 클래스의 속성이 사용되는지 여부를 판별하려면 Java가 참조 유형을 점검합니다.

가 그럼 난에서 여기에 출력을 서 있지 않습니다 : 그것은 나에게주는

public class Super { 
    String str = "I'm super!\n"; 

    public String toString() { 
     return str; 
    } 
} 

public class Sub extends Super { 
    String str = "I'm sub.\n"; 
} 

public class TestFH { 
    public static void main(String[] args) { 
     Sub s1 = new Sub(); 

     System.out.printf(s1.toString()); 
    } 
} 

:

I'm super! 

나는 내가 방법 오버라이드를 통해 쉽게 원하는 것을 달성 할 수 있음을 이해합니다. 나는 두포에서 일어나는 일에 대해서 궁금해. 사전에

감사합니다.

+0

출력이 무엇을 기대 했습니까? –

+0

@RohitJain 하위 클래스 참조 (s1)에서 메소드를 호출하므로 "하위입니다."라고 예상했습니다. – Boyang

답변

3

s1.toString()을 호출하면 Super 클래스에만 정의 된 toString() 메서드를 찾을 수 있습니다. 따라서이 메서드를 사용하면 수퍼 클래스 메서드가 하위 클래스에서 사용할 수 있으므로이 메서드를 사용하면됩니다. 수퍼 클래스 메서드 toString()은 메소드의 반환 값으로 자신의 클래스 변수 str (값이 수퍼 클래스로 초기화 됨)을 사용하므로 결과적으로 동작은 I'm super!입니다.

출력을 I'm sub.\n으로 가져 오려면 수퍼 클래스와 동일한 변수를 다시 사용하고 새 문자열 값인 I'm sub.\n을 할당해야합니다.

public class Super { 
    String str = "I'm super!\n"; 

    public Super(String stringValue){ 
     this.str = stringValue; 
    } 

    public String toString() { 
     return str; 
    } 
    } 

    public class Sub extends Super { 
    public Sub(){ 
     super("I'm sub.\n"); 
    } 
    } 

    public class TestFH { 
    public static void main(String[] args) { 
     Sub s1 = new Sub(); 
     System.out.printf(s1.toString()); 
    } 
    } 
+0

이것이 내가 알고 싶은 것입니다. 감사! – Boyang

1

이 호출은 슈퍼 클래스를 사용하고 있습니다 : 그것은 단지 같은 이름을 가지고 어떻게 다른 변수를 선언하고, 서브가str를 오버라이드 (override)되지 않는다는 것을

Sub s1 = new Sub(); 
System.out.printf(s1.toString()); 

이유입니다. 즉, sub는 변수를 Super에 숨기고 있습니다 (데이터 멤버는 다형성이 아닙니다).

다른 것들을 의미하는 경우 다른 이름을 지정할 수 있습니다. 또는 Sub에 getter 메서드를 사용하여 부모 특성에 액세스 (또는 수정) 할 수도 있습니다.

+0

그래서 수퍼 클래스에 정의 된 메소드를 호출 할 때마다 서브 클래스의 필드가 아닌 수퍼 클래스의 필드가 사용됩니까? – Boyang

1

당신이 공유 슈퍼 클래스 필드 "I'm sub.\n", 당신은 하위 클래스에 지역 필드를 생성하고 그 대신에 할당하고, 리터럴 문자열을 지정하지 않을 : 최고의 옵션으로 생성자를 사용하는 것입니다. 예를 들어

,

public class EncapsulationDemo { 

    public static void main(String[] args){ 
     MySuperObject obj = new MySubObject(); 

     System.out.println(obj); // prints I'm sub. 
    } 

    private static class MySuperObject{ 
     String str = "I'm super."; // protected, can be accessed directly 
            // by subclasses 

     @Override 
     public String toString(){ 
      return str; 
     } 
    } 

    private static class MySubObject extends MySuperObject{ 
     MySubObject(){ 
      super(); 
      str = "I'm sub."; // assign to superclass field 
     } 
    } 
} 

자세한 내용은 Controlling Access to Members of a Class를 참조하십시오.

2

자녀 클래스에 str을 숨기고 있습니다 (섀도 잉). 하위 클래스에서 toString()을 재정의하지 않았으므로 상위 클래스에서 호출되고 부모의 str이 표시됩니다.이 그랬다면

:

public class Sub extends Super { 
    public Sub() { 
     this.str = "I'm sub.\n"; 
    } 
} 

을 그것은 당신이 출력을 기다리고있어 것입니다 무슨.

관련 문제