Java中多態的實現方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。
看代碼:
package com.company; public class Main { 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)); } } 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 { }
第一遍看的時候,第四,第五個看不懂
A a2=new B()
棧中的引用變量是A,堆中的實例變量是B。
將子類的實例,賦值給父類的引用。就是向上轉型。
向上轉型,在運行時,會遺忘子類對象中與父類對象中不同的方法。也會覆蓋與父類中相同的方法--重寫。
所以a2,可以調用的方法就是,A中有的,但是B中沒有的方法,和B中的重寫A的方法。
=============================================================================================
http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html