class AAA{
     public void rideMethod(){System.out.println("AAA's Method");}
     public void loadMethod(){System.out.println("void Method");}
}


class BBB extends AAA{

     @Override
     public void rideMethod(){System.out.println("BBB's Method");}
     public void loadMethod(int num){System.out.println("int Method");}
}



class CCC extends BBB{

     @Override
     public void rideMethod(){System.out.println("CCC's Method");}
     public void loadMethod(double num){System.out.println("double Method");}
}


class RideAndLoad{

public static void main(String[] args){
      AAA ref1=new CCC();  
      BBB ref2=new CCC();
      CCC ref3=new CCC();
  
      ref1.rideMethod();
      ref2.rideMethod();
      ref3.rideMethod();
  
      ref3.loadMethod();
      ref3.loadMethod(1);
      ref3.loadMethod(1.2);
     }
}


예재가 이건데 이거 실행하면

CCC's Method

CCC's Method

CCC's Method

void Method

int Method

double Method


이렇게 되네요. 이렇게 되고 밑에 설명이

'오버라이딩 된 상위 클래스의 메소드는 오버라이딩을 한 하위 클래스의 메소드에 의해서 가리워진다. 즉 외부에서는 참조변수를 통해서

오버라이딩 된 상위 클래스의 메소드를 호출할 수 없다.'

이렇게 되있는데


      AAA ref1=new CCC();  
      BBB ref2=new CCC();
      CCC ref3=new CCC();


이거를


      AAA ref1=new AAA();  
      BBB ref2=new BBB();
      CCC ref3=new CCC();


이렇게 바꿔주면

출력이


CCC's Method

CCC's Method

CCC's Method


이게 아니고


AAA's Method

BBB's Method

CCC's Method


이렇게 나오네요.


음.. 그러니까 이게 가리워 진다길레 바꿔도 출력 결과 안바뀔줄 알았는데 바뀌더군요.

설명 보니까 아예 가리워져서 외부에서 호출할 수 없다 이러는거 같은데..


그리고 AAA ref1= new CCC(); 여기에서 new CCC();이 부분이 그냥 객체의 메모리 공간만 할당하는거 아닌가요?

실제로 ref1이 참조하는건 AAA이고요.

그러니까 CCC에 AAA와 BBB에 없는 메소드를 생성해도 ref1에서는 그 메소드를 호출할 수 없는거처럼..


즉, 여기서 AAA ref1 = new CCC();에서 CCC를 AAA로 바꿔주는건

'오버라이딩 된 상위 클래스의 메소드는 오버라이딩을 한 하위 클래스의 메소드에 의해서 가리워진다. 즉 외부에서는 참조변수를 통해서

오버라이딩 된 상위 클래스의 메소드를 호출할 수 없다.'

이 문장에 영향력을 끼치는 부분은 없는거 같다고 생각되거든요. 제 생각에는요.

CCC만큼의 메모리 공간을 할당한다 에서 AAA만큼의 메모리 공간을 할당한다로 바꿔주는거니까요.


되게 써보니까 글이 이상하는거 같긴한데..

위에 제가 싸질러놓은거 이해 안가시는 분은 그냥 new CCC();를 new AAA();로 바꿨을 때 왜 출력물이 바뀌는지만 알려주세요.

책에 보니까 가려진다고 하는데...

알려주시면 감사하겠습니다.