Java динамическая привязка, вызывающая метод родительского класса
Ниже приведен код, который я пытаюсь проанализировать.
class Acc{
public void aMethod(List<Integer> A){
System.out.println(A.toString());
}
}
class Back extends Acc{
public void aMethod(String A){
System.out.println(A);
}
}
Вот если я призываю это как
Acc a = new Back();
a.aMethod(list);
Но после отладки вызывается метод родительского класса. Но он должен динамически вызывать метод Back согласно моему пониманию. Пожалуйста, помогите мне понять это поведение. Снова, если я сохраню аргумент родительского класса как List<Integer>
а ребенок один как List<String>
тогда это дает имя столкновения вещь. Почему бы не в этом случае?
2 ответа
Метод родительского класса public void aMethod(List<Integer> A)
и метод дочернего класса public void aMethod(String A)
,
Оба имеют разные параметры, поэтому это не так Method Overriding
, Однако в детском классе это можно рассматривать как Method Overloading
,
Когда вы вызываете метод, вы передаете list
Параметр и есть только единственный метод, который соответствует этой подписи, и это родительского класса. Так вызывается метод родительского класса.
Переопределение метода
Для переопределения методов методы в базовом и дочернем классах должны иметь одинаковую сигнатуру, т.е. одинаковое имя и одинаковые аргументы. Однако метод в дочернем классе может иметь более высокий спецификатор доступа к области, чем метод базового класса.
Проще говоря, если метод в базовом классе default
тогда метод в дочернем классе может быть public
,
Вот несколько правил для переопределения методов:
Список аргументов должен быть точно таким же, как и у переопределенного метода.
Возвращаемый тип должен быть тем же или подтипом возвращаемого типа, объявленного в исходном переопределенном методе в суперклассе.
Уровень доступа не может быть более ограничительным, чем уровень доступа переопределенного метода. Например: если метод суперкласса объявлен как открытый, то метод переопределения в подклассе не может быть ни частным, ни защищенным.
Методы экземпляра могут быть переопределены, только если они наследуются подклассом.
Метод, объявленный как final, не может быть переопределен.
Метод, объявленный как static, не может быть переопределен, но может быть повторно объявлен.
Если метод не может быть унаследован, он не может быть переопределен.
Подкласс в том же пакете, что и суперкласс экземпляра, может переопределить любой метод суперкласса, который не объявлен как private или final.
Подкласс в другом пакете может переопределять только не финальные методы, объявленные как открытые или защищенные.
Переопределяющий метод может генерировать любые непроверенные исключения независимо от того, выдает переопределенный метод исключения или нет. Однако переопределяющий метод не должен генерировать проверенные исключения, которые являются новыми или более широкими, чем те, которые объявлены переопределенным методом. Переопределенный метод может генерировать более узкие или меньшие исключения, чем переопределенный метод.
Если вы проверите это и затем написали код, было бы ясно, где это неправильно.