슈퍼 클래스의 메소드를 서브 클래스에서 재정의
(= 메소드 무시하기, 덮어쓰기)
동적 바인딩 발생

└ 내/외부에서 메소드2()의 호출이 발생해도 무조건 서브 클래스의 메소드2()가 호출된다.

└ draw() 메소드의 오버라이딩 사례

부모 클래스의 메소드와 메소드 명, 매개변수 타입 및 개수, 리턴 타입, 접근 지정자 등의 시그니처가 모두 동일해야 함
접근 제한을 더 좁게 수정 불가
추가적인 예외 (Exception)가 발생할 수 있음을 나타낼 수 없음
Ex1
class Shape {
public Shape next;
public Shape() {next = null; }
public void draw(){
System.out.println("Shape");
}
}
class Line extends Shape {
public void draw() {
System.out.println("Line");
}
}
class Rect extends Shape {
public void draw() {
System.out.println("Rect");
}
}
class Circle extends Shape {
public void draw() {
System.out.println("Circle");
}
}
public class MethodOverridingEx {
static void paint(Shape p){
p.draw(); //p가 가리키는 객체 내의 draw()호출 (: 동적 바인딩)
}
public static void main(String[] args) {
Line line = new Line();
paint(line);
paint(new Shape());
paint(new Line());
paint(new Rect());
paint(new Circle());
}
}

연결된 링크드 리스트 형태로 생성가능
start 와 last 에 레퍼런스를 넣어서 리스트 연결 리스트 형태로 구현가능

Ex2 (Ex1 활용)
public class UsingOverride {
public static void main(String[] args) {
Shape start, last, obj;
start = new Line();
last = start;
obj = new Rect();
last.next = obj;
last = obj;
obj = new Line();
last.next = obj;
last = obj;
obj = new Circle();
last.next = obj;
Shape p = start;
while(p != null) {
p.draw();
p = p.next;
}
}
}
