2013-05-06 3 views
0

동적 메서드가 Java에서 호출되는 것을 감안하여 Java에서 수퍼 클래스 메서드 대신 하위 클래스 메서드를 호출 할 수없는 이유를 이해할 수 없습니다.Java에서 동적 메서드 조회

예 : 두 클래스가있는 경우 TestTest2입니다. TEST2 클래스 테스트

방법 someFunction()는 하위 클래스에서 재정의에서 상속

테스트 클래스

public class Test { 

    public Test(){ 
     System.out.println("I am Test class constructor called with no values"); 
    } 

    public void someFunction(){ 
     System.out.println("I am some function belonging to Test Class"); 
    } 
    } 

그리고 TEST2 클래스 : 그래서

public class Test2 extends Test{ 

    public Test2(){ 
     System.out.println("Constructor of Test2 with no values"); 
    } 

    public void somFunction(){ 
     System.out.println("I am someFunction overridden in Test2"); 
    } 
} 

하려고하다 이 방법으로 테스트 클래스를 인스턴스화 :

Test t1 = new Test2(); 
    t1.someFunction(); // this should call Test2.someFunction() 

내가 얻을 출력은 다음과 같습니다

I am Test class constructor called with no values 
Constructor of Test2 with no values 
I am some function belonging to Test Class 

그래서 제 질문은 다음과 같습니다 나는 왜에 속하는 메소드를 호출 않습니다 object t1를 사용하는 방법 someFunction()를 호출 할 때 서브 클래스로 객체를 초기화 할 때조차도 서브 클래스에있는 슈퍼 클래스 대신.
나는 동적 호출이 이런 식으로 작업하는 것으로 생각했다. 객체를 초기화하는 클래스가 호출된다. 즉, 그 클래스의 메소드가 호출된다. 즉, 부모 메소드 대신에 기본적으로 오버라이드 된 메소드가 호출되어야한다.

dinesh

답변

7

오타.

public void somFunction(){

leonbloy이 코멘트에 말했듯이 당신이 방법 전에 주석 @Override를 배치하면,

public void someFunction(){

해야, 컴파일러는 컴파일 시간 것입니다 실제로 뭔가를 우선 확인하는 것이 . 그래서 그 메소드 이름은 오타 (또는 방법이 변경 서명을 무시하는 경우)는 컴파일하지 않을 경우 :

@Override public void somFunction(){ //compile time error 
+5

이런 종류의 오류를 방지하려면 @Override 주석을 사용하십시오. – leonbloy

0

을 당신은 당신의 클래스 Test2를에 오타 오류 (대신 someFunciton의 somFunction)이 있고 오버라이드 (override)하지 않은 함수 대신에 새로운 함수 somFunction이 있습니다.