Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
          數(shù)據(jù)加載中……

          多態(tài)學(xué)習(xí)心得

          作者:Flyingis

              這幾天我在重新復(fù)習(xí)
          Java語言基礎(chǔ),雖然和團隊一起,自己個人都進行了實際項目的開發(fā),但越往上面走越覺得自己應(yīng)該花點時間看看Java的基礎(chǔ)知識,鞏固一下基礎(chǔ)。今天復(fù)習(xí)的是多態(tài),同時寫下自己的學(xué)習(xí)心得。

          數(shù)據(jù)抽象、繼承和多態(tài)是面向?qū)ο蟪绦蛟O(shè)計語言的三大特性。多態(tài),我覺得它的作用就是用來將接口和實現(xiàn)分離開,改善代碼的組織結(jié)構(gòu),增強代碼的可讀性。在某些很簡單的情況下,或許我們不使用多態(tài)也能開發(fā)出滿足我們需要的程序,但大多數(shù)情況,如果沒有多態(tài),就會覺得代碼極其難以維護。

          Java中,談?wù)摱鄳B(tài)就是在討論方法調(diào)用的綁定,綁定就是將一個方法調(diào)用同一個方法主體關(guān)聯(lián)起來。在C語言中,方法(C中稱為函數(shù))的綁定是由編譯器來實現(xiàn)的,在英文中稱為early binding(前期綁定),因此,大家自然就會想到相對應(yīng)的late binding(后期綁定),這在Java中通常叫做run-time binding(運行時綁定),我個人覺得這樣稱呼更貼切,運行時綁定的目的就是在代碼運行的時候能夠判斷對象的類型。通過一個簡單的例子說明:

          /**

           * 定義一個基類

           */

          public Class Parents {

            public void print() {

              System.out.println(“parents”);

          }

          }

          /**

           * 定義兩個派生類

           */

          public Class Father extends Parents {

            public void print() {

              System.out.println(“father”);

          }

          }

          public Class Mother extends Parents {

            public void print() {

              System.out.println(“mother”);

          }

          }

          /**

           * 測試輸出結(jié)果的類

           */

          public Class Test {

            public void find(Parents p) {

              p.print();

          }

          public static void main(String[] args) {

            Test t = new Test();

            Father f = new Father();

            Mother m = new Mother();

            t.find(f);

            t.find(m);

          }

          }

          最后的輸出結(jié)果分別是fathermother,將派生類的引用傳給基類的引用,然后調(diào)用重寫方法,基類的引用之所以能夠找到應(yīng)該調(diào)用那個派生類的方法,就是因為程序在運行時進行了綁定。

          學(xué)過Java基礎(chǔ)的人都能很容易理解上面的代碼和多態(tài)的原理,但是仍有一些關(guān)鍵的地方需要注意的,算是自己對多態(tài)的一個小結(jié):

          1.        Java中除了staticfinal方法外,其他所有的方法都是運行時綁定的。在我另外一篇文章中說到private方法都被隱式指定為final的,因此final的方法不會在運行時綁定。當(dāng)在派生類中重寫基類中staticfinal、或private方法時,實質(zhì)上是創(chuàng)建了一個新的方法。

          2.        在派生類中,對于基類中的private方法,最好采用不同的名字。

          3.        包含抽象方法的類叫做抽象類。注意定義里面包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的接口。

          4.        對象清理的順序和創(chuàng)建的順序相反,當(dāng)然前提是自己想手動清理對象,因為大家都知道Java垃圾回收器。

          5.        在基類的構(gòu)造方法中小心調(diào)用基類中被重寫的方法,這里涉及到對象初始化順序。

          6.        構(gòu)造方法是被隱式聲明為static方法。

          7.        用繼承表達行為間的差異,用字段表達狀態(tài)上的變化。

          posted on 2005-10-31 19:28 Flyingis 閱讀(1187) 評論(1)  編輯  收藏 所屬分類: JavaSE

          評論

          # re: 多態(tài)學(xué)習(xí)心得  回復(fù)  更多評論   

          怎么 跟Think in java說的一模一樣 沒有新意!
          類實例的引用就是指向一個句柄(handle)的指針,而該句柄(handle)其實是一對指針:其中一個指針指向一張表,該表格包含了對象的方法列表以及一個指向類對象(表示對象類型)的指針;另一個指針指向一塊內(nèi)存地址,該內(nèi)存是從java堆中為對象的數(shù)據(jù)而分配出來的。
          這是最基礎(chǔ)的.你還要想想為什么JAVA中可以動態(tài)綁定以什么樣的機制保證的.
          2006-10-24 21:35 | java[匿名]
          主站蜘蛛池模板: 靖宇县| 岱山县| 三穗县| 阿拉善左旗| 道孚县| 加查县| 茂名市| 青铜峡市| 任丘市| 义马市| 万山特区| 垫江县| 绥江县| 三门峡市| 湘潭市| 新沂市| 沽源县| 敦煌市| 泸州市| 抚宁县| 龙陵县| 安乡县| 沽源县| 玉树县| 永泰县| 石屏县| 界首市| 铜川市| 山西省| 砀山县| 三台县| 大安市| 沁阳市| 自贡市| 门源| 台东市| 灵丘县| 辽中县| 西青区| 民和| 安宁市|