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"); } } }
출처 : 타이핑하다 우연히 발견
'java' 카테고리의 다른 글
Object class (0) | 2019.09.14 |
---|---|
deprecated 된 모듈 빌드 시. (0) | 2019.09.13 |
오버라이딩 (0) | 2019.09.13 |
참조자료형의 명시적 형변환 (0) | 2019.09.13 |
상속에서 생성자 관련 팁. (0) | 2019.09.13 |