class Parent{
public int i = 5;
public void printII(){
System.out.println("parent - printII() : " + i*2);
}
public void printI(){
System.out.println("parent - printI() : " + i);
}
}
class Child extends Parent{
public int i = 15; // 필드에 대한 오버라이딩
public void printI(){ // 메소드에 대한 오버라이딩
System.out.println("child - printI() : " + i);
}
}
public class _3OverRiding {
public static void main(String[] args) {
Parent p1 = new Parent();
System.out.println("p1.i = " + p1.i);
p1.printI();
System.out.println("----------------");
Child c1 = new Child();
System.out.println("c1.i = " + c1.i);
c1.printI();
System.out.println("----------------");
Parent p2 = new Child();
System.out.println("p2.i = " + p2.i); // 5
p2.printI(); // 15
p2.printII(); // 10, 필드는 객체(Child)가 아닌 타입(Parent)를 따라간다
}
}
위의 예시처럼 Parent를 상속받는 Child 클래스가 있고, 각각의 필드값이 다르다고 생각해보자.
각각의 참조타입과 인스턴스가 같은 p1과 c1은 각각의 필드값이 출력된다.
그런데 참조타입이 Parent고 인스턴스가 Child인 참조변수 p2의 필드인 i값은 5다 출력이된다.
그리고 p2의 메서드를 호출하면 p2 참조변수는 Child 인스턴스를 가리키기 때문에 Child 인스턴스의 메서드를 출력한다.
글 잘 봤습니다.