한 가지의 타입이 여러 가지 형태의 인스턴스를 가질 수 있는 것
부모 자식간의 casting(형 변환)
자식 클래스의 객체가 부모클래스의 참조 변수로 형 변환 되는 것(아래에서 위로 올라간다.)
→ 동적 바인딩(컴파일 시점에선 부모클래스의 필드로 인지하나, 런타임 시점에선 자식클래스의 필드로 호출할 메서드를 묶는 것
부모클래스 변수 = 자식 객체값;
Student클래스의 grade는 업캐스팅이 불가하다.
왜냐면 부모 클래스인 Human에는 관련 매개변수가 없기 때문
name, age, hobby는 부모 클래스에도 있기 때문에 내용이 추가되어도 업캐스팅이 됨
public static void main(String[] args) {
Student st1 = new Student("가길동",13,"게임하기", 3);
st1.info();
//업캐스팅
Human h1 = new Student("나길동", 17,"롤하기",3);
h1.info();
}
}
class Human {
String name;
int age;
String hobby;
public Human(String name, int age, String hobby) {
super();
this.name = name;
this.age = age;
this.hobby = hobby;
}
void info() {
System.out.println("name:"+name);
System.out.println("age:"+age);
System.out.println("hobby"+hobby);
}
}
class Student extends Human{
int grade;
public Student(String name, int age, String hobby, int grade) {
super(name, age, hobby);
this.grade = grade;
}
void info() {//오버라이딩
super.info();
System.out.println("grade:"+grade);
}
}
업 캐스팅 된 부모클래스의 객체가 자식클래스의 참조 변수로 형 변환 되는 것
자식 클래스 변수 = (자식 클래스) 업 캐스팅 된 부모 참조변수;
(주의사항)
1. 업캐스팅 된 변수만 가능
2. 명시적 형 변환
위 예시에서 다운캐스팅을 한다면,
Student st1 = new Student("가길동",13,"게임하기", 3);
//업캐스팅
Human h1 = new Student("나길동", 17,"롤하기",3);
//다운캐스팅
Student s1 = (Student)h1;
public static void main(String[] args) {
Animal lion1= new Lion();
Animal rabbit1= new Rabbit();
Animal monkey1= new Monkey();
ZooKeeper james = new ZooKeeper();
james.feed(lion1);
james.feed(rabbit1);
james.feed(monkey1);
}
}
class Animal{
void breath() {System.out.println("숨쉬기");}
}
class Lion extends Animal{
public String toString() {
return "사자";
}
}
class Rabbit extends Animal{
public String toString() {
return "토끼";
}
}
class Monkey extends Animal{
public String toString() {
return "원숭이";
}
}
class ZooKeeper{
void feed(Animal animal) {
System.out.println(animal+"에게 먹이주기");
}
}