繼承多態繞點 Java篇

上一篇把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裏面 重載,繼承的情況下方法的訪問順序

沒有順序,自身方法,繼承來的方法,多態系方法一視同仁

如果是滿足多態的情就簡單,表現多態就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章