package p7;
public class Main_polymorphism {
public static void main(String[] args) {
// 다형성 : 참조변수는 본인의 타입을 포함해서 모든 자손을 받을 수 있다.
// 1. 일반적인 경우
AAA a = new AAA();
a.printA();
BBB v1 = new BBB();
BBB v2 = null; // 참조 주소에 null을 넣을 수 있으니까는~
// BBB b2 = new AAA(); --> 이건 당연히 안되겠지. type mismatch
double d = 1; // 이것도 type mismatch인데, 자동으로 type casting이된거임.
// 2. 다형성의 경우
AAA aaa;
aaa = new AAA(); // 당연히 되는것
aaa = new BBB(); // ★★★★ 이게 다형성 (type mismatch여도 알아서 casting된거.)
BBB bbb;
// bbb = new AAA();
// --> 이건 또 안돼. (엄마는 아들을 호출할 수 있지만, 아들은 엄마를 호출할 수 없군!)
// 3. 주의사항
AAA a1 = new AAA();
AAA a2 = new BBB();
// a2 변수는 AAA 클래스의 참조 변수이지만, 실제로는 BBB 클래스의 객체를 가리키고 있음 ★★★
// a2.b1 = 10; ---> 1) 문법적으로는 선언할 수 없는 코드.
// 2) 실제 런타임에서는 구현이 가능함. 이 코드를 왜쓰는거야?
// --> 아직까지는 의미없는 코드. (오버 라이딩을 배워보자!)
BBB b1 = new BBB();
b1.printA();
b1.printB();
System.out.println(b1.a1); // 5
// b1. ---> AAA의 인스턴스까지 다 쓸 수 있음
// a2. ---> BBB의 인스턴스를 못쓴다
}
}
class AAA{
int a1 = 5;
int a2;
void printA() {
System.out.println("프린트 A 매소드");
}
}
class BBB extends AAA{
int b1;
int b2;
void printB() {
System.out.println("프린트 B 매소드");
}
}