public class Animal {
public String name;
public void showName() {
System.out.println("안녕 나는 %s야. 반가워\\n", name);
}
}
public class Penguin extends Animal {
public String habitat;
public void showHabitat() {
System.out.println("%s는 %s에 살아\\n", name, habitat);
}
// 오버라이딩 - 재정의: 상위 클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트
public void showName() {
System.out.println("어머 내 이름은 알아서 뭐하게요?");
}
// 오버로딩 - 중복정의: 같은 메서드 이름, 다른 인자 리스트
public void showName(String yourName) {
System.out.println("%s 안녕, 나는 %s라고해\\n", yourName, name);
}
}
public class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showName("초보람보");
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name = "핑구";
pingu.showName();
}
}
JRE의 동작:
main()
메서드가 있는지 확인한다.
main()
메서드를 발견한다.main()
메서드의 존재가 확인되면 JVM에 전원을 넣어 부팅한다.JVM의 동작 :
JRE에게 목적 파일을 전달받아 실행한다.
전처리를 한다.
Penguin pororo = new Penguin();
를 실행한다.
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showName("초보람보");
pororo.showHabitat();
를 실행한다.
pororo.showName()
은 Animal의 showName()
이 아닌 Penguin의 showName()
이 호출된다. (오버라이딩)
pororo.showName("초보람보")
는 Penguin의 showName(String yourName)
이 실행된다. (오버로딩)
Animal pingu = new Penguin();
를 실행한다.
pingu.name = "핑구";
pingu.showName();
를 실행한다.
pingu.showName()
은 Penguin 타입이 아닌 Animal 타입의 인스턴스임에도 불구하고 Penguin의 showName()
을 실행한다. (오버라이드) (new Penguin()
을 했기 때문)showName()
은 Penguin 객체의 showName()
에 의해 가려져 있다. 따라서 Penguin의 showName()
을 실행한다.
main()
메서드의 닫는 중괄호 }
를 만나서 main()
스택 프레임을 소멸 시킨다.
JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다.