조상 클래스 : 부모(parent)클래스, 상위(super)클래스, 기반클래스
자손 클래스 : 자식(child)클래스, 하위클래스, 파생된 클래스
- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
예제를 통해 확인해보자.
class Tv {
boolean power; //전원상태
int channel; //채널
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class CaptionTv extends Tv {
boolean caption; // 캡션상태
void displayCaption(String text) {
if (caption) { // 캡션상태가 on(true)일 때만 text를 보여 준다.
System.out.println(text);
}
}
}
class CaptionTvTest {
public static void main(String args[]) {
CaptionTv ctv = new CaptionTv();
ctv.channel = 10; // 조상 클래스로부터 상속받은 멤버
ctv.channelUp(); // 조상 클래스로부터 상속받은 멤버
System.out.println(ctv.channel);
ctv.displayCaption("Hello, World");
ctv.caption = true; //캡션(자막)을 켠다
ctv.displayCaption("Hello, World");
}
}
💡 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
class Circle {
int x;
int y;
int r;
}
class Point {
int x;
int y;
}
//Point클래스를 재사용해서 Circle클래스를 작성한다면 다음과 같이 할 수 있을 것이다.
class Circle {
Point c = new Point():
int r;
}
클래스 작성시 상속관계를 맺어 줄 것인지 포함관계를 맺어 줄 것이지 결정하는 것은 혼돈스러울 수 있다.
전의 Circle클래스의 경우, 포함관계 대신 상속 관계를 맺어 준다면
//포함관계
class Circle {
Point c = new Point();
int r;
}
//상속관계
class Circle extends Point {
int r;
}
→ 이처럼 '~은 ~이다.' 라는 문장이 성립한다면, 서로 상속관계를 맺어 주고, '~은 ~을 가지고 있다.'는 문장이 성립한다면 포함관계를 맺어 주면 된다.
ex) 1. 스포츠카는 자동차이다. → 자동자(조상) 상속관계
자바에서는 오직 단일 상속만을 허용한다.
그래서 둘 이상의 클래스로부터 상속을 받을 수 없다.
Objcet클래스는 모든 클래스 상속계층도 최상위에 있는 조상클래스이다.
상속받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받는다.