我們先來回顧一下多態(tài)的定義:
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。
這句話看上去很不好理解,接下來我將用一個例子來幫助大家清晰地去理解什么是多態(tài)。
比如我們現(xiàn)在有一個父類animal ,它衍生出來的子類有貓類 cat ,狗類dog,我們知道動物都會叫,但是貓的叫是“喵喵喵”,狗子的叫是“汪汪汪”,因此對于“叫”這種行為,貓和狗的表現(xiàn)形式有所不同,這就稱為多態(tài)。再舉一個例子,對于一個男人,一天中會扮演不同的角色,在家是父親,在上班的地方是員工,在汽車?yán)锸撬緳C(jī),這是一個人在一天中的不同的表現(xiàn)形式,也可以稱之為多態(tài)。
在Java中多態(tài)分為兩種:
- 編譯期多態(tài)
- 運(yùn)行期多態(tài)
首先是編譯期多態(tài),也稱為靜態(tài)多態(tài),在Java中可以通過方法重載實(shí)現(xiàn)。在這里簡單介紹一下方法重載。所謂方法重載,就是指同一個函數(shù),傳入不同類型或不同數(shù)目的參數(shù)時執(zhí)行的方法也不同。舉兩個例子:
例1:不同類型的參數(shù)
class MultiplyFun {
// 兩個int參數(shù)
static int Multiply(int a, int b)
{
return a * b;
}
// 兩個double參數(shù)
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:不同數(shù)目的參數(shù)
class MultiplyFun{
// 兩個參數(shù)
static int Multiply(int a, int b)
{
return a * b;
}
// 三個參數(shù)
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
第二個就是運(yùn)行期多態(tài),也稱之為多態(tài)方法調(diào)度。在Java中可以通過方法重寫實(shí)現(xiàn)。所謂方法重寫就是指一個子類繼承了父類后,會對父類中的一些函數(shù)進(jìn)行修改,所以父類的方法就在子類中重寫了。下面舉一個例子。
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();
}
}