부모클래스 변수명 = new 자식클래스();
ex)
[Phone]
/ \
[FeaturePhone] [SmartPhone]
/ \
[Android] [Apple]
/ \
[galaxy] [Iphone]
1. Phone p1 = new Phone();
2. SmartPhone p2 = new SmartPhone();
3. [부모]Phone p3 = new [자식]SmartPhone();
4. [부모]Phone p4 = new [자식]FeaturePhone();
5. SmartPhone p5 = new FeaturePhone(); // 상속관계가 아니므로 불가
1.
class Tv{
boolean power;
int channel;
class SmartTv extends Tv{
String text;
void caption(){}
}
ex1) SmartTv s = new SmartTv();
SmartTv는 Tv를 상속하였으므로
자신이 갖고 있는
text, caption
뿐만 아니라 Tv의
power, channel 까지 참조
ex2) Tv t = new SmartTv();
SmartPhone 객체 생성 후, Tv의 인스턴스인
t는 SmartTv 객체를 가르키지만, Tv타입이기 때문에
Tv클래스 멤버인
power, channel
에만 접근 가능
Object o1 = new Iphone();
Object o2 = new FeaturePhone();
자식클래스 변수명 = (자식클래스) 부모클래스인스턴스;
class Car{
void start(){}
void stop(){}
void drive(){}
}
class SUV{
void driveOffRoad(){}
}
1. Car car = new SUV();
/* 업캐스팅
* SUV객체 안에서 start, stop, drive 메서드 참조 가능
*/ SUV 고유의 메서드인 driveOffRoad 참조 불가
2. SUV suv = (SUV)car;
suv.driveOffRoad();
혹은
((SUV)suv).driveOffRoad();
/* 다운캐스팅
* 자식클래스인 SUV객체 내에서 부모클래스인 Car의 메서드만 참조 할 수 있었던
* 변수 suv를 잠시 SUV의 메서드도 참조 할 수 있게 함
* 변수 suv의 주소값은 그대로이므로 Car의 메서드 접근에는 아무 제한 없음
*/ 단, 한번 업캐스팅을 하면 다운캐스팅 할 때마다 묵시적 형변환이 필요함
객체 instanceof 클래스
class A{}
class B extends A{}
class example{
A a = new A();
B b = new B();
System.out.println(a instanceof A); // true. A는 a타입으로 형변환 가능
System.out.println(a instanceof B); // false. B는 a타입으로 형변환 불가
System.out.println(b instanceof A); // true. A는 b타입으로 형변환 가능
System.out.println(b instanceof B); // true. B는 b타입으로 형변환 가능
}
if( b instance of A ){
// 참일 경우 실행 될 수행문
System.out.println("A는 b로 형변환이 가능하다");
}