다음의 예제코드를 보자.
Animal.java
package inheritance03;
public class Animal {
public String name;
public void showName(){
System.out.println("안녕 나는 %s야. 반가워\n", name);
}
}
Penguin.java
package inheritance03;
public class Penguin extends Animal{
public String habitat;
public void showHabitat(){
System.out.println("%s는 %s에 살아\n", name, habitat);
}
}
Driver.java
package inheritance03;
public Class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name = "핑구";
// pingu.habitat = "EBS";
pinu.showName();
// pingu.showHabitat();
// Penguin happyfeet = new Animal();
}
}
Penguin pororo = new Penguin();을 실행한 후 T 메모리 구조는 다음과 같다.
Penguin 클래스의 인스턴스만 힙 영역에 생긴 게 아니라 Animal 클래스의 인스턴스도 힙 영역에 생긴 것을 볼 수 있다. 하위 클래스의 인스턴스가 생성될 때 상위 클래스의 인스턴스도 생성된다.
사실 Animal 인스턴스 이외에도 모든 클래스의 최상의 클래스인 Object 클래스의 인스턴스도 함께 생성된다.
이어서 Animal pingu = new Penguin();를 실행한 후 T 메모리의 구조는 다음과 같다.
위와 다르게 pingu 객체 참조 변수가 가리키고 있는 것은 Penguin 인스턴스가 아닌 Animal 인스턴스이다. 따라서 pingu 객체 참조 변수는 Penguin의 속성인 habitat과 행위인 showHabitat() 메서드를 사용할 수 없다.
참고