Перегрузка и переопределение Java - PullRequest
20 голосов
/ 18 марта 2010

Мы всегда говорим, что перегрузка метода - это статический полиморфизм, а переопределение - это полиморфизм во время выполнения. Что именно мы подразумеваем под статичным здесь? Разрешен ли вызов метода при компиляции кода? Так в чем же разница между обычным вызовом метода и вызовом финального метода? Какой из них связан во время компиляции?

Ответы [ 9 ]

23 голосов
/ 18 марта 2010

Перегрузка метода означает создание нескольких версий функции на основе входов. Например:

public Double doSomething(Double x) { ... }
public Object doSomething(Object y) { ... }

Выбор метода для вызова производится во время компиляции. Например:

Double obj1 = new Double();
doSomething(obj1); // calls the Double version

Object obj2 = new Object();
doSomething(obj2); // calls the Object version

Object obj3 = new Double();
doSomething(obj3); // calls the Object version because the compilers see the 
                   // type as Object
                   // This makes more sense when you consider something like

public void myMethod(Object o) {
  doSomething(o);
}
myMethod(new Double(5));
// inside the call to myMethod, it sees only that it has an Object
// it can't tell that it's a Double at compile time

Переопределение метода означает определение новой версии метода подклассом оригинала

class Parent {
  public void myMethod() { ... }
}
class Child extends Parent {
  @Override
  public void myMethod() { ... }
}

Parent p = new Parent();
p.myMethod(); // calls Parent's myMethod

Child c = new Child();
c.myMethod(); // calls Child's myMethod

Parent pc = new Child();
pc.myMethod(); // call's Child's myMethod because the type is checked at runtime
               // rather than compile time

Надеюсь, это поможет

11 голосов
/ 18 марта 2010

Вы правы - вызовы перегруженных методов осуществляются во время компиляции. Вот почему это статический .

Вызовы переопределенных методов осуществляются во время выполнения в зависимости от типа, для которого вызывается метод.

О виртуальных методах Википедия говорит:

В Java все нестатические методы по умолчанию являются "виртуальными функциями". Только методы, помеченные ключевым словом final, не являются виртуальными.

final методы не могут быть переопределены, поэтому они реализуются статически.

Представьте себе метод:

public String analyze(Interface i) {
     i.analyze();
     return i.getAnalysisDetails();
}

Компилятор не может перегрузить этот метод для всех реализаций Interface, которые могут быть ему переданы.

5 голосов
/ 18 марта 2010

Я не думаю, что вы можете назвать перегрузку каким-либо полиморфизмом. Перегруженные методы связаны во время компиляции, что исключает возможность называть это полиморфизмом.

Полиморфизм относится к динамической привязке метода к его вызову, когда вы используете ссылку на базовый класс для объекта производного класса. Переопределение методов - это способ реализации этого полиморфного поведения.

1 голос
/ 07 июня 2017

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

Но оба метода различны, поэтому могут быть разрешены компилятором во время компиляции, поэтому он также известен как Полиморфизм времени компиляции или Статический полиморфизм

Переопределение метода означает определение метода в дочернем классе, который уже определен в родительском классе с такой же сигнатурой метода, т.е. с тем же именем, аргументами и типом возврата.

Mammal mammal = new Cat();
System.out.println(mammal.speak());

В строке mammal.speak() компилятор сообщает, что вызывается метод speak() ссылочного типа Mammal, поэтому для компилятора этот вызов Mammal.speak().

Но во время выполнения JVM ясно знает, что ссылка mammal содержит ссылку на объект Cat, поэтому для JVM этот вызов Cat.speak().

Поскольку вызов метода разрешается во время выполнения JVM, поэтому он также известен как Полиморфизм времени выполнения и Диспетчеризация динамического метода .

Разница между перегрузкой метода и переопределением метода

Difference Between Method Overloading and Method Overriding

Для получения более подробной информации вы можете прочитать Все о перегрузке метода и переопределении метода .

1 голос
/ 22 сентября 2010

Я согласен с Рэйчел, потому что в книге K & B прямо упоминается, что перегрузка не относится к полиморфизму в главе 2 (ориентация на объект). Но во многих местах я обнаружил, что перегрузка означает статический полиморфизм, потому что это время компиляции, а переопределение означает динамический полиморфизм, потому что это время выполнения.

Но одна интересная вещь в книге C ++ (Объектно-ориентированное программирование на C ++ - Роберт Лафоре) также прямо упоминается, что перегрузка означает статический полиморфизм. Но есть еще одна вещь: есть java и c ++, оба являются двумя разными языками программирования, и у них разные методы манипулирования объектами, поэтому может быть полиморфизм отличается в c ++ и java?

0 голосов
/ 13 мая 2019

Пытался покрыть все различия

                       Overloading                          Overriding

Method Name            Must be same                         Must be same

Argument Types         Must be same                         Must be different


Return Type            No restriction                       Must be same till 1.4V 
                                                            but after 1.4V 
                                                            co- variants 
                                                            were introduced

private/static/final   Can be overloaded                    Cannot be overridden

Access Modifiers       No restriction                       Cannot reduce the scope

Throws keyword         No restriction                       If child class method 
                                                            throws a checked 
                                                            exception the parent 
                                                            class method must throw 
                                                            the same or the  
                                                            parent exception

Method Resolution      Taken care by compiler               Taken care by JVM based 
                       based on reference types             on run-time object

Known as               Compile-Time Polymorphism,           RunTime Polymorphism, 
                       Static Polymorphism, or              dynamic polymorphism,
                       early binding                        late binding.
0 голосов
/ 13 июля 2018

Во-первых, я хочу обсудить динамический полиморфизм времени исполнения и компиляции / статический полиморфизм.

Статический полиморфизм во время компиляции: - как следует из названия, он связывает вызов функции с соответствующей функцией во время компиляции. Это означает, что компилятор точно знает, какой вызов функции связан с какой функцией. Перегрузка функций является примером полиморфизма времени компиляции.

Время выполнения / Динамический полиморфизм: -В этом типе компилятор полиморфизма не знает, какой вызов функции связан с какой функцией до запуска программы. Например. переопределение функции.

СЕЙЧАС, что такое переопределение функции и перегрузка функции ???

Перегрузка функции: - то же имя функции, но другая сигнатура / параметр функции.

eg. Area(no. of parameter) 
        {     -------------
           ----------------
             return area;}

         area of square requires  only one parameter
         area of rectangle requires two parameters(Length and breadth)

Переопределение функции: - изменить работу функции, которая присутствует в классе Superclass и Child. например. name () в суперклассе печатает "привет Рахул", но после переопределения в дочернем классе печатает "привет Акшит"

0 голосов
/ 19 августа 2014

Свойство Перегрузка Переопределение

Имена методов --------------> должны быть одинаковыми ---------------- должны быть одинаковыми

Типы Arg ------------------> Должны быть разными (хотя бы arg)

Метод Подпись

Тип возврата

Private, статических, Final

Модификатор доступа

попытаться / Поймать

Метод разрешения

0 голосов
/ 11 сентября 2012

Простое определение. Перегрузка методов связана с понятием наличия двух или более методов (функций) в одном классе с одинаковым именем, но разными аргументами.

Переопределение метода означает наличие двух методов с одинаковыми аргументами, но разной реализацией. Один из них будет существовать в родительском классе (базовый класс), а другой будет в производном классе (дочерний класс). Для этого требуется аннотация @ Override.

Проверьте это: Нажмите здесь для подробного примера

...