부모 클래스가 자식 클래스에게 물려주는 것이다. 자식 클래스는 부모 클래스에 있는 코드를 사용할 수 있다. 단, private은 제외다. (private은 상속되지 않는다.)
상속을 하게 되면 중복되는 코드를 줄여주고, 이후 수정을 최소화 할 수 있다는 장점이 있다. (부모 클래스가 바뀌면 자식 클래스도 동일하게 적용되기 때문이다.)
자식 클래스는 extends 를 통해 상속 받을 부모 클래스를 하나 선택할 수 있다.
public class Child extends Parent { ... }
//불가능 : 부모는 하나만
public class Child extends Parent1,Parent2 { ... }
//가능 : 자식은 n개 가능
public class Child1 extends Parent { ... }
public class Child2 extends Parent { ... }
public class Child3 extends Parent { ... }
부모 객체가 없으면 자식 객체도 있을 수 없다.
따라서 자식 객체를 생성하면 부모 객체가 먼저 생성된 후 자식 객체가 생성된다.
부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super에 의해 호출되어 생성된다.
public class Child extends Parent{
Child(){
super();
}
}
super( )를 생략해도 된다. 코드상 보이지 않더라도 컴파일 과정에서 자동으로 추가되기 때문이다. 그렇기 때문에 맨 첫줄에만 올 수 있다.
//부모 클래스
public class Parent{
Parent(){ }
}
//Parent를 상속받은 자식 클래스
public class Child extends Parent{
String school;
Child(String school){
super(); //생략가능, 생략해도 자동으로 호출된다.
this.school = school;
//불가능 : 이미 첫 줄에서 호출했다.
//super();
}
}
만약 부모 클래스에 기본 생성자가 없고, 매개변수를 갖는 생성자만 있다면 다음과 같이 매개변수를 직접 전달해줘야 한다.
//부모 클래스
public class Parent{
String name;
int age;
//default 생성자 : 매개변수를 갖지 않는 생성자
//생성자를 따로 정의하지 않으면 작성하지 않아도 기본으로 생성된다.
//Parent(){ }
//매개변수를 갖는 생성자를 정의하였기 때문에 default 생성자가 존재하지 않는다.
Parent(String name, int age){
this.name = name;
this.age = age;
}
}
//Parent를 상속받은 자식 클래스
public class Child extends Parent{
String school;
Child(String name, int age, String school){
//부모 클래스에 default 생성자 없기 때문에 알맞는 매개변수를 직접 전달해줘야 한다.
super(name, age);
this.school = school;
}
}