風子的咖啡屋

           

          2006年3月19日

          多態

            什么叫多態?我們先來談談繼承。在面向對象的編程中,繼承是一種常用的技術。假設有一個類Shap,Shap有兩個方法,即draw()和erase()。Circle也是一種特殊Shap,所以只需要使用繼承的方法,使用class CricleextendsShap語句就可以創建一個新類Circle。Circle類具有Shap類的全部特征,包括所有的方法。這里只介紹了繼承,到底這和多態有什么關系,到底什么又叫多態呢?看下面的語句:
          ?class Shap {
          ?void draw(){
          ??System.out.println("Shap.draw()");
          ?}
          ?void erase(){
          ??System.out.println("Shap.erase()");
          ?}

          ?

          }
          class Circle extends Shap{
          ?void draw(){
          ??System.out.println("Circle.draw()");
          ?}
          ?void erase(){
          ??System.out.println("Circle.erase()");
          ?}
          }

          ?

          class Square extends Shap{
          ?void draw(){
          ??System.out.println("Square.draw()");
          ?}
          ?void erase(){
          ??System.out.println("Square.erase()");
          ?}
          }

          public class Picture{
          ?void add(Shap s){
          ??s.draw();
          ?}
          ?public static void main(String[] args) {
          ??Picture p=new Picture();
          ??Shap[] e={
          ????new Circle(),
          ????new Square()
          ??};
          ??for(int i=0;i<e.length;i++)
          ??p.add(e[i]);
          ?}
          ?
          }
          注意看上面加紅色的語句,及void add(Shap s){s.draw();}這表示一個Picture類的一個方法要使用Shap類作為形式參數并調用該參數的draw()方法。我們在接下來的語句中看到,不管你的Shap類的子類是Circle還是Square,在傳遞給方法add()后,add()能自動判斷是調用Circle的draw()方法還是Square的draw()方法。JAVA這種“后期綁定”的本領就叫做多態??梢钥闯?,你不必專門為Circle類寫一個add()方法,再為Square寫一個add()方法,只需要為它們的基類寫一個方法,剩下的編譯器就能為你自動選擇你想要調用的正確的方法。如果多態僅僅是一種“向上轉型”的形式的話,我們得到的僅僅是節省了一點代碼的話,也許我們不必要給予太多的關注,那多態到底有什么其它好處呢?在上面的例子中新加一個Line類,它也繼承了Shap類,如下所示:
          ?class Shap {
          ?void draw(){
          ??System.out.println("Shap.draw()");
          ?}
          ?void erase(){
          ??System.out.println("Shap.erase()");
          ?}

          ?

          }
          class Circle extends Shap{
          ?void draw(){
          ??System.out.println("Circle.draw()");
          ?}
          ?void erase(){
          ??System.out.println("Circle.erase()");
          ?}
          }

          ?

          class Square extends Shap{
          ?void draw(){
          ??System.out.println("Square.draw()");
          ?}
          ?void erase(){
          ??System.out.println("Square.erase()");
          ?}
          }

          class?Line extends Shap{
          ?void draw(){
          ??System.out.println("Line.draw()");
          ?}
          ?void erase(){
          ??System.out.println("Line.erase()");
          ?}
          }

          public class Picture{
          ?void add(Shap s){
          ??s.draw();
          ?}
          ?public static void main(String[] args) {
          ??Picture p=new Picture();
          ??Shap[] e={
          ????new Circle(),
          ????new Square(),
          ??? new Line()
          ??};
          ??for(int i=0;i<e.length;i++)
          ??p.add(e[i]);
          ?}
          ?
          }

          可以看出add()方法根本不必要知道有新類的增加而繼續正常工作。咋看,這只不過還是節省了幾行代碼的問題,你可以為每個子類都寫一個add()方法,同樣能解決問題。有新類的加入時再為這個新類寫add()方法。這不僅僅是節省了幾行代碼,多敲幾行代碼并不會如何提高編碼的效率。這是一個思想,你根本不用關心基類今天多了一個子類,明天又多了一個子類,不用擔心的你的代碼中,對于新加入的子類能否正常的運行,因為你直接與基類的接口進行通信,避免了復雜性。換句話說,你的代碼具有很好的可擴展性,基類可以隨時根據需要進行擴展而不用擔心代碼的運行問題。

          posted @ 2006-03-21 08:32 風子 閱讀(213) | 評論 (0)編輯 收藏

          final關鍵字的用法

          final關鍵字:
          可以在三種情況下使用final,及final數據,final方法,final類
          1.final數據。final修飾的數字表示一個永不改變的編譯時常量,對這個常量定義時必須對其進行賦值,可以在構造器中對其進行賦值(這種方法又叫空白final)。
          用final加static修飾的字段只占據一段不可改變的存儲空間。
          2.final方法。final方法是把方法鎖定,確保在繼承中該方法行為保持不變,并且不會被覆蓋。
          3.fianl類。final修飾的類不能有繼承類。

          posted @ 2006-03-19 23:25 風子 閱讀(258) | 評論 (0)編輯 收藏

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 齐河县| 彩票| 页游| 沁水县| 邛崃市| 宝山区| 融水| 嵊州市| 老河口市| 星座| 文水县| 丰台区| 昭苏县| 高尔夫| 金塔县| 广水市| 漳平市| 太仆寺旗| 芷江| 贞丰县| 西乌珠穆沁旗| 蕲春县| 巴彦淖尔市| 巴彦县| 沾益县| 高安市| 博客| 西昌市| 方城县| 察隅县| 太仆寺旗| 马尔康县| 东乌珠穆沁旗| 高台县| 扎赉特旗| 海安县| 铜陵市| 卢氏县| 云浮市| 凌云县| 濮阳市|