Мы всегда говорим, что перегрузка метода - это статический полиморфизм, а переопределение - полиморфизм во время выполнения. Что конкретно мы подразумеваем под статикой здесь? Является ли вызов метода разрешенным при компиляции кода? Итак, какова разница между обычным вызовом метода и вызовом окончательного метода? Какой из них связан во время компиляции?
Перегрузка и переопределение Java
Ответ 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.