麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

產生正確的行為

2019-11-18 13:21:40
字體:
來源:轉載
供稿:網友


  知道java里綁定的所有方法都通過后期綁定具有多形性以后,就可以相應地編寫自己的代碼,令其與基礎類溝通。此時,所有的衍生類都保證能用相同的代碼正常地工作。或者換用另一種方法,我們可以“將一條消息發給一個對象,讓對象自行判定要做什么事情。”
  
  在面向對象的程序設計中,有一個經典的“外形”例子。由于它很輕易用可視化的形式表現出來,所以經常都用它說明問題。但很不幸的是,它可能誤導初學者認為OOP只是為圖形化編程設計的,這種熟悉當然是錯誤的。
  
  外形例子有一個基礎類,名為Shape;另外還有大量衍生類型:Circle(圓形),Square(方形),Triangle(三角形)等等。大家之所以喜歡這個例子,因為很輕易理解“圓屬于外形的一種類型”等概念。下面這幅繼續圖向我們展示了它們的關系:
  
產生正確的行為

  上溯造型可用下面這個語句簡單地表現出來:
  
  Shape s = new Circle();
  
  在這里,我們創建了Circle對象,并將結果句柄立即賦給一個Shape。這表面看起來似乎屬于錯誤操作(將一種類型分配給另一個),但實際是完全可行的——因為按照繼續關系,Circle屬于Shape的一種。因此編譯器認可上述語句,不會向我們提示一條出錯消息。
  
  當我們調用其中一個基礎類方法時(已在衍生類里覆蓋):
  
  s.draw();
  
  同樣地,大家也許認為會調用Shape的draw(),因為這究竟是一個Shape句柄。那么編譯器怎樣才能知道該做其他任何事情呢?但此時實際調用的是Circle.draw(),因為后期綁定已經介入(多形性)。
  
  下面這個例子從一個稍微不同的角度說明了問題:
  
  //: Shapes.java
  // Polymorphism in Java
  
  class Shape {
   void draw() {}
   void erase() {}
  }
  
  class Circle extends Shape {
   void draw() {
  System.out.   }
   void erase() {
  System.out.println("Circle.erase()");
   }
  }
  
  class Square extends Shape {
   void draw() {
  System.out.println("Square.draw()");
   }
   void erase() {
  System.out.println("Square.erase()");
   }
  }
  
  class Triangle extends Shape {
   void draw() {
  System.out.println("Triangle.draw()");
   }
   void erase() {
  System.out.println("Triangle.erase()");
   }
  }
  
  public class Shapes {
   public static Shape randShape() {
  switch((int)(Math.random() * 3)) {
   default: // To quiet the compiler
   case 0: return new Circle();
   case 1: return new Square();
   case 2: return new Triangle();
  }
   }
   public static void main(String[] args) {
  Shape[] s = new Shape[9];
  // Fill up the array with shapes:
  for(int i = 0; i < s.length; i++)
   s[i] = randShape();
  // Make polymorphic method calls:
  for(int i = 0; i < s.length; i++)
   s[i].draw();
   }
  } ///:~
  
  針對從Shape衍生出來的所有東西,Shape建立了一個通用接口——也就是說,所有(幾何)外形都可以描繪和刪除。衍生類覆蓋了這些定義,為每種非凡類型的幾何外形都提供了獨一無二的行為。
  
  在主類Shapes里,包含了一個static方法,名為randShape()。它的作用是在每次調用它時為某個隨機選擇的Shape對象生成一個句柄。請注重上溯造型是在每個return語句里發生的。這個語句取得指向一個Circle,Square或者Triangle的句柄,并將其作為返回類型Shape發給方法。所以無論什么時候調用這個方法,就絕對沒機會了解它的具體類型到底是什么,因為肯定會獲得一個單純的Shape句柄。
  
  main()包含了Shape句柄的一個數組,其中的數據通過對randShape()的調用填入。在這個時候,我們知道自己擁有Shape,但不知除此之外任何具體的情況(編譯器同樣不知)。然而,當我們在這個數組里步進,并為每個元素調用draw()的時候,與各類型有關的正確行為會魔術般地發生,就象下面這個輸出示例展示的那樣:
  
  Circle.draw()
  Triangle.draw()
  Circle.draw()
  Circle.draw()
  Circle.draw()
  Square.draw()
  Triangle.draw()
  Square.draw()
  Square.draw()
  
  當然,由于幾何外形是每次隨機選擇的,所以每次運行都可能有不同的結果。之所以要突出外形的隨機選擇,是為了讓大家深刻體會這一點:為了在編譯的時候發出正確的調用,編譯器毋需獲得任何非凡的情報。對draw()的所有調用都是通過動態綁定進行的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人午夜精品久久久久久久蜜臀 | 久久亚洲网 | 黄色一级毛片免费看 | 国产一区二区高清在线 | 成人男女视频 | 国产精品视频免费网站 | 看一级毛片 | 国产毛片毛片 | 亚洲一区 国产 | 色阁阁69婷婷 | 日本在线看 | 国产精品国产三级国产在线观看 | a视频在线看 | 久久爽精品区穿丝袜 | 羞羞视频免费观看网站 | 在线播放中文 | 久久2019中文字幕 | 91精品国产综合久久婷婷香蕉 | 欧美一级特黄aaaaaaa什 | 日本高清黄色片 | 97青青草视频 | 91久久精品一区二区 | 精品国产一二区 | 久色伊人 | 国产一级淫| 亚洲一级片免费观看 | 欧美日韩一区,二区,三区,久久精品 | 九九热在线观看视频 | jizzyouxxxx| 黄色特级毛片 | 久久精品亚洲精品国产欧美kt∨ | 亚洲国产馆 | 久久久中文 | 久久久精品视频免费 | 久草最新在线 | 久久精片| 天堂福利电影 | www.com香蕉 | 亚洲日本高清 | 欧美福利视频一区二区三区 | 羞羞视频在线免费 |