class Car {}
class FireEngine extends Car {}
class Ambulance extends Car {}
만일 위와 같이 Car 클래스가 있고, 이를 상속받는 FireEngine, Ambulance 클래스가 있을 때, FireEngine 타입의 참조변수 f는 조상타입인 Car로 형변환 가능. 반대로 Car타입의 참조변수를 자손타입인 FireEngine으로 형변환 하는 것도 가능.
→ 그러나, FireEngine과 Ambulance는 상속관계가 아니므로 형변환이 불가
서로 상속관계에 있는 타입간의 형변환은 양뱡향 자유롭게 수행되지만 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용 불가
FireEngine f = new FireEngine();
Car c = (Car)f; //OK.조상인 Car타입으로 형변환(생략가능)
FireEngine f2 = (FireEngine)c; //OK. 자손인 FireEngine타입으로 형변환(생략불가)
Ambulance a = (Ambulance)f; //에러.상속관계가 아닌 클래스 간의 형변환 불가
Car c = (car) f;
//f의 값(객체의 주소)을 c에 저장. 타입을 일치시키기 위해 형변화 필요(생략가능)
f = (FireEngine) c;
//조상타입을 자손타입으로 형변환 하는 경우 생략 불가
▶ 조상타입으로의 형변환을 생략할 수 있는 이유는 조상타입으로 형변환하면 다룰 수 있는 멤버의 개수가 줄어들기 때문에 안전함
package 자바의정석;
public class Ex7_7 {
public static void main(String[] args) {
Car car = null;
FireEngine fe = new FireEngine(); //FireEngine객체를 생성
FireEngine fe2 = null;
fe.water();
car = fe; // car = (car)fe;에서 형변환 생략함.fe의 값을 car에 저장
// car.water(); → 컴파일 에러. Car타입의 참조변수로는 water()를 호출할 수 없음
fe2 = (FireEngine) car; // 자손타입 ← 조상타입. 형변환 생략 불가
fe2.water();
}
}
class Car {
String color;
int door;
void drive() { // 운전하는 기능
System.out.println("drive, Brrrr~");
}
void stop() { // 멈추는 기능
System.out.println("stop!!");
}
}
class FireEngine extends Car { // 소방차
void water() { // 물을 뿌리는 기능
System.out.println("water!!");
}
}
water!!
water!!