답은 3번으로 되어있습니다.Foo f = new Bar(); 로 생성을 하면 f 자체는 Foo 라고 보면 되는 것 인가요..게다가 f.addValue(1); 을 하면 a는 Foo 에서 정의 된 3을 사용하고f.addFive(); 를 하면 a는 Bar 에서 정의된 8을 사용하는지 이 구조가 당최 이해가 가지 않습니다..이 문제로 일주일을 불면증에 시달리고 있읍니다..자바 고수분들의 명쾌한 설명 기다리고 있겠읍니다..
악마의 문제네요... 실전에서는 쓸 일이 없거나 절대로 쓰면 안되는 코드이지만....언어를 공부하는 입장이니 그렇다 치고요..문제의 f 객체는 생성될 당시 Bar 객체로 생성이 됩니다.이 객체에는 Foo 에서 선언한 aFoo 변수와 Bar 에서 선언한 aBar 두개의 int 타입 멤버를 가지고 있네요.메소드는 addValue(int)addValue(double) : double 인 경우에 호출하는 것으로...addFive() : Bar 에서 정의한 것으로 오버로딩됨.그런데 addValue(int)와 addFive() 를 호출을 했네요.Foo 에서 정의한 addFive는 new Foo() 를 한 객체에서만 보입니다. new Bar()를 할때 이미 오버라이딩 되어서 접근할 길이 없습니다.그리고 4번 처럼 답이 나올려면 아래와 같이 호출하면 됩니다.Foo f = new Bar();((Bar) f).addValue(1.0);f.addFive();
오버라이딩은 기존기능을 살리고 새로운 기능을 추가하는 방법이고오버로딩은 기존 기능을 새로운 기능으로 바꾸는 방법입니다.따라서 FOO를 상속받은 BAR 클래스가 객체가 될때오버라이딩과 오버로딩이 적용되어addvalue (int : FOO 클래스 코드addvalue (double : BAR 클래스 코드addfive : FOO 클래스 코드를 무시한 BAR 클래스코드3개의 메소드를 가진 객체로 되는 겁니다.