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

17

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

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

9 ответов

18

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

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

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

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

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

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

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

  

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

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

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

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

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

    
ответ дан Bozho 18.03.2010 в 13:39
источник
5

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

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

    
ответ дан Rachel 18.03.2010 в 13:40
источник
5

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

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

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

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

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

    
ответ дан Akkas Singh 16.06.2016 в 21:26
источник
1

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

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

    
ответ дан subhashis 22.09.2010 в 19:15
источник
1

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

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

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

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

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

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

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

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

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

    
ответ дан Naresh Joshi 07.06.2017 в 04:48
источник
0

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

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

Проверьте это: Нажмите здесь, чтобы получить подробный пример

    
ответ дан Hisham Muneer 11.09.2012 в 19:13
источник
0

Свойство Over-loading Overriding

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

Типы Arg ------------------ & gt; должны быть разными (по крайней мере, arg)

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

Тип возврата

Private, Static, Final

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

Try / Поймать

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

    
ответ дан Jaichander 19.08.2014 в 06:49
источник
0

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

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

    
ответ дан Amol Sawant 21.04.2017 в 04:56
источник