風子的咖啡屋

           

          2006年3月21日

          多態

            什么叫多態?我們先來談談繼承。在面向對象的編程中,繼承是一種常用的技術。假設有一個類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)編輯 收藏

          2006年3月19日

          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)編輯 收藏

          2006年3月16日

          我眼中的Eclipse和Netbeans

          我覺得這兩種工具都很優秀,各有優缺點。不好意思說了句廢話。再說句實話,本人對這兩種工具都不是很熟悉(這么一來整篇文章都成廢話了,呵呵)。說點實際點的,用了一會Netbeans,覺得真的很不錯,感覺很爽,可惜的是字體實在是太難看了,尤其是output窗口的字體,參照了很多方法,折騰了兩天都沒把字體調過來。唉,兩天時間很多同志連個小程序都編出來了,敝人不才,既然連個小字體都搞不定,慚愧之極!所以決定撤了,不然我的腦細胞就死在這個小破字體手里了,不值。等Netbeans什么時候把字體搞好了再說吧。你也許會問字體真的那么重要嗎?這個問題嘛,嗯...,對我來說是很重要,因為我近似啊,呵呵,別說O和0,默認的字體連f和r我都分不清。說著,說著,天就亮了,夷,可是才剛天黑啊。是Eclispe的小月亮冒出來了,很喜歡這個啟動界面,其實功能上80%和Netbeans都差不多,但是編譯的速度我個人感覺比Netbeans更快,可以說快多了(windows下),最重要的是字體要好看多了,這樣我就不用靠顯示器太近來接受它的輻射了(聽說顯示器50厘米以內的輻射大的嚇人啊)。有的細節上做的不如Netbeans,比如關鍵字自動提示,Netbeans不但有提示,還自動引用JDK文檔,非常的方便。我知道自己說的比較膚淺,我前提不是已經說了我不熟嘛,等我滿滿熟悉這兩種工具了,再說點有點深度的吧。不過,怎么就沒有把兩者的優點結合起來的工具呢?郁悶!

          posted @ 2006-03-16 08:45 風子 閱讀(481) | 評論 (0)編輯 收藏

          僅列出標題  

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南京市| 金溪县| 新乡县| 德令哈市| 芜湖县| 麦盖提县| 米脂县| 句容市| 双桥区| 喀喇| 枣庄市| 吴川市| 托里县| 秦皇岛市| 平度市| 玉山县| 颍上县| 方正县| 奈曼旗| 河北区| 昌江| 凤凰县| 徐闻县| 手游| 岳普湖县| 左贡县| 寿光市| 当雄县| 霍邱县| 隆子县| 绥芬河市| 横山县| 平潭县| 营山县| 徐水县| 霍山县| 双牌县| 涪陵区| 毕节市| 镇康县| 勐海县|