super class
sub class
package test;
public class SuperClass { // extends java.lang.Object 최상위로 항상 상속
int a = 100;
String b = "여기는 super class";
public SuperClass() { // 항상 인자 없는 생성자를 만들어야 한다.
super();
}
public void myFunc() {
System.out.println("super");
}
}
package test;
public class SubClass extends SuperClass {
// 추가적인 field와 method를 정의하면 된다.
int a = 5000; // shadow
int b = 500;
public SubClass() {
this(10); // int형을 가지고 있는 생성자를 호출
}
public SubClass(int k) {
// 현재 class가 최상위 클래스인지 확인하고 아니면
// 상위 클래스의 instance를 만드는 코드
// SuperClass(); 이건 못 쓰고 대신 super을 쓴다.
super(); // 상위 클래스를 찾아서 상위 클래스의 생성자를 호출하는 코드
}
@Override
public void myFunc() {
System.out.println("여기는 sub class 입니다.");
}
}
package test;
public class Main {
public static void main(String[] args) {
// instance를 생성하자.
SubClass sub = new SubClass();
System.out.println(sub.a); // 5000
sub.myFunc(); // 여기는 sub class 입니다.
}
}
dynamic binding
이 발생한다.package test;
public class Main {
public static void main(String[] args) {
// instance를 생성하자.
// 동적 바인딩
// 메소드는 오버라이딩되어 있으면 오버라이딩 된 것을 찾아 출력한다.
SuperClass sub = new SubClass();
System.out.println(sub.a); // 100
sub.myFunc(); // 여기는 sub class 입니다.
}
}
package test;
public class SuperClass2 {
static int staticCall(String msg) {
System.out.println(msg);
return 0;
}
int a = staticCall("1번 문장");
static int b = staticCall("2번 문장");
public SuperClass2() {
staticCall("3번 문장");
}
public SuperClass2(int i) {
this();
staticCall("4번 문장");
}
public void myFunc() {
System.out.println("5번 문장");
}
}
package test;
public class Exam01_InheritanceOrder extends SuperClass2 {
int c = staticCall("6번 문장");
static int d = staticCall("7번 문장");
// 상위 클래스의 static 먼저 출력, 다음으로 하위 클래스 static 출력
public Exam01_InheritanceOrder() {
super(100);
staticCall("8번 문장");
super.myFunc();
}
@Override
public void myFunc() {
System.out.println("9번 문장");
}
public static void main(String[] args) {
System.out.println("10번 문장");
SuperClass2 obj = new Exam01_InheritanceOrder();
obj.myFunc();
}
}
2번 문장
7번 문장
10번 문장
1번 문장
3번 문장
4번 문장
6번 문장
8번 문장
5번 문장
9번 문장