多态性是OOP的功能之一,它允许我们以不同的方式执行单个操作。例如,假设我们有一个Animal有方法的类sound()。因为这是一个通用类,所以我们不能给它一个实现,比如:Roar、Meow、Oink 等。我们必须给出一个通用的消息。
public class Animal{ ...
public void sound(){
System.out.println("Animal is making a sound");
}
}
现在假设我们是 Animal 类的两个子类:Horse它Cat扩展了Animal类。我们可以像这样为相同的方法提供实现:
public class Horse extends Animal { ... @Override public void sound (){ System . 出来。println ( "邻居" ); } }
和
public class Cat extends Animal{
...
@Override
public void sound(){
System.out.println("Meow");
}
}
正如你所看到的,虽然我们对所有子类都有共同的行动,sound()但有不同的方式来做同样的行动。这是多态性的完美示例(允许我们以不同方式执行单个操作的功能)。只调用通用 sound() 方法是没有任何意义的,因为每个 Animal 都有不同的声音。因此我们可以说这个方法执行的动作是基于对象的类型。
示例 1:Java 中的多态性
运行时多态示例:
Animal.java
public class Animal{
public void sound(){
System.out.println("Animal is making a sound");
}
}
Horse.java
class Horse extends Animal{
@Override
public void sound(){
System.out.println("Neigh");
}
public static void main(String args[]){
Animal obj = new Horse();
obj.sound();
}
}
输出:
Neigh
Cat.java
public class Cat extends Animal{
@Override
public void sound(){
System.out.println("Meow");
}
public static void main(String args[]){
Animal obj = new Cat();
obj.sound();
}
}
输出:
Meow
示例 2:编译时多态性
另一方面,方法重载是一个编译时多态性示例。
class Overload
{
void demo (int a)
{
System.out.println ("a: " + a);
}
void demo (int a, int b)
{
System.out.println ("a and b: " + a + "," + b);
}
double demo(double a) {
System.out.println("double a: " + a);
return a*a;
}
}
class MethodOverloading
{
public static void main (String args [])
{
Overload Obj = new Overload();
double result;
Obj .demo(10);
Obj .demo(10, 20);
result = Obj .demo(5.5);
System.out.println("O/P : " + result);
}
}
这里方法demo()重载了 3 次:第一个方法有 1 个 int 参数,第二个方法有 2 个 int 参数,第三个方法有 double 参数。调用哪个方法取决于我们在调用方法时传递的参数。这发生在运行编译时,因此这种类型的多态性称为编译时多态性。