super
•
자신이 상속받은 부모를 가리키는 참조 변수
•
자식과 부모사이의 구분에 사용
class Object{
int a;
}
class A extends Object{
int a;
}
public static void main(String args[]){
A ins = new A();
ins.a=2 // 여기서 a는 A의 a. 즉, 자식의 변수이다
// 만약 자식에게 a라는 변수가 없었다면 부모의 a를 가리켰을 것이다.
// 여기서 자식 a가 아닌 부모의 a로 접근하고 싶다면?
ins.super.a = 20; // 이렇게 super라는 참조 변수를 사용해서 부모의 a에 접근할 수 있다
}
// 위와 같은 이유로 자바에서는 다중 상속이 불가능하다 (상속의 모호성)
Java
복사
//예제2
class Parent {
int a = 10;
}
class Child extends Parent {
int a = 20;
void display() {
System.out.println(a);
System.out.println(this.a); // 자식
System.out.println(super.a); // 부모
}
}
public class Inheritance03 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
Java
복사
super()
•
자신이 상속받은 부모의 생성자를 호출하는 메소드
•
부모클래스에 기본 생성자가 아닌 매개변수를 가지는 생성자가 있다면(=부모클래스에서 생성자가 오버로딩되면) 자동으로 추가되지 않음 (=묵시적 제공을 하지 않음) 이럴 때 사용
예문
class Parent{
int a;
Parent(int n){a=n;};
}
class Child extends Parent(){
int b;
Child(){
super()
b=20;
}
}
Java
복사
1. 부모클래스에 기본 생성자 선언 (명시된 문제 그대로의 해결)
class Parent{
int a;
Parent(){a=10;};
Parent(int n){a=n;};
}
class Child extends Parent(){
int b;
Child(){
super();
b=20;
}
}
Java
복사
2. 오버로딩된 생성자에 맞춰 super()의 인자를 맞춰줌 (합리적 해결)
class Parent{
int a;
Parent(int n){a=n;};
}
class Child extends Parent(){
int b;
Child(){
super(40);
b=20;
}
}
Java
복사