class Point {
int x;
int y;
**String getLocation() {
return "x : " + x + ", y : " + y;
}**
}
class Point3D extends Point {
int z;
**String getLocation() {. //오버라이딩**
return "**x : " + x + ", y : " + y + ", z:" +z;
}**
}
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.
→ 요약하자면 선언부가 서로 일치해야 함. 다만, 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.
조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
void parentMethod() {}
}
class Child **extends Parent** {
void parentMethod() {} //오버라이딩
void parentMethod(int i) {} //오버로딩
void childMethod() {}
void childMethod(int i) {} //오버로딩
void childMethod() {} //에러. 중복정의 되었
}
this()와 마찬가지로 super()역시 생성자.
this()는 같은 클래스의 다른 생성자를 호출하지만, super는 조상 클래스의 생성자를 호출하는데 사용된다.
💡 Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super(),를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.예제 7-8/PointTest2.java
class PointTest {
public static void main(String args[]) {
Point3D p3 = new Point3D();
System.out.println("p3.x=" + p3.x);
System.out.println("p3.y=" + p3.y);
System.out.println("p3.z=" + p3.z);
}
}
class Point3 {
int x=10;
int y=20;
Point3(int x, int y) {
//생성자 첫 줄에서 다른 생성자를 호출하지 않기 때문에 컴파일러가
//이곳에 'super();'를 삽입한다.
//super()는 Point의 조상인 Object클래스의 기본 생성자인 Object()를 의미한다.
this.x = x;
this.y = y;
}
}
class Point3D extends Point3 {
int z=30;
Point3D() {
this(100, 200, 300); // Point3D2(int x, int y, int z)를 호출한다.
}
Point3D(int x, int y, int z) {
super(x, y); // Point3(int x, int y)를 호출한다.
this.z = z;
}
}
Point3D p3 = new Point3D();와 같이 인스턴스를 생성하면 , 아래와 같은 순서로 생성자가 호출된다.
Point3D() -> Point3D(int x, int y ,int z) -> Point(int x, int y) -> Object()