多型典型例子
阿新 • • 發佈:2018-12-23
我們先來談談一個多型靜態方法重寫的例子:
package classfileStaticcover;
class A
{
public static void test()
{
System.out.println("be cover ");
}
}
class B extends A
{
public static void test()
{
System.out.println("cover");
}
}
public class StatiCover
{
public static void main(String[] args)
{
A a_and_b = new B();
a_and_b.test();
}
}
上面的程式碼輸出的是父類test()方法裡面的字串。
再來看看一段程式碼,這段程式碼也是我今天看到了,覺得比較有用就拿來分析多型典型的例子:
package classfile;
class A
{
public String show(D obj)
{
return ("A and D");
}
public String show(A obj)
{
return ("A and A");
}
}
class B extends A
{
public String show(B obj)
{
return ("B and B");
}
public String show(A obj)
{
return("B and A");
}
}
class C extends B{}
class D extends B{}
public class TypiucalTest
{
public static void main(String[] args)
{
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println(a2.show(b));
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}
輸出結果如下面:
前面三個輸出估計沒有問題,接下來說明一下第四個,首先a2是A類的引用變數,它所指向的物件是B類的物件,可以看出這就是多型的特性,a2.show(b);計算機的執行過程為:首先到父類中尋找show(B obj)這個方法,但是發現找不到,於是找到形參為A定義的show(A obj)這個函式,把b賦值給a,在這一步上又有出現多型的特性,此時按理來說是輸出的“A and A”,但是不然,因為show(A obj)這個函式被子類B重寫了所以說要呼叫子類中的show(A obj)這個函式,以上三步是執行全過程,由此可以看出,多型特性中用父類變數呼叫成員方法是通過子類物件來呼叫的,所以最後一步呼叫了子類重寫父類的成員方法。有些書上總結了一些公式,但我覺得這種問題還是要從解析記憶體上理解,後面的幾個也差不多。