짧고 점진적이며 작은 정보를 일관성 있게 배운다.
업 캐스팅의 경우 부모 클래스의 parent 객체는 자식클래스에서 오버라이딩된 메소드를 쓸 수 있다. 반면, 자식클래스에서 새롭게 정의된 메소드는 사용하지 못한다.
package upcasting;
class Parent {
int money = 100000000;
String husband = "husband";
Parent() {
}
void sound() {
System.out.println("부모 : 밥 먹고 가렴~");
}
void behavior1() {
System.out.println("부모 : 트로트 듣기");
}
}
class Child extends Parent {
int money = 0;
String friend = "friend";
Child() {
}
@Override
void sound() {
System.out.println("자식 : 간헐적 단식 중 이예요~");
}
void behavior2() {
System.out.println("자식 : 학교 가기");
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Child();//업캐스팅
parent.behavior1();//부모 클래스에서 메소드 호출 가능
parent.behavior2();//자식 클래스에서 메소드 호출 "불"가능 ,에러 발생
System.out.println(parent.friend);//자식 필드를 이용할 수 없음, 에러발생
parent.sound();//자식에서 오버라이딩 된 메소드가 결과로 나옴
System.out.println(parent.money);//부모 클래스의 필드 값이 나옴
Child child = (Child) parent;//다운 캐스팅
child.sound();//자식 메소드가 나옴
child.behavior1();//부모 메소드 사용가능
child.behavior2();//자식 메소드 사용가능
System.out.println(child.husband);//부모 husband 출력
System.out.println(child.money);//자식 클래스의 필드 값이 나옴
}
}
parent객체는 child 자식 클래스의 behavior2()를 사용하지 못한다. 또한 friend 필드를 사용하지 못한다.
child객체는 부모 클래스의 필드와 메소드를 사용할 수 있다.
참고로 부모 클래스와 자식클래스가 같은 이름의 메소드가 존재한다면 @override라는 어노테이션을 주지 않아도 자동으로 오버라이딩된다.