我们先来回顾一下多态的定义:
多态是同一个行为具有多个不同表现形式或形态的能力。
这句话看上去很不好理解,接下来我将用一个例子来帮助大家清晰地去理解什么是多态。
比如我们现在有一个父类animal ,它衍生出来的子类有猫类 cat ,狗类dog,我们知道动物都会叫,但是猫的叫是“喵喵喵”,狗子的叫是“汪汪汪”,因此对于“叫”这种行为,猫和狗的表现形式有所不同,这就称为多态。再举一个例子,对于一个男人,一天中会扮演不同的角色,在家是父亲,在上班的地方是员工,在汽车里是司机,这是一个人在一天中的不同的表现形式,也可以称之为多态。
在Java中多态分为两种:
- 编译期多态
- 运行期多态
首先是编译期多态,也称为静态多态,在Java中可以通过方法重载实现。在这里简单介绍一下方法重载。所谓方法重载,就是指同一个函数,传入不同类型或不同数目的参数时执行的方法也不同。举两个例子:
例1:不同类型的参数
class MultiplyFun {
// 两个int参数
static int Multiply(int a, int b)
{
return a * b;
}
// 两个double参数
static double Multiply(double a, double b)
{
return a * b;
}
}
class Main{
public static void main(String[] args)
{
System.out.println(MultiplyFun.Multiply(2, 4));
System.out.println(MultiplyFun.Multiply(5.5, 6.3));
}
}
输出
8
34.65
例2:不同数目的参数
class MultiplyFun{
// 两个参数
static int Multiply(int a, int b)
{
return a * b;
}
// 三个参数
static int Multiply(int a, int b, int c)
{
return a * b * c;
}
}
class Main {
public static void main(String[] args)
{
System.out.println(MultiplyFun.Multiply(2, 4));
System.out.println(MultiplyFun.Multiply(2, 7, 3));
}
}
输出:
8
42
第二个就是运行期多态,也称之为多态方法调度。在Java中可以通过方法重写实现。所谓方法重写就是指一个子类继承了父类后,会对父类中的一些函数进行修改,所以父类的方法就在子类中重写了。下面举一个例子。
class Parent {
void Print()
{
System.out.println("parent class");
}
}
class subclass1 extends Parent {
void Print()
{
System.out.println("subclass1");
}
}
class subclass2 extends Parent {
void Print()
{
System.out.println("subclass2");
}
}
class TestPolymorphism3 {
public static void main(String[] args)
{
Parent a;
a = new subclass1();
a.Print();
a = new subclass2();
a.Print();
}
}