Перегрузка и переопределение Java

20

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

    
задан Padmanabh 18.03.2010 в 13:30
источник

8 ответов

21

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

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

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

    
ответ дан RHSeeger 18.03.2010 в 13:46
10

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

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

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

In Java, all non-static methods are by default "virtual functions." Only methods marked with the keyword final are non-virtual.

Методы

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

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

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

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

    
ответ дан Bozho 18.03.2010 в 13:39
  • Являются ли окончательные методы по-разному обработаны во время выполнения? Или окончательная версия применяется только во время компиляции? –  Thilo 18.03.2010 в 13:48
  • Еще один интересный аспект заключается в том, что только часть метода отправки для переопределенных методов выполняется во время выполнения: во время компиляции устанавливается точная подпись метода, независимо от типов значений времени выполнения. Единственная отправка, которая происходит во время выполнения, относится к типу объекта, метод которого вызывается. –  Thilo 18.03.2010 в 13:50
  • @Thilo Я не совсем уверен, как обрабатываются окончательные методы во время выполнения. Это должно быть написано в спецификации (которую я немного ленив, чтобы искать сейчас) –  Bozho 18.03.2010 в 13:59
5

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

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

    
ответ дан Rachel 18.03.2010 в 13:40
  • Нет - «полиморфизм» - это любой механизм, посредством которого осуществляется различное поведение в зависимости от типов. Независимо от того, происходит ли диспетчер во время выполнения или время компиляции, совершенно не имеет значения для определения полиморфизма. FYI, в контексте, где необходима дальнейшая классификация, перегрузка обычно называется «ad-hoc polymorphism». –  Konrad Rudolph 18.03.2010 в 16:43
5

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

2) Перегрузка метода выполняется внутри класса. Переопределение метода происходит в двух классах, которые имеют отношение IS-A (наследование).

3) В случае перегрузки метода параметр должен быть другим. В случае переопределения метода параметр должен быть таким же.

4) Перегрузка метода является примером полиморфизма времени компиляции. Переопределение метода - пример полиморфизма времени выполнения.

5) В java перегрузка метода не может быть выполнена путем изменения типа возвращаемого метода. Тип возврата может быть таким же или другим при перегрузке метода. Но вам придется изменить параметр. Тип возврата должен быть таким же или ковариантным в переопределении метода.

    
ответ дан Akkas Singh 16.06.2016 в 21:26
1

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

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

    
ответ дан subhashis 22.09.2010 в 19:15
1

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

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

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

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

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

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

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

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

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

    
ответ дан Naresh Joshi 07.06.2017 в 04:48
0

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

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

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

    
ответ дан Hisham Muneer 11.09.2012 в 19:13
0

Свойство Перегрузка с перегрузкой

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

Типы аргументов ------------------> должно быть другим (хотя бы аргумент)

Подпись метода

Тип возврата

Private, Static, Final

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

Try / Поймать

Разрешение метода

    
ответ дан Jaichander 19.08.2014 в 06:49
0

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

Средство переопределения метода имеет два метода с одинаковыми аргументами, но разные реализации. Один из них будет существовать в родительском классе, а другой - в производном или дочернем классе. Аннотирование @Override, в то время как не требуется, может быть полезным для обеспечения правильного переопределения метода во время компиляции.

    
ответ дан Amol Sawant 21.04.2017 в 04:56
0

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

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

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

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

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

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 () в суперклассе печатает "привет Рахул", но после переопределения в дочернем классе печатает "привет Акшит"

    
ответ дан Avnish kumar 13.07.2018 в 05:42