2011-07-29 2 views
2

수퍼 클래스 A와 서브 클래스 B 모두 변수 abc는 각각 10과 20이고 callme()는 서브 클래스에서 재정의됩니다. 내가왜 java ref vars는 변수가 ref 변수 유형을 기반으로하는 실제 객체를 기반으로 메소드를 호출합니까?

a.callme() -> calls B's method 
b.callme() -> calls A's method. 

를 작성하는 경우 그때

A a = new B(); 
B b = B(new A()); 

을 할 경우 방법은 실제 객체를 기반으로 호출되기 때문에

이입니다. 내가

str = a.abc; // will print 10 , based upon ref var type A 

str = b.abc; // will print 20 , based upon ref var type B 

을 할 경우 왜 이런 차이는

입니까? 왜 메소드와 변수 모두 실제 객체를 기반으로 액세스하지 않습니까?

답변

2

가 기억

감사는, 인스턴스 변수가 를 오버라이드 (override)되지 않습니다, 그들은 숨겨져 있습니다. 이는 인스턴스 변수에 액세스 할 것인지 결정하는 참조 유형입니다.

하위 클래스에서 callme() 메서드는 사용할 수 없습니다. 따라서 동적 메서드 디스패치 메커니즘에 따르면 런타임에 호출 할 메서드를 결정하는 것은 개체 유형입니다. 왜냐하면 런타임에 객체가 생성되기 때문입니다.

예컨대

class A { 
     int abc = 10; 

     public void callme() { 
      System.out.println("In class A"); 
     } 
    } 

class B extends A { 
     int abc = 20; // hidden, not overidden 

     public void callme() { 
      System.out.println("In class B"); 
     } 

     public static void main(String [] args) { 
     A a = new A(); 
     a.callme(); // calls A's callme() method. 

     B b = new B(); 
     b.callme(); // calls B's callme() method. 
     } 
} 
+0

일부 설명은 (http://download.oracle.com/javase/tutorial/java/IandI/hidevariables.html) –

+0

나는 그것에 대해 알고 있었다. 하위 클래스 인스턴스 변수는 수퍼 클래스 변수를 동일한 이름으로 숨 깁니다. –

+0

나는 분명히 물어볼 수 없었다고 생각한다. 나는 필드가 서브 클래스 필드로 숨겨진다는 것을 이해했다. 그게 정확한 논리 응답이야. 나는 왜 메소드와 필드가 객체 참조 변수 유형과 실제 객체 유형에 기반하여 호출되는지에 대해 물어보고 싶습니까? 이것은 뭔가 방법과 필드가 메모리에 저장되는 방법과 관련이 있습니까? 아무도 이것을 설명 할 수 있습니까? –

0

필드 값은 단지/객체를 저장하는 동안 방법은 구현이있다. 메소드의 구현을 오버라이드 (override) 할 수있는 것이 합리적입니다. 그러나 필드를 "무시"할 필요는 없습니다. 하위 클래스에서 선언을 제거하고 수퍼 클래스의 필드를 사용하지 않는 이유는 무엇입니까?

한편 방법을 숨길 수도 있습니다. 그러나 그들을 비공개로 만들어야합니다. [오라클 자바 튜토리얼]에서 필드를 숨기고에 대한

class OuterClass { 
    void test() { 
     InnerSubClass isc = new InnerSubClass(); 
     isc.m(); // prints "In subclass" 
     ((InnerSuperClass) isc).m(); // prints "In superclass" 
    } 
    class InnerSuperClass { 
     private void m() { 
      System.out.println("In superclass"); 
     } 
    } 
    class InnerSubClass extends InnerSuperClass { 
     private void m() { 
      System.out.println("In subclass"); 
     } 
    } 
} 
관련 문제