#java #oop
#java #ооп
Вопрос:
У нас есть родительский и дочерний классы, в которых есть метод с тем же именем, но аргумент является примитивным и оболочкой. Не мог бы кто-нибудь, пожалуйста, объяснить причину, будет ли это называться переопределением метода и перегрузкой метода. Запуск этой программы вызовет родительский метод, который будет переопределять, а не перегружать, искать объяснения.
class Parent {
public void takeValue(int a) {
System.out.println("take value method from parent is invoked");
}
}
class Child extends Parent {
public void takeValue(Integer a) {
System.out.println("take value method from child is invoked");
}
public static void main(String[] args) {
Parent p = new Child();
p.takeValue(new Integer(51));
}
}
Комментарии:
1. своего рода перегрузка: классическое определение перегрузки — это предоставление метода с тем же именем, но с другой сигнатурой в том же классе. Здесь вы делаете это в унаследованном классе.
Ответ №1:
Метод перегружен.
Запуск этой программы вызовет родительский метод, который будет переопределять, а не перегружать
ДА. Вы вызываете takeValue
Parent
переменную, что означает, что компилятор будет искать совпадение сигнатур в Parent
классе. Перегрузка здесь даже не видна (подписи сопоставляются на основе статических типов, т. Е. Java Находит метод на основе объявленного типа данных переменной, для которой вызывается метод, а не с типом данных объекта, присвоенного переменной, что было бы проблемой во время выполнения).
И поскольку public void takeValue(Integer a)
не учитывается компилятором при проверке вызова метода, p.takeValue(new Integer(51));
связан с Parent.takeValue(int)
помощью автоматической блокировки (он соответствовал бы другому методу, если бы оба они были видны — или объявлены в Parent
классе в этом примере).
Комментарии:
1. не могли бы вы немного уточнить или сослаться на статью о сопоставлении подписей на основе статических типов
2. @greenHorn не знаю, объясняет ли это строка, которую я добавил… но «статический» в этом случае означает основанный на информации, доступной во время компиляции. Java проверяет вызовы методов на основе типа данных переменной, для которой вызывается метод, в дополнение к передаваемым параметрам. Другими словами, компилятор не знает, является ли экземпляр дочерним объектом. Если вы объявили
p
withChild p = new Child();
, компилятор выберет правильную перегрузку, и это будет потому, что теперь он может видеть перегрузки обоих методов (дочерних унаследованных), тогдаParent
как будет отображаться только родительский
Ответ №2:
Это перегрузка. У вас одно и то же имя, но тип входных параметров отличается.
Чтобы подтвердить это, вы получите сообщение об ошибке при попытке прикрепить @Override
аннотацию.
Integer
и int
это разные типы.