Динамический поиск методов в 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 почему он вызывает метод, принадлежащий суперклассу, а не в подклассе, даже когда я инициализирую объект с помощью подкласса.
Я всегда думал, что динамический вызов используется для того, чтобы класс, с которым вы инициализировали объект, вызывал методы этого класса, т. Е. В основном переопределенный метод должен вызываться вместо родительского метода.

Динеш

2 ответа

Решение

Опечатка.

public void somFunction(){

должно быть

public void someFunction(){

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

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

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

Другие вопросы по тегам