단일상속
- 자바에서는 단일상속만 가능하다. (= 두개이상불가)
- 클래스 간의 관계가 명확해진다.
class TVCR extends Tv, VCR{
}
- Tv와 VCR에 동일한 메소드가 존재한다면 어떤 메서드를 상속받는 지 알 수 없다.
- Tv의 메서드명을 변경한다면 그동안 사용해온 모든 곳을 수정해주어야 한다.
Object클래스
- 모든 클래스의 조상 = 최상위 클래스
- 다른 클래스를 상속받지 않는 클래스는 Object클래스를 상속 받는다.
class A extends Object{
}
- 모든 클래스는 Object클래스를 상속받게 되어 있다.
- toString()나 equals()를 사용할 수 있는 것은 Object클래스의 메서드이기 때문이다.
toString()
- 인스턴스의 정보를 제공할 목적으로 사용된다.
- 참조변수를 출력하면 참조변수가 가르키고 있는 인스턴스의 toString()를 호출한다.
Tv t = new Tv();
System.out.println(t.toString());
참조변수 super
- 조상클래스의 멤버와 자손클래스의 멤버가 중복정의되어 있을 때 구분할 목적으로 사용된다.
- 조상의 멤버와 자손의 멤버를 구분한다는 점을 제외하고는 this.과 동일하다.
super 예시
public class Ex3_13 {
public static void main(String[] args) {
Child c = new Child();
c.method(50);
}
}
class Parent {
int x = 10;
void method(){
System.out.println("Parent");
}
}
class Child extends Parent {
int x = 30;
void method(int x){
System.out.println("x : "+x);
System.out.println("this.x : "+this.x);
System.out.println("super.x : "+super.x);
super.method();
}
}
super() - 조상클래스의 생성자
- this()와 마찬가지로 super()도 생성자 호출이다.
- this(): 같은 클래스의 생성자 내에서 다른 생성자를 호출할 때 사용한다.
- super(): 자손클래스의 생성자 내에서 부모클래스의 생성자를 호출할 때 사용한다.
- 맨위에올려줘야되기때문에 둘다같이는 못쓰지만 일반적으로 super()가 올라가있다.
public class PointTest {
public static void main(String[] args) {
Point3D p3 = new Point3D(1,2,3);
}
}
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
class Point3D extends Point2 {
int z;
Point3D(int x, int y, int z) {
super(x,y);
this.z=z;
}
Point3D(int t){
super(t,0);
}
}
오버라이딩 (Overriding)
- 조상클래스로부터 상속받은 메서드의 '내용'을 '재정의'하는 것
- !!오버로딩: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것, 매개변수 타입과 갯수가 중요
오버라이딩 조건
제어자 void method() 예외처리 {
}
- 선언부가 동일하면 된다.
- 메서드명이 동일해야 한다.
- 매개변수의 갯수와 타입이 같아야 한다.
- 반환타입이 같아야 한다.
- 부모클래스로부터 상속받는 자손클래스의
- 접근제어자는 부모보다 좁은 범위를 설정할 수 없다.
- 예외의 갯수는 부모클래스의 메서드가 가진 예외보다 많이 선언할 수 없다.
오버라이딩 예시
public class OverTest{
public static void main(String[] args){
OverGo og = new OverGo();
String result = og.overMethod();
System.out.println(result);
System.out.println(og.value);
int result2 = og.getOverUpValue();
System.out.println(result2);
}
}
class OverUp{
int value = 10;
String overMethod(){
return "OverUp Method";
}
}
class OverGo extends OverUp{
int value = 20;
@Override
String overMethod();
return "OverGo Method";
}
String overMethod(int k){
return k+"OverGo Method";
}
int getOverUpMethod(){
return super.value;
}
}