- Method Overriding (재정의)
: 부모에게 물려받은 메소드를 덮어쓰는 것.
: 다른 class를 상속 받은 subClass에서만 가능
: 더 좁은 범위의 Access Modifier를 선언할 수 없다.
: final이나 private를 가져다 쓸 수없다.
: 메소드의 이름, 리턴타입, 인수는 정확하게 일치해야 한다. (일치하지 않으면 오버로딩이 됨)
- 소스
class SubOverTest {
int speed = 0;
final int speed2 = 0; // speed2는 상수이므로 바꿀 수 없음
void speedUP(){
speed = speed + 100;
}
void speedUP2(){
speed = speed + 500;
}
void speedDown(){
speed = 0;
}
}
public class MethodOverridingTest extends SubOverTest{
int speed = 400;
/* private void speedUP(){ // private를 쓰고싶으면 부모 클래스에서 private로 바꿔야 한다.
} */
void speedUP(){ // 오버라이딩(재정의) - 즉 100이 아닌 400이 나옴
// 즉, 재정의되면 부모클래스의 speedUp 메소드는 호출이 안됨
}
void speedUp2(int a){ // 이것은 오버라이딩이 아닌 메소드 오버로딩
speed = speed + a;
}
public void test(){
speedUP();
System.out.println(speed); // 자식의 speed 값 (400)
System.out.println(super.speed); // 부모의 speed 값 (0)
super.speedUP();
System.out.println(speed); // 자식의 speed 값 (400)
System.out.println(super.speed); // 부모의 speed 값 (100)
speedUP2(); // 부모의 speedUp2를 호출
System.out.println(super.speed); // 부모의 speed 값이 바뀜 (600)
speedUp2(10); // 메소드 오버로딩 된 자식의 speedUp2를 호출
System.out.println(speed); // 자식의 speed 값이 바뀜 (410)
speedDown(); // 부모의 speed 값이 바뀜
System.out.println(speed); // 자식의 speed 값은 상관이 없음 (410)
System.out.println(super.speed); // 부모의 speed 값이 0으로 바뀜 (0)
}
public static void main(String[] args) {
MethodOverridingTest sot = new MethodOverridingTest();
sot.test();
}
}
- 결과