Перегрузка или переопределение метода?

#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 with Child p = new Child(); , компилятор выберет правильную перегрузку, и это будет потому, что теперь он может видеть перегрузки обоих методов (дочерних унаследованных), тогда Parent как будет отображаться только родительский

Ответ №2:

Это перегрузка. У вас одно и то же имя, но тип входных параметров отличается.

Чтобы подтвердить это, вы получите сообщение об ошибке при попытке прикрепить @Override аннотацию.

Integer и int это разные типы.