2016-11-03 9 views
1

나는 Java의 상향식 캐스팅과 다운 캐스팅에 대해 설명하는 많은 기사와 질문이 stackoverflow에 있음을 알았다. 그리고 나는 기상 예보와 다운 캐스팅이 무엇인지 알았습니다. 하지만 제 질문은 그것에 구체적이지 않습니다.Java - Upcasting and Downcasting

업 캐스팅 - 하위에서 상위로 변환 - 컴파일러가 처리합니다. 아이에게 부모로부터 변환 - - 없음 캐스트
Downcasting을 할 필요가 없습니다 명시 적 캐스트가

public class Animal { 

    public void getAnimalName(){ 
     System.out.println("Parent Animal"); 
    } 
} 
public class Dog extends Animal{ 

    public void getDogName(){ 
     System.out.println("Dog"); 
    } 
} 

public static void main(String[] args) { 

     Dog d = new Dog(); 
     Animal a = d; // Upcasting 
     a.getAnimalName(); 

     Animal vv = new Dog(); 
     Dog cc = (Dog)vv;//DownCasting 
     cc.getAnimalName(); 
     cc.getDogName(); 



필요합니다 당신이 각각 getAnimalName()getDogName() 같은 자신의 방법을 가지고있는 AnimalDog 클래스로 보면 . 따라서 Dog extends Animal (is-a 관계)이므로 파생 클래스 (Subclass)에서 기본 클래스 (수퍼 클래스) 메서드를 사용할 수 있습니다.

이제 Main Method에서 아래 코드를 고려하십시오
그래서 여기에서 Dog 개체를 생성합니다. Animal입니다. 그래서 내가 파생 클래스

public class Dog extends Animal{ 

    @Override 
    public void getAnimalName(){ 
     System.out.println("Parent Animal overridden here"); 
    } 
    public void getDogName(){ 
     System.out.println("Dog"); 
    } 
}<br> 

으로 그리고 홈페이지 방법에 기본 클래스의 메소드를 오버라이드 (override)하고 싶은 만 Animal 속성 (메소드) 이제

Dog d = new Dog(); 
Animal a = d; // Upcasting 
a.getAnimalName();<br> 
O/P : Parent Animal<br><br> 

의가 있다고 가정 해 봅시다에 액세스 할 수 있습니다 , 나는 Dog 개체 WRT Animal을 만드는거야 비록

Dog d = new Dog(); 
Animal a = d; // Upcasting 
a.getAnimalName();<br> 
O/P : Parent Animal overridden here<br><br> 


, B 여기에 dervied 클래스에서 재정의 된 기본 클래스 메소드가 인쇄됩니다.

O/P : Parent Animal overridden here<br> 

왜 이렇게 행동하는지 궁금합니다. 이게 override일까요?

귀중한 의견을 제공해주세요.

+1

참조 변수가 아닌 참조 유형에 따라 인스턴스 메서드가 호출됩니다. 메서드를 재정의하지 않으면 클래스에옵니다. 하지만 기본 클래스에서 오버라이드하면 기본 클래스에서 가져온 것이 아닙니다. –

+0

_ "하지만 여기에서는 기본 클래스 메서드"_ -를 인쇄합니다.이 클래스는 기본 클래스 메서드가 호출되고 있다고 생각되는 것처럼 읽습니다. 당신의 말씨에 더주의를 기울이고 당신이 의미하는 바를 명확히하십시오. –

답변

0

부모 클래스로 하위 클래스를 참조하면 참조 포인터에서 메서드 호출이 하위 클래스 메서드를 호출합니다.

Dog d = new Dog(); 
Animal a = d; // Upcasting 
a.getAnimalName(); 

여기에서 a.getAnimalName(); 하위 클래스의 getAnimalName() 메서드를 기본 클래스에서 상속하므로 하위 클래스의 메서드가 호출되므로 하위 클래스의 getAnimalName() 메서드를 호출합니다. 하위 클래스의 상속을 통해 기본 클래스에서 직접 호출되지는 않습니다. 재정의하면 하위 클래스에서 즉시 호출되므로 메서드의 존재를 확인하기 위해 부모 클래스로 이동할 필요가 없습니다.

하지만 기본 클래스 참조는 기본 클래스에서 정의되지 않은 하위 클래스의 메서드를 호출 할 수 없다는 점이 다릅니다.

0
Animal a = d; 

이 줄은 Animal 개체가 Dog 클래스 (Dog d = new Dog();)의 인스턴스를 가리 키도록합니다. 따라서 함수를 호출하면 클래스 dog의 함수를 호출합니다.

실제로 Dog 클래스 Dog d = new Dog();의 인스턴스를 만들었습니다.그런 다음 클래스 Animal의 객체를 만들고 Dog 클래스의 인스턴스를 가리키게합니다. Animal a = d;