static 메서드를 가지고 있는 클래스를 상속받은 자식 클래스에서 static 메서드를 override할 수 있을까?
public class A {
public static void doIt(){
System.out.println("Class1.doIt");
}
public void doThat(){
System.out.println("Class1.doThat");
}
}
public class B extends A{
public static void doIt(){
System.out.println("Class2.doIt");
}
public void doThat(){
System.out.println("Class2.doThat");
}
}
public class D{
public static void main(String[] args) {
A a = new A();
A.doIt();
a.doIt();
a.doThat();
System.out.println("------------------------");
B b = new B();
B.doIt();
b.doIt();
b.doThat();
System.out.println("------------------------");
A c = new B();
A.doIt();
B.doIt();
c.doIt();
c.doThat();
}
}
예상 결과값은 다음과 같다.
Class1.doIt
Class1.doIt
Class1.doThat
------------------------
Class2.doIt
Class2.doThat
------------------------
Class1.doIt
Class2.doIt
Class2.doThat
Class2.doThat
결과값은 다음과 같다.
Class1.doIt
Class1.doIt
Class1.doThat
------------------------
Class2.doIt
Class2.doThat
------------------------
Class1.doIt
Class2.doIt
Class1.doIt
Class2.doThat
c.doIt()
은 왜 오버라이드가 적용되지 않았을까?
public class D{
public static void main(String[] args) {
A c = new B();
c.doIt(); // 실제값 : Class1.doIt , 예상값 : Class2.doIt
c.doThat(); // 실제값 : Class2.doThat, 예상값 : Class1.doThat
}
}
static method는 상속이 되지 않는다.
즉, static은 런타임 시에 인스턴스가 실제로 참조하고 있는 클래스를 찾아가는 것(동적 바인딩)이 아니라 컴파일시 결정된 클래스를 찾아(정적 바인딩)가기 때문에 다형성 개념에 따라 Override를 할 수 없다.
따라서 static은 상속이 불가능하다고 한다.