2013-05-06 5 views
0

Я пытаюсь использовать динамический метод вызова в java и не могу понять, почему Java не позволяет мне вызывать метод из подкласса, а не метод суперкласса.Поиск динамического метода в Java

Например: Если у меня есть 2 класса Test и Test2. Test2 наследует от класса Test

Метод 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 таким образом:

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 

Так что мой вопрос: Когда я вызываю метод someFunction() с использованием object t1 почему он вызывает метод принадлежит суперкласс вместо того, который находится в подклассе, даже когда я инициализирую объект подклассом.
Я всегда думал, что динамический вызов используется таким образом, что класс, с которым вы инициализируете объект, методы этого класса называются i.e в основном переопределенный метод следует вызывать вместо родительского метода.

Динеш

ответ

7

опечатка.

public void somFunction(){

должен быть

public void someFunction(){

Как говорит leonbloy в комментариях, если вы поместите аннотацию @Override перед методом, компилятор компиляции время проверки, что он на самом деле что-то переопределяет , Так что, если его имя методы опечатки (или если метод переопределяет изменения подписи) не будет компилироваться:

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

Чтобы избежать такой ошибки, используйте аннотацию @Override – leonbloy

0

У вас есть ошибка опечатки (somFunction вместо someFunciton) в своем классе Test2 и вы не переопределяетесь функция вместо этого у вас есть новая функция somFunction.

Смежные вопросы