上一篇把C#語言的繼承,多態裏的特殊的情況做了一下總結,其實那一部分代碼都是從Java翻譯過去的,今天來總結一下Java在這種情況下是怎麼調用的。
上一篇我們說的是:
1.多態,只在多態系裏方法調用,很簡單,先調重寫方法,如果沒有再調父類的虛方法。
2.非多態,只自聲明時類型,先調自身的方法(比如非繼承普通方法,new修飾的方法),如果沒有再看繼承來的方法,最後再看多態系方法(也就是重寫了的方法)
但是Java裏做了測試,這個規律不適用,下面是測試代碼
public class Shape { } public class Rectangle extends Shape { } public class Triangle extends Shape { } public class Father { public void Draw(Rectangle rect) { System.out.println("Father.Draw Rect"); } public void Draw(Triangle tri) { System.out.println("Father.Draw Tri"); } } public class Son extends Father { public void Draw(Shape shape) { System.out.println("Son.Draw Sha"); } @Override public void Draw(Triangle tri) { System.out.println("Son.Draw Tri"); } }
調用代碼段
Father fa = m.new Son(); Son so = m.new Son(); Shape s = m.new Shape(); Rectangle r = m.new Rectangle(); Triangle t = m.new Triangle(); fa.Draw(r);//1 fa.Draw(t); so.Draw(s);//2 so.Draw(r); so.Draw(t);
//1部分也是滿足多態的,所以很簡單能看出結果
Father.Draw Rect
Son.Draw Tri
//2部分結果,如下
Son.Draw Sha
Father.Draw Rect
Son.Draw Tri
在多種情況測試下,可以得出Java裏面自身方法,繼承方法,多態系方法都是同等重要的,沒有先後順序,主要是自身的方法,與繼承方法沒有先後順序,當然有了方法重現,也就不會出現繼承方法。所以Java裏面更好理,只要是非多態裏面調用就是這幾種方法同等,只要有就會調用,就不會像C#先調自身方法這種情況。所以so.Draw(r)和so.Draw(t) 結果是Father.Draw Rect和Son.Draw Tri,雖然第1個調用自身沒有方法,但是有從父類繼承來的方法,所以調用。第2個調用有一個重寫的方法,因爲這幾個方法調用順序平等,所不會調Shape參數的方法,如果沒有這個重寫的方法就會調繼承下來的,如果沒有才會調Shape參數的方法。
最後,從這裏來看Java要比C#要好理解些,因爲沒出現virtual,new這些修飾詞,統一平等對待。
總結一下:
Java裏面 重載,繼承的情況下方法的訪問順序
沒有順序,自身方法,繼承來的方法,多態系方法一視同仁
如果是滿足多態的情就簡單,表現多態就行了。