java 상속
– 기존클래스에 새로운 변수와 메소드를 추가하여 새로운 클래스를 만드는 것
– extends 키워드를 사용
– super 키워드로 상위클래스 생성자를 호출
– private 멤버도 상속됨(직접접근불가)
상위클래스의 private 멤버는 메소드를 통한 간접접근만 허용한다.
class AA{ // 상속되어지는 상위클래스
private int num=0; // private 변수는 상속되지 않는다.
String name;
AA(String name){
this.name = name;
}
void setNum(int num){ // setNum 메소드를 하위클래스에서 호출하면 private 변수 num 으로 접근이 가능하다.
this.num = num;
System.out.println(this.num);
}
}
class BB extends AA{ // extends 키워드로 AA 클래스를 상속
int phoneNum;
BB(String name, int phoneNum) {
super(name); // 상위클래스 생성자 호출
this.phoneNum = phoneNum;
}
}
– 상위클래스의 생성자는 어떤식으로든 반드시 호출됨
프로그래머가 정의하지 않으면 생성자 호출문이 자동으로 삽입된다.
class AA{
AA(){}
}
class BB extends AA{
BB(){
super(); // 자동으로 삽입되는 상위클래스 생성자 호출문
}
}
– 상위클래스의 참조변수로 하위클래스의 인스턴스 참조가 가능
public class Test {
public static void main(String[] args) {
AA aa = new BB(); // 상위클래스 AA의 참조변수로 하위클래스 BB의 인스턴스를 참조
}
}
class AA{}
class BB extends AA{}
메소드 오버라이딩(Overriding)
– 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술
– 상위클래스의 메소드를 하위클래스에서 다시 정의 하는것
public class Test {
public static void main(String[] args) {
AA aa1 = new AA();
AA aa2 = new BB();
aa1.overriding(); // AA 클래스 출력
aa2.overriding(); // BB 클래스 출력
}
}
class AA{
void overriding(){
System.out.println("AA 클래스");
}
}
class BB extends AA{
void overriding(){
System.out.println("BB 클래스");
}
}
상속의 목적
– 다형성(상위클래스의 참조변수로 하위클래스의 인스턴스를 참조)과 메소드 오버라이딩(동일한 방식의 메소드 호출 가능) 을 통해서 일련의 클래스에 대한 공통의 규약을 적용
final 클래스와 final 메소드
– final 클래스는 상속을 허용하지 않는다.
– final 메소드는 오버라이딩을 허용하지 않는다.
final class AA{ // 상속 불가
final void aa(){ // 오버라이딩 불가
}
}