java(자바) 공부중인데.. 도움 부탁드립니다.!
글쓴이: eoeo708 / 작성시간: 수, 2014/04/02 - 3:31오전
class foo{ public int a = 3; public void addFive() { a+=5; System.out.println("f"); } } class Bar extends foo{ public int a = 8; public void addFive(){ this.a +=5; System.out.print("b"); } } public class jsut { public static void main(String[] args) { foo f =new Bar(); f.addFive(); System.out.println(f.a); } }
결과값
b 3
Q1. 여기에서 왜 3이 나오는 건지 잘 모르겠습니다. ㅜㅠ
f에 들어있는건 Bar아닌가요? f.addfive 햇을때에는 bar에잇는게나오고 f.a하면 3이나오는이유가....
어떻게이해해야되는건가요.. 참조변수.
Forums:
> f에 들어있는건 Bar아닌가요? f에 들어있는
> f에 들어있는건 Bar아닌가요?
f에 들어있는 것은 Bar인데 Bar는 foo를 상속했으니까 Bar는 foo를 포함하고 있습니다.
즉, f에는 foo도 들어있는 거지요. foo의 멤버 변수인 a와 Bar의 멤버 변수인 a가 모두 존재합니다.
각각을 foo.a 와 Bar.a 라고 부릅시다.
멤버 함수는 override됩니다. 하지만 멤버 변수는 override되지 않습니다.
풀어서 말하자면...
올리신 예제에서처럼 foo의 인스턴스 변수를 통해서 Bar객체를 다룰 때에
멤버 함수 호출은 Bar의 멤버 함수를 호출하게 되지만,
멤버 변수는 이와 달리 foo의 멤버 변수를 보게 됩니다.
규칙이 그렇습니다.
좀 더 자세히...
f.addFive()는 Bar의 addFive를 호출하고, Bar의 addFive는 Bar의 멤버 변수 Bar.a = 8 에 5를 더해서 Bar.a = 13을 만듭니다.
Bar에 포함되어 있는 foo의 foo.a 는 바뀌지 않고 3 그대로이지요.
그리고 f.a 는 Bar.a가 아니라 foo.a이기 때문에 System.out.println(f.a)는 3을 출력합니다.
음...
eoeo님 한번 다시 잘 체크해보세요 !!
음...
신재민 킬러님 글 쓴 날짜 한번 다시 잘 체크해보세요 !!
댓글 달기