기존의 클래스로 새로운 클래스를 작성하는 것 즉, 코드의 재사용을 뜻한다. 두 클래스를 부모와 자식으로 관계를 맺어주는 것이다.
class 자식클래스 extends 부모 클래스{
// ...
}
class Parent{}
class Child extends Parent{
//...
}
공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다. 조상의 변경은 자손에 영향을 미치지만 자손의 변경은 조상에 영향을 미치지 않는다.
class Point{
int x;
int y;
}
class Point3D extends Point{
int z;
}

클래스의 멤버로 참조변수를 선언하는 것이다. 작은 단위의 클래스를 먼저 만들고, 이 들을 조합해서 하나의 커다란 클래스를 만든다.
class Circle{
int x;
int y;
int z;
}

class Circle{
Point c=new Point();
int r;
}

상속받는 조상의 메서드를 상속받는 클래스에 맞게 변경하는 것을 의미한다.
class Point{
int x;
int y;
String getLocation(){
return "x :" + x+", y:"+y;
}
}
class Point3D extends Point{
int z;
String getLocation(){ //오버라이딩
return "x :"+x+", y:"+y+", z:" +z;
}
}
조상클래스의 getLocation()을 사용하면 자식 클래스는 z 좌표가 빠지게 된다. 그렇기 때문에 조상 클래스의 getLocation()을 변경해야한다. 선언문은 변경하지 못하고 구현부(내용)만 변경가능하다.
조상의 멤버를 자신의 멤버와 구별할 때 사용된다.
class Parent{
int x=10;
}
class Child extends Parent{
int x=20;
void method(){
System.out.println("x="+x); //x=20
System.out.println("this.x="+this.x); //this.x=20
System.out.println("super.x="+super.x); //super.x=10
}
}
this
인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
조상의 생성자를 호출할 때 사용한다. 조상의 멤버는 조상의 생성자를 호출해서 초기화한다. 자식 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다. 이때, 조상의 멤버들도 초기화가 되어야 하기 때문에 자손의 생성자의 첫문장에서 조상의 생성자를 호출해야 된다.
class Point3D extends Point{
int z;
Point3D(int x, int y, int z){
super(x, y); //조상클래스의 생성자 Point(int x, int y)를 호출
this.z=z; //자신의 멤버를 초기화
}
}
❗️생성자의 첫 줄에 반드시 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입한다.
[출처]
자바의 정석 - https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp