항상 자식 클래스 뒤에 extends와 부모 클래스를 명시해줘야함
[예제]
// 자식 class
class 자식 클래스명 extends 부모 클래스명 {
}
// ex) child, paraents
class child extends parents {
}
하나의 자식 클래스가 여러개의 부모 클래스를 만드는 다중 상속은 불가하며 자식 클래스는 1개의 부모 클래스를 가지는 단일 상속만 가능하고, 부모 클래스는 여러개의 자식 클래스를 가질 수 있음!
[설명]
[규칙]
부모 클래스의 메서드의 리턴타입을 동일하게 해야함
메서드의 매개변수가 동일해야함
접근지정자는 동일하거나 더 큰 범위만 가능함
부모 클래스의 메서드보다 더 큰 범위의 예외를 선언 할 수 없음
static, final, private 지정자를 가진 메서드는 오버라이딩이 불가능함
[예제]
// 부모 Class
class Parents {
public void print() {
System.out.println("부모 클래스 메서드!");
}
}
// 자식 Class
class Child {
public void childRead() {
// override가 되었기에 자식 클래스의 print가
// 호출됨!
this.print(); // "자식 클래스 메서드!"
}
@Override // 어노테이션
public void print() {
System.out.println("자식 클래스 메서드!");
}
}
[super?]
[Super()?]
부모 클래스의 생성자를 호출 할때 사용함
자식클래스의 인스턴스를 생성하면 부모 클래스의 모든 멤버까지 포함됨
자식클래스에서 부모 클래스의 멤버를 사용하기 위해서는 부모 클래스의 멤버를 먼저 초기화 해줌
부모 클래스의 멤버를 초기화하기 위해서는 부모 클래스의 생성자를 자식 클래스의 생성자 첫줄에서 호출해야함
부모클래스 호출은 상속관계에 따라 객체 클래스까지 거슬러 올라가기도 함
객체 클래스를 제외한 부모 클래스의 생성자를 명시적으로 호출하지 않으면 자식 클래스의 생성자 첫 줄에 자동으로 super()를 추가하여 실행함
클래스에 생성자가 하나도 정의되지 않았을때만 자동으로 디폴트 생성자를 호출함
디폴트 생성자 이외의 다른 생성자를 사용할 경우 디폴트 생성자도 명시적으로 정의해야 컴파일 오류가 나지 않음
[예제]
// 매개변수를 가지는 생성자 선언시
// 디폴트 생성자도 명시적으로 선언함
class Parent {
Parent() {
name = "기본값";
}
Parent(String str) {
name = str;
}
}
// 상속관계인 클래스에 super를 이용함
class Parent {
Parent() {
name = "기본값";
}
Parent(String str) {
name = str;
}
}
class Child extends Parent {
Child() {
super("자식"); // 부모클래스 생성자 호출
}
Child(String name) {
super(name);
}
}
// 부모 클래스의 디폴트 생성자를 먼저 호출
Child ch1 = new Child();
Chile ch2 = new Child("자식");