Динамический поиск методов в 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.