2013-07-06 2 views
3

다형성 개념에 대해 혼란 스럽습니다. 아무도 나를 도울 수 없습니까? 여기다형성 이해하기가 어려움

class A { 
    int i=2; 
    void display() { 
     System.out.println("display method of A"); 
    } 
} 

class B extends A { 
    int i=1; 
    void display() { 
     System.out.println("display method of B"); 
    } 
} 

public class M { 
    public static void main(String[] arg) { 
     A a=new A(); 
     System.out.println(a.i); 
     a.display(); 

     a=new B(); 
     System.out.println(a.i); 
     a.display(); 
    } 
} 
 
O/p: 2 
    display method of A 
    2 
    display method of B 

이해 단순 코드이다 참조 변수 'A'타입 'A'제를 선언하고는 'A'의 오브젝트를 참조. 프로그램이 'a.i'를 인쇄 할 때 A의 변수 'i'를 인쇄하고 display가 a.display()로 호출되면 클래스 A의 화면을 호출합니다. 그 미세한 여기

문제 부까지 : 이제 참조 변수 타입 B의 'A'객체 인쇄 a.i , 클래스 A에서 여전히 지문 '나'의 값을 할당 할 때 (즉 2). 그러나 디스플레이 함수를 a.display()로 호출하면 메소드 B의 표시를 호출합니다.

내 연구 : 참조 변수를 사용하여 멤버 변수에 액세스 할 때마다 액세스 할 때 참조 변수 유형이 검사됩니다. 레퍼런스 변수를 사용하는 메소드를 호출 할 때 객체 타입은 런타임에 평가됩니다 (이것은 다형성이라고 생각합니다). 객체 유형에 따라 특정 메소드가 호출됩니다.

맞습니까, 아니면 다른 개념이 관련되어 있습니까? 그리고 무엇이 다형성인지를 자세히 알고 싶습니다. 응용 프로그램입니다. OOP 및 Java의 기본 개념에 대한 책을 추천 해 주시면 큰 도움이됩니다.

+0

이 문제로 인해 일반적으로 클래스 및 해당 하위 클래스의 비공개 필드에 동일한 식별자를 사용하지 않는 것이 좋습니다. –

+0

그래, 슈퍼 클래스 변수가 private이 될 때까지 하위 클래스와 수퍼 클래스에서 같은 변수를 선언하는 용도는 없다는 것을 이해합니다. 하지만 인터넷에서 샘플 코드를 작성하여 동작을 테스트하면서 더 다형성을 이해하는 데 더 도움이되었습니다. –

답변

2

다형성은 필드가 아닌 인스턴스 메소드에만 적용됩니다. 따라서 a.i (여기서 aA 유형 임)은 하위 클래스 개체 B을 가리키는 지 여부와 관계없이 항상 2을 인쇄합니다.

+0

답변 해 주셔서 감사합니다. 나는 다형성이 변수에 적용되지 않는다는 것을 생각하고 있었다. –

+0

@RohanPujari 네, 결론은 옳았다. 이 질문에 대한 답변을 수락하십시오. 감사. –

0

당신은 당신이 상속에서해야하는 것을 오해하고 있습니다. extends은 지혜롭게 선정 된 예약어입니다. B가 A를 확장하는 지점은 B가 추가 속성이있는 A의 부분 집합이라고 말하는 것입니다. B에서 i을 다시 정의하지 않아도됩니다. A는 i을 처리해야합니다. 하위 클래스에서 i을 재정의하면 수퍼 클래스의 필드 i이 숨겨집니다 (i이 다른 변수 유형을 참조하는 경우에도 마찬가지입니다).

void display() 
    { 
     System.out.println("Display method A/B: " + i); 
    } 

    A a=new A(); 
    a.display(); //Display method of A: 2 , since the i field in A is initialized to 2 

    a=new B(); 
    a.display(); //Display method of B: 1, since the i field in B is initialized to 1 

내가 오라클은 자신의 tutorial on polymorphism에서 꽤 좋은 일을 생각하지만, inheritance로 시작하는 것이 도움이 될 수 있습니다

A a=new A(); 
    a.display(); 
    System.out.println(a.i); //2 , since the i field in A is initialized to 2 

    a=new B(); 
    a.display(); 
    System.out.println(a.i); //2, since the i field in A is initialized to 2 

대신하는 경우가 B는 것으로, Adisplay()을 재정의.