슈퍼클래스로부터 상속받은 메서드를 서브클래스에 재정의하는 것
기본클래스의 메서드와 동일하게 생긴 메서드를 정의하므로 서브클래스에서는 슈퍼클래스의 메서드 보이지X
-> 슈퍼클래스의 메서드는 은닉되고 자신의 메서드만 보이게 됨
기존에 상속된 메서드 내용을 변경하는 경우 사용
-> 슈퍼클래스의 메서드에 새로운 기능을 추가···
상속 관계 필수
메서드 시그니처(메서드명, 리턴타입, 파라미터) 일치
-> 리턴타입은 부모와 같거나 서브클래스 타입으로 변경 가능
접근제한자는 같거나 넓은 범위로만 변경 가능
슈퍼클래스의 접근제한자보다 좁아질 수 없음!
public static void main(String[] args) {
}
class Parent {
public void parentPrn() {
System.out.println("슈퍼클래스의 parentPrn()");
}
}
class Child extends Parent {
public void child() {
System.out.println("서브클래스의childPrn3()");
}
public void parentPrn() {
// 접근제한자는 슈퍼클래스보다 좁아질 수 없기 때문에
// 서브클래스에서 오버라이딩 했을 때 public이 와야함!
System.out.println("슈퍼클래스에서 오버라이딩된 parentPrn()");
// 메서드 이름, 리턴타입, 파라미터 동일
}
}
리턴값은 기존 리턴타입보다 서브클래스 타입이어야 함!
public static void main(String[] args) {
}
class Parent {
public Object parentPrn2() {
// 리턴타입 최상위 클래스 Object
System.out.println("슈퍼클래스의 parentPrn2()");
}
public String parentPrn3() {
// 리턴타입 String
System.out.println("슈퍼클래스의 parentPrn3()");
}
}
class Child extends Parent {
public void child() {
System.out.println("서브클래스의childPrn3()");
}
public String parentPrn2() {
// 원래 리턴타입이 Object였기 때문에
// 그것보다 낮은 String이 오는 것 가능함!
System.out.println("슈퍼클래스에서 오버라이딩된 parentPrn2()");
}
// public Object parentPrn3() { // 오류발생!!!
// 원래 리턴타입이 String이었기 때문에
// 이것보다 높은 Object 타입이 리턴타입으로 올 수 없음
// System.out.println("슈퍼클래스에서 오버라이딩된 parentPrn3()");
}
}
오버라이딩 시 오버로딩은 불가능!
public static void main(String[] args) {
Student s = new Student();
s.sleep();
}
class Person {
public void sleep() {
System.out.println("잠 자기!");
}
}
class Student extends Person {
public void sleep() { // 오버라이딩
System.out.println("엎드려 잠자기!");
}
// public void sleep(int min) {
// 파라미터 추가해서 오버로딩
// System.out.println(min "분 동안 엎드려 잠자기!");
// }
// !!!!오버라이딩 할 때 오버로딩 불가!!!!
}
< 오버라이딩 단축키 >
Alt + Shift + S -> V
(이미 오버라이딩된 메서드는 표시 안됨)