java
다형성 주의 사항 ( 부모자식의 접근제어자가 다를 때 발생하는 상황)
easy16
2019. 9. 13. 19:09
ex1) Parent의 접근 제어자가 Child와 같을 경우 , 동적바인딩이 발생, 일반적인 케이스
public class TestApplication {
public static void main(String [] args) {
TestApplication test = new TestApplication();
test.doTest();
}
private void doTest() {
A a = new A();
A b = new B();//B를 A의 reference object로
a.printname();
b.printname(); // BB가 출력됨
}
class A{
public void printname() { //다형성(동적 바인딩) -> B 생성자에 의해 생성되었기 때문에 BB가 호출됨.
//private void printname() {
System.out.println("AA");
}
}
class B extends A{
public void printname() {
System.out.println("BB");
}
}
}
ex2) Parent의 접근 제어자가 Child와 다를 경우 ( prviate -> public) , 정적바인딩이 발생
(정확한 이유는 모르나 signature가 달라져서 그런 것이 아닌가 추측되며, 당연한 소리지만 이경우 명시적 형변환을 통해 Child의 메소드를 호출하는 것이 가능.)
public class TestApplication {
public static void main(String [] args) {
TestApplication test = new TestApplication();
test.doTest();
}
private void doTest() {
A a = new A();
A b = new B();//B를 A의 reference object로
a.printname();
b.printname(); // AA가 호출 됨.
//해결책
B b2 = (B)b; //명시적으로 캐스팅할 경우,
b.printname(); // BB가 호출 됨. 마치 정적 바인딩 마냥 동작
}
class A{
//public void printname() {
private void printname() {//자식 클래스의 접근제어자가 다르면 signature가 다르기 때문인지(추측) 명시적 형변환이 없다면, 부모의 메소드가 호출됨.
System.out.println("AA");
}
}
class B extends A{
public void printname() {
System.out.println("BB");
}
}
}
출처 : 타이핑하다 우연히 발견