【翻译】Java面向对象编程基本概念——多态
原文地址:What is Polymorphism in Java
“多态通常指的是面向对象编程中,通过上下文来创建不同形态的变量、函数或对象”—维基百科
简单地来说,多态是创建在不同程序上下文中呈现不同行为状态函数或引用对象的能力。多态和继承、抽象以及封装一起形成了面向对象编程的主要基础。更多,请阅读:Java Encapsulation and its Relation With Abstraction
多态的一种示例,通过定义父类的引用变量引用一个子类的实例,如:
Object o = new Object(); //o can hold the reference of any subtype
Object o = new String();
Object o = new Integer();
这是多态最基本的示例之一。
在Java中,从本质上来看,多态存在两个不同的类型:
* 编译时多态(静态的绑定或方法重载)
* 运行时多态(动态的绑定或方法重写)
理解这两种类型Java中的区别非常重要。
一、编译时多态(静态的绑定或方法重载)
正如标题暗示的那样,编译时多态通过在代码编译时决定程序的控制流程,通过通过方法重载来实现。
方法重载,即一个对象拥有两个或两个以上相同命名的方法,但这些方法的参数不同,参数类型不同或参数数量不同。如下:
1.参数类型不同,如:java.util.Math.max()
方法存在如下多种形式:
public static double Math.max(double a, double b){...}
public static float Math.max(float a, float b){...}
public static int Math.max(int a, int b){...}
public static long Math.max(long a, long b){...}
实际调用的方法是基于调用时传入的参数类型在程序编译时决定。
2.参数数量不同,函数接收不同数量的参数,如:在员工管理应用中的工厂类可以有如下方法:
EmployeeFactory.create(String firstName,String lastName){...}
EmployeeFactory.create(Integer id,String firstName,String lastName){...}
上述两个方法拥有相同的名字create
,但实际调用的方法是由程序中传入的参数决定。
二、运行时多态(动态的绑定或方法重写)
运行时多态本质是方法重载。重载是继承的一个特性。可以举一个现实世界的例子来解释多态。如:动物。在一个系统中有一个Animal
类,以及该类的子类,如Cat
和Dog
。这些子类会重写Animal
类中一些默认的行为,并提供一些自身特殊的行为。
public class Animal {
public void makeNoise()
{
System.out.println("Some sound");
}
}
class Dog extends Animal{
public void makeNoise()
{
System.out.println("Bark");
}
}
class Cat extends Animal{
public void makeNoise()
{
System.out.println("Meawoo");
}
}
在应用中具体调用哪个makeNoise()
方法,取决于运行时哪个类型的实例被创建。
三、小结
1、多态是使变量、方法或对象具有多种形态的能力。
2、在Java中,多态可以分成两种类型:方法重载和方法重写。
3、有些开发人员认为方法重载不属于多态,那编译时多态指的是什么?
4、另一个关于重载的论题是操作符重载。如:”+”操作符可以用于两个整型数据相加,也可以用于字符串连接。