Java的多态
多态性是面向对象程序设计功能之一,允许我们以不同的方式执行单个操作。
例如,假设我们有一个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.out.println("Neigh");
}
}
以及
public class Cat extends Animal{
...
@Override
public void sound(){
System.out.println("Meow");
}
}
正如您所看到的那样,尽管我们对所有子类都有共同的sound()操作,但是有不同的方法来执行相同的操作。
这是多态性的完美示例(允许我们以不同方式执行同名方法)。
仅调用通用的sound()方法就没有任何意义,因为每个Animal都有不同的声音。
因此,我们可以说该方法执行的操作基于对象的类型。
什么是编程中的多态?
多态性是一种方法根据它所作用的对象做不同事情。
换句话说,多态允许您定义一个接口并具有多个实现。正如我们在上面的例子中看到的那样,我们已经定义了方法sound()并且在不同的2个子类中具有它的多个实现。
将在运行时确定将调用哪个sound()方法,因此我们上面给出的示例是运行时多态性示例。
方法重载和覆盖在前面的的教程中介绍过:
- 用方法重载 -这是编译时(或静态多态性)的例子
- 方法覆盖 -这是运行时间(或动态的多态性)的例子
多态的类型- 运行时多态和编译时多态
让我们写下它的完整代码.
运行时多态性示例:
//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();
}
}
Output:
Neigh
例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参数,第三种方法有双参数。
要调用哪个方法取决于我们在调用方法时传递的参数。
这发生在运行编译时所以这种类型的多态被称为编译时多态。
原文地址:
https://beginnersbook.com/2013/03/polymorphism-in-java/