工作小驛

          Ninja!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            103 Posts :: 0 Stories :: 36 Comments :: 0 Trackbacks

              昨天那節(jié)課我們了解了比較重要的概念面向?qū)ο?/span>,和javaOOP封裝、繼承、多態(tài)的特征。但是什么叫做多態(tài),是很多初學(xué)者不容易理解的問(wèn)題。對(duì)于繼承來(lái)說(shuō),很容易理解因?yàn)槟憔涂醋置娴囊馑季椭浪抢^承著父類的特性。多態(tài)字面不容易理解了。下面我們具體講一下吧!

              類之間的繼承關(guān)系使子類具有父類的所有變量和方法,=> 父類所具有的方法也可以在它所有子類中使用,發(fā)給父類的消息也可以發(fā)送給子類 => 子類的對(duì)象也是父類的對(duì)象=>子類的對(duì)象既可以做本身的類型,也可以做父類的類型。 呵呵,上述推導(dǎo)公式好像繞口令似的。我們舉個(gè)例子理解上述概念。舉例:

              public class 動(dòng)物 //動(dòng)物是父類

              public class extends 動(dòng)物 //貓是子類

          動(dòng)物的所有特性在貓中可以使用,發(fā)給動(dòng)物的信息貓也能收到=>貓的對(duì)象new ();既可以作為本身的類型 anew (); 也可以作為父類的類型 動(dòng)物 b = new ();這樣說(shuō)理解了嗎?如有疑問(wèn)請(qǐng)?jiān)L問(wèn)我們的技術(shù)論壇

          如果大家明白了的話,我們就可以從上述公式推導(dǎo)出結(jié)論,所有的子類都可以作為父類的類型(同一種類型)來(lái)對(duì)待。像剛才那個(gè)動(dòng)物有很多子類啊,可以有很多對(duì)象。動(dòng)物 a=new ();動(dòng)物 b=new (); 動(dòng)物 c=new ();。這樣的將子類型的對(duì)象引用轉(zhuǎn)換成父類型的對(duì)象引用,叫做上溯造型(upcasting)

          我們?cè)賮?lái)引伸一下,我們?cè)?/span>數(shù)組那節(jié)課里講了,數(shù)組存放的元素是相同類型的數(shù)據(jù),但是上溯造型使得java允許創(chuàng)建不同類型對(duì)象的數(shù)組。例如:

          Employee[] staff = new Employee[3];

          staff[0] = new Manager();

          staff[1] = new Secretary();

          staff[2] = new Employee();

          夷?這是怎么回事啊,數(shù)組里面不是相同類型嗎?對(duì)啊,因?yàn)?/span>SectetaryManagerEmployee的子類,所以也可以通過(guò)上溯造型變成Employee啊。以前我們還學(xué)到了所有對(duì)象都是從java.lang.Object 繼承下來(lái)的。如果數(shù)組要是 Object型的話 Object[] obj=new Object[];那就是里面放什么對(duì)象都行了。因?yàn)槭裁磳?duì)象都可以是Object型的。

          實(shí)踐:

          // java中的多態(tài)

          class Shape {

           void draw() {}

           void erase() {}

          }

          //圓形

          class Circle extends Shape {

           void draw() {

              System.out.println("Circle.draw()");

           }

           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:

                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];

              // 向數(shù)組里添加類型

              for(int i = 0; i < s.length; i++)

                s[i] = randShape();

              // 用多態(tài)的方法調(diào)用

              for(int i = 0; i < s.length; i++)

                s[i].draw();

           }

          } 上述源碼下載

          Java的多態(tài)性,有什么意義呢?它的突出優(yōu)點(diǎn)是使程序具有良好的擴(kuò)展性。它通過(guò)繼承,可以派生出任意多個(gè)新類型,或向基類增加更多方法時(shí),無(wú)須修改原有對(duì)基礎(chǔ)類進(jìn)行處理的相關(guān)程序。就是擴(kuò)展性好。

              我們返回再看面向?qū)ο螅▽V?/span>OOP)的這三個(gè)特性封裝、繼承、多態(tài)三者的關(guān)系。沒(méi)有封裝就沒(méi)有繼承,沒(méi)有繼承就沒(méi)有多態(tài)。

          posted on 2007-07-31 14:38 王君 閱讀(145) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 敦化市| 江门市| 长寿区| 曲沃县| 武山县| 蒙自县| 南岸区| 根河市| 潢川县| 卓尼县| 德兴市| 滁州市| 闽侯县| 潜山县| 泊头市| 贵州省| 东兴市| 大田县| 正宁县| 华亭县| 南城县| 秦皇岛市| 曲水县| 云和县| 邵东县| 永济市| 衡南县| 平遥县| 鱼台县| 永城市| 洪江市| 互助| 高邑县| 大洼县| 卢湾区| 玉山县| 江都市| 常山县| 黑山县| 西贡区| 贡觉县|