◇ Lvalue의 상위 클래스(father)이고, Rvalue가 하위 클래스(son:father을 상속받은)로 메모리를 생성할 때
별도의 타입캐스팅이 없이 가능.
father fa = new son();
◇ 이 때 fa의 참조변수로 메소드의 호출 시에는 son 클래스의 메소드가 호출 됨.
단, son 클래싀 모든 메소드에 접근 가능한 것은 아니며, father 클래스가 가지고 있는 명세에 있는 메소드만
호출 가능이 가능하다.
◇ 반대로 Lvalue 가 하위 클래스(son)이고, Rvalue가 상위 클래스(father)로 메모리를 생성 할 때는 타입 캐스팅
을 하지 않으면, 에러. 그러나, 타입캐스팅을 해서 생성한다고 해도 실제 사용 시에 런타임 에러 발생.
즉, 실제적으로 사용 불가함.
1. son s = new father(); // 컴파일 에러
2. father f = new father();
son s = (son)f ; // 런타임 에러 ClassCastException
3. son s = (son)new father(); // 런타임 에러 ClassCastException
◇ 그러나 다음과 같은 경우에는 사용 가능함.
father fa = new son();
1. son s = (son)fa;
s.show(); // 사용 가능. 메모리 공간에 생성된 것이 son 클래스임..
2. ((son)fa).show();
◇ 사전에 캐스트가 가능한지 확인.
검사객체 instance of 타입명 → 타입명의 참조변수에 검사객체를 캐스팅할 수있는지
ex) son s = new son();
father f = new father();
→ s instanceof father : true → father 참조변수에 s를 캐스팅해서 넣을 수 있음.
→ f instanceof son : false → son 참조변수에 f를 캐스팅해서 넣을 수 없음.
※ 타입명이 검사객체와 같은 클래스이거나 상위 클래스 일 경우에 true가 됨.
Ex)
class father{ }
class son extends father{ }
class Test {
public static void main(String args[]) {
son s = new son();
father f = new father();
System.out.println("son instance of father : "+ (s instanceof father));
System.out.println("father instance of father : " + (f instanceof son));
}
}