java多態性理解

參考鏈接:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html

主要概念:就是繼承,重寫,來增加靈活性,

  1. 多態的定義指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行爲方式。(發送消息就是函數調用)

  2. 多態存在的三個必要條件:要有繼承,要有重寫,父類引用指向子類對象。這第三點意思是:

    例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是接口,CatDog是繼承或實現Animal的子類。

     Animal animal = new Cat();

   即聲明的是父類,實際指向的是子類的一個對象。這是什麼意思呢?

     那這麼使用的優點是什麼,爲什麼要這麼用?可以用這幾個關鍵詞來概括:多態、動態鏈接,向上轉型。

     很簡單,它表示我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由於Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。這就是“向上轉型”。

那麼這樣做有什麼意義呢?因爲子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特, 定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。 所以,父類類型的引用可以調用父類中定義的所有屬性和方法,而對於子類中定義而父類中沒有的方法,父類引用是無法調用的 

那什麼是動態鏈接呢?當父類中的一個方法只有在父類中定義而在子類中沒有重寫的情況下,纔可以被父類類型的引用調用; 對於父類中定義的方法,如果子類中重寫了該方法,那麼父類類型的引用將會調用子類中的這個方法,這就是動態連接。    

看一個例子:

class Father{

    public void func1(){

    func2();

    }

    //這是父類中的func2()方法,因爲下面的子類中重寫了該方法

    //所以在父類類型的引用中調用時,這個方法將不再有效

    //取而代之的是將調用子類中重寫的func2()方法

    public void func2(){

    System.out.println("AAA");

    }

    }

    class Child extends Father{

    //func1(int i)是對func1()方法的一個重載,主要不是重寫!

    //由於在父類中沒有定義這個方法,所以它不能被父類類型的引用調用

    //所以在下面的main方法中child.func1(68)是不對的

    public void func1(int i){

    System.out.println("BBB");

    }

    //func2()重寫了父類Father中的func2()方法

    //如果父類類型的引用中調用了func2()方法,那麼必然是子類中重寫的這個方法

    public void func2(){

    System.out.println("CCC");

    }

    }

    public class PolymorphismTest {

    public static void main(String[] args) {

    Father child = new Child();

    child.func1();//打印結果將會是什麼?

    child.func1(68);

    }

    }

上面的程序是個很典型的多態的例子。子類Child繼承了父類Father,並重載了父類的func1()方法,重寫了父類的func2()方法。重載後的func1(int i)和func1()不再是同一個方法,由於父類中沒有func1(int i),那麼,父類類型的引用child就不能調用func1(int i)方法。而子類重寫了func2()方法,那麼父類類型的引用child在調用該方法時將會調用子類中重寫的func2()。 

打印的結果是:“CCC"

   參考:http://www.cnblogs.com/ChrisMurphy/p/5054256.html


   3.Java中多態的實現的三種方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。

 4.方法的重寫、重載與動態連接構成多態性。Java之所以引入多態的概念,原因之一是它在類的繼承問題上和C++不同,後者允許多繼承,這確實給其帶來的非常強大的功能,但是複雜的繼承關係也給C++開發者帶來了更大的麻煩,爲了規避風險,Java只允許單繼承,派生類與基類間有IS-A的關係(即“貓”is a “動物”)。這樣做雖然保證了繼承關係的簡單明瞭,但是勢必在功能上有很大的限制,所以,Java引入了多態性的概念以彌補這點的不足,此外,抽象類和接口也是解決單繼承規定限制的重要手段。同時,多態也是面向對象編程的精髓所在。



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