메소드 오버라이딩은 상속된 메소드의 내용이 자식 클래스에 맞지 않는 경우, 자식 클래스에서 동일한 이름을 갖는 메소드를 재정의하는 것을 말한다.
메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된 자식 메소드가 호출된다.
Parentclass Parent {
void method1();
void method2();
}
Childclass Child extends Parent {
void method2();
void method3();
}
ChildExampleclass ChildExample {
public static void main(String[] args) {
Child child = new Child();
child.method1();
child.method2(); //재정의된 메소드 호출 (즉, Child 객체의 method2() 호출)
child.method3();
}
}
위와 같이, 메소드 오버라이딩을 했을 때, 자식 객체의 메소드를 호출하면 재정의된 메소드가 호출된다.
메소드를 오버라이딩하기 위한 조건은 다음과 같다.
public 접근 제한을 가질 경우, 자식 메소드는 default나 private 접근 제한으로 수정할 수 없다.throws할 수 없다.super)자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 경우, 명시적으로
super키워드를 붙여서 부모 메소드를 호출할 수 있다.
super는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있다.super.부모메소드();
final 클래스와 final 메소드 ]
fianl키워드는 해당 선언이 최종 상태이고, 결코 수정될 수 없음을 뜻한다.
final 키워드는 클래스, 필드, 메소드 선언 시에 사용할 수 있다.final 클래스클래스를 선언할 때
final키워드를class앞에 붙이면 상속할 수 없는 클래스가 된다.
즉final클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다!
public final class 클래스 { ... }
Memberpublic final class Member {
}
VeryVeryImportantPersonpublic class VeryVeryImportantPerson extends Member {
}
→ 에러 발생!
final 메소드메소드를 선언할 때
final키워드를 붙이면 오버라이딩할 수 없는 메소드가 된다.
즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된final메소드는 자식 클래스에서 재정의할 수 없다.
public final 리턴타입 메소드( [매개변수, ...] ) { ... }
Carpublic class Car {
//필드
public int speed;
//메소드
public void speedUp() { speed += 1}
//final 메소드
public final void stop() {
System.out.println("차를 멈춤");
speed = 0;
}
}
SportsCarpublic class SportsCar extends Car {
@Override
public void speedUp() { speed += 10 }
//오버라이딩할 수 없음!
//@Override
//public void stop() {
// System.out.println("스포츠카를 멈춤");
// speed = 0;
//}
}
Car에서 stop() 메소드를 final로 선언하였으므로, Car를 상속받은 SportsCar에서는 stop() 메소드를 오버라이딩할 수 없다!
이것이 자바다 책
http://tcpschool.com/java/java_inheritance_overriding