2014년 2월 15일 토요일

구로자바상위클래스생성자에서 하위클래스에 오버라이드된 메소드를 호출시!! (JAVA Constructor호출,JAVA생성자, new),자바교육,JAVA교육학원.학원자바교육 생성자에서 오버라이드된 메소드를 호출

구로자바상위클래스생성자에서 하위클래스에 오버라이드된 메소드를 호출시!! (JAVA Constructor호출,JAVA생성자, new),자바교육,JAVA교육학원.학원자바교육

생성자에서 오버라이드된 메소드를 호출
 
아래의 클래스가 있다고 했을 때
 
class 하위클래스 {
    int i=0;
    하위클래스() {
        i = 10;
    }
 
    void display() {
        System.out.println(i =  + i);
}
}
 
class 슈퍼클래스 {
    슈퍼클래스() {
        display();
}
 
void display() {
 System.out.println(여긴 상위 클래스…”);
}
}
 
하위클래스의 인스턴스를 new 하는 시점에 어떤 결과가 나오는 지를 추측해 보면
위 클래스에서 상위클래스에서 display()란 메소드를 호출하는데 이 메소드는 하위 클래스에서 재정의(override)한 메소드 인 것을 확인 할 수 있는데 자바에서는 오버라이드된 하위클래스의 display() 메소드가 실행됩니다.
 
new 하위클래스()를 실행하게 되면 하위클래스의 생성자를 실행하기 전에 상위클래스의 생성자가 실행되므로 결과적으로 하위쿨래스의 display() 함수가 실행되어 i = 0으로 나타날 겁니다.
 
참고로 C++이라면 이 같은 경우 비록 Override 된다고 하더라도 슈퍼클래스의 display()가 호출됩니다.
 
[예제]
 
 
package onj;
 
/**
 *
 * @author OnJ OracleJava Communuty
 * 아래  예제에서 i ?
 */
class SuperClass {
       SuperClass() {
             display();
       }
 
       void display() {
             System.out.println("SuperClass...");
       }
}
 
class SubClass extends SuperClass {
       int i = 0;
 
       SubClass() {
             i = 10;
       }
 
       void display() {
             System.out.println("i = " + i);
       }
}
 
public class OnjConstructorTest {
       public static void main(String[] args) {
             SubClass s = new SubClass();           
       }
}
 
 
 
 
[결과]
 
i = 0

댓글 없음:

댓글 쓰기