
extends키워드로 선언한다.public class 자식클래스 extends 부모클래스 {
}
// 부모 클래스
public class Phone {
public String model;
public String color;
public void bell() {
System.out.println("벨이 울립니다.");
}
}
// 자식 클래스
public class SmartPhone extends Phone {
public boolean wifi;
// 부모로부터 상속받은 필드 사용
public SmartPhone(String model, String color) {
this.model = model;
this.color = color;
}
public void setWifi(boolean wifi) {
this.wifi = wifi;
}
}
// 메인 클래스
public class PhoneEx {
public static void main(String[] args) {
SmartPhone myPhone = new SmartPhone("apple", "silver");
// Phone으로부터 상속받은 메소드 사용
myPhone.bell();
// SmartPhone의 메소드 사용
myPhone.setWifi(true);
}
}
Phone객체가 먼저 생성된 후, SmartPhone객체가 생성된 것이다.SmartPhone myPhone = new SmartPhone("apple", "silver");

super()에 의해 호출된다.super(매개값...)코드를 직접 넣어야 한다.public SmartPhone() {
super("apple", "black");
}
@Override어노테이션을 붙이면 컴파일 단계에서 정확히 오버라이딩 됐는지 체크하고, 문제가 있다면 컴파일 에러를 출력한다. // 부모 클래스
public class Calculator {
public double calculate(double r) {
return 3.14 * r * r;
}
}
// 자식 클래스
public class Computer extends Calculator {
// 메소드 오버라이딩
@Override
public double calculate(double r) {
return Math.PI * r * r;
}
}
public -> private 변경 불가)throws할 수 없다.super.method();로 자식 메소드 내에서 부모 메소드를 호출하면 된다.super.method();는 작업 처리 2 전후 어디든지 올 수 있다.class parent {
public void method() {
// 작업 처리1
}
}
class child {
@Override
public void method() {
super.method();
// 작업 처리 2
}
}
(복습)필드 선언 시 final을 붙이면 초기값 설정 후 값을 변경할 수 없다.
final 클래스와 final 메소드는 상속과 관련있다.
String 클래스는 다음과 같이 선언되어 있다.public final class String { ... }
// 다음은 불가능한 예이다.
// public class NewString extends String { ... }
protected는 상속과 관련이 있고, public과 default의 중간에 해당하는 접근 제한을 한다.
| 접근제한자 | 제한대상 | 제한범위 |
|---|---|---|
| protected | 필드,생성자,메소드 | 같은 패키지 or 자식 객체만 사용 가능 |
new연산자를 사용해서 부모의 생성자를 직접 호출할 수는 없고, 자식 생성자에서 super()로 부모 생성자를 호출할 수 있다. public class Parents {
protected Parents() {
}
protected String field;
protected void method() {
}
}
public class Child extends Parents {
public Child() {
// Parents() 생성자 호출
super()
}
// 상속을 통해서만 사용 가능하다.
public void method1() {
this.field = "Hello";
this.method();
}
// 직접 객체를 생성해서 사용하는 것은 안됨
public void method2() {
Parents a = new Parents(); // X
a.field = "World"; // X
a.method(); // X
}
}