Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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 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 myMethod

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

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

Я надеюсь, что это поможет

Ответ 2

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

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

В виртуальных методах wikipedia говорит:

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

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

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

Тип возврата

Private, Static, Final

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

Try/Поймать

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

Ответ 9

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

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

Ответ 10

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

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

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

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

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

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

Ответ 11

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

                       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.