Чтобы ответить на ваши вопросы:
- Это возможность выбирать более специализированные методы в время выполнения в зависимости от объекта, который используется для его вызова.
- Ofкурс.Полиморфизм может возникнуть без участия абстрактных классов.
- Нет, перегрузка / переопределение не являются типами полиморфизма.
Вот пример с полиморфизмом, происходящим без абстракциизадействованные классы.
// non abstract
class A
{
public void a()
{
System.out.println("Hello from A");
}
}
class B
extends A
{
@Override
public void a()
{
System.out.println("Hello from B");
}
}
class C
{
public static void SomeStatic(A a)
{
// HERE IS WHERE POLYMORPHISM OCCUR
a.a();
}
}
Полиморфизм в классе C
происходит потому, что метод SomeStatic
может быть вызван с ссылкой на объект или ссылкой на объект B .Если он вызывается со ссылкой на A , будет вызван A
метод a
.Если он вызывается со ссылкой на B , будет вызван метод B
a
.Эта способность изменять во время выполнения фактический вызываемый метод называется Полиморфизм .
Перегрузка не имеет ничего общего с Полиморфизм .На самом деле, вы можете иметь перегрузку без наследования, если хотите.Вы даже можете иметь перегрузку без ориентации объекта . Перегрузка просто позволяет существовать двум функциям с одинаковыми именами, но с разными параметрами.
Переопределение , с другой стороны, просто переопределяет метод вспециализированный (унаследованный) класс. Переопределение метод необходим для полиморфизма.В противном случае во время выполнения не будет ДВОЙНЫХ ВОЗМОЖНОСТЕЙ (внимательно посмотрите на пример).
Класс C - ключ к пониманию всего этого:
class Main
{
public static void main(String[] args)
{
A a = new A();
B b = new B();
C.SomeStatic(a); // will call A's a
C.SomeStatic(b); // will call B's a
// AND THIS IS POLYMORPHISM
// C will decide WHICH METHOD TO CALL
// only at runtime
}
}
Поли : происходит от Греческий .Значит много . Morph : происходит от греческого .Означает форма .
Так что в Полиморфизм имеется "много" ( поли ) "формы" ( morph ) вызова метода.Какой из них будет вызываться, зависит от объекта, используемого для вызова метода.