牛牛組合

          春風不相識,何事入羅幃?

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 2 文章 :: 1 評論 :: 0 Trackbacks

          2009年7月11日 #

          來自網絡,原作者已不可考,謝謝原作者!

          • 方法一:
          打開記事本,復制以下內容,并保存為(*.reg)格式,然后雙擊導入到注冊表

          Windows Registry Editor Version 5.00

          [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\Shell Icons]
          "29"="C:\\Windows\\System32\\shell32.dll,50"

          [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]
          "29"="C:\\Windows\\System32\\shell32.dll,50"

          [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]
          "link"=hex:00,00,00,00


          • 方法二:
          同樣打開記事本,復制以下內容,并保存為(*.reg)格式,然后雙擊導入到注冊表

          Windows Registry Editor Version 5.00

          [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\lnkfile]
          "isshortcut"=""

          最后重啟系統,大功告成!本人親測,有效。
          posted @ 2009-09-15 02:57 電子牛 閱讀(420) | 評論 (0)編輯 收藏

          在google上搜到的,原帖已不可考,感謝原帖作者。

          用Eclipse進行Java程序的開發,需要了解總代碼的行數,如果不需要精確的數字,可以不用安裝統計代碼的插件。方法如下:
          1) 菜單欄,選擇Search -> File... 打開File Search對話框(或者快捷鍵Ctrl + H,然后選擇File Search標簽)
          2) 選中“正則表達式”(Regular expression),在搜索文本框輸入 \n
          3) 文件名稱輸入 *.java
          4) 在范圍里選中Enclosing projects
          5) 點“Search”進行搜索。然后就可以統計出整個項目的代碼行數。

          如圖:
          imgFileSearch

          轉圖請注明。
          posted @ 2009-07-29 03:15 電子牛 閱讀(4379) | 評論 (1)編輯 收藏

          今天在javaeye論壇里看到的帖子,認真地從頭看到尾,對閉包有了進一步的認識。感謝原帖樓主和所有回帖的朋友。

          原帖地址:http://www.javaeye.com/topic/412451
          主題:再論閉包
          作者:步行者
          對閉包感興趣的朋友可以移步去看看。

          首先,給出閉包的定義(定義說法比較多,本人偷懶,就直接從原帖里摘取了。):

          閉包   是可以包含自由(未綁定)變量 的代碼塊;這些變量不是在這個代碼塊或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義。“閉包” 一詞來源于以下兩者的結合:要執行的代碼塊(由于自由變量的存在,相關變量引用沒有釋放)和為自由變量提供綁定的計算環境(作用域)。


              可能上面的定義有點晦澀,下面看一下《Python 核心編程》 對 閉包 的解釋。


              如果在一個內部函數里,對在外部作用域(但不是在全局作用域)的變量進行引用,那么內部函數就被定義為閉包 。定義在外部函數內的但由內部函數引用或者使用的變量被稱為自由變量 。

           

          原帖中“liusong1111”回帖值得思考:
          [closure作為一等公民,可以被一個普通的變量引用、傳遞。在ruby里意味著它是Proc的一個對象(實例),自然可以調用Proc的方法(比如 call)。以java的視角,類是用來組織數據的,不是描述行為。而對于ruby,行為也是數據,也可以用類描述,類也是對象,類的類還是對象,這才是 真正的Everything is Object。樓主受java和java所謂的OO的影響太深,評判這些問題時,應該眼光往外多看看,避免思維定勢。尤其應該深入學習一門帶閉包的語言, 看看它到底是怎么用的。]

          首先,我同意可以用OO模擬閉包的觀點,這已經由原帖作者“步行者”給出詳細的例子了。但是這勢必在一定程度上會增加代碼的復雜度和臃腫度。我想,大部分時候大家更希望用更簡潔的方法去完成同樣的功能吧。

          另外,對于閉包會破壞OO的結構的爭論,我更愿意從廣義的角度來理解OO的定義。正如上面引用中所說,“以java的視角,類是用來組織數據的,不是描述行為。而對于ruby,行為也是數據,也可以用類描述,類也是對象,類的類還是對象”。如果采用閉包,那么這個內部函數中可以定義局部變量,同時它本身就是行為,此時具有屬性和行為的閉包,何嘗不可以看做是OO的呢?
          個人的觀點是如果能達到以下兩條,那么我支持Java中引入閉包:

          1)引入閉包能夠在保證程序的可讀性的基礎上,簡化程序編寫的復雜度,降低代碼的臃腫度。
          2)引入閉包至少能夠保證在大部分情況下,程序的性能能夠保持或者得到提升。(這里排除了極限情況)

          本人對閉包的了解還遠遠不夠,計劃有空閑的時候,認真地學習下閉包的知識和相關的應用。

          歡迎討論。

          posted @ 2009-07-29 02:33 電子牛 閱讀(285) | 評論 (0)編輯 收藏

          原作者thinkGhoster,鏈接http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.aspx
          對原文進行了適當的調整,更適合閱讀。

          注:本人讀后的一點思考在文章最后。

          (一)相關類

          class A {
                   
          public String show(D obj){
                          
          return ("A and D");
                   }
           
                   
          public String show(A obj){
                          
          return ("A and A");
                   }
           
          }
           
          class B extends A{
                   
          public String show(B obj){
                          
          return ("B and B");
                   }

                   
          public String show(A obj){
                          
          return ("B and A");
                   }
           
          }

          class C extends B{} 
          class D extends B{} 

          (二)問題:以下輸出結果是什么?

                  A a1 = new A();
                  A a2 
          = new B();
                  B b =
          new B();
                  C c 
          = new C(); 
                  D d 
          = new D(); 
                  
          System.out.println(a1.show(b));   ①
                  System.out.println(a1.show(c));   ②
                  System.out.println(a1.show(d));   ③
                  System.out.println(a2.show(b));   ④
                  System.out.println(a2.show(c));   ⑤
                  System.out.println(a2.show(d));   ⑥
                  System.out.println(b.show(b));     ⑦
                  System.out.println(b.show(c));     ⑧
                  System.out.println(b.show(d));     ⑨    

          (三)答案

                        ①   A and A
                        ②   A and A
                        ③   A and D
                        ④   B and A
                        ⑤   B and A
                        ⑥   A and D
                        ⑦   B and B
                        ⑧   B and B
                        ⑨   A and D

          (四)分析

                  ①②③比較好理解,一般不會出錯。④⑤就有點糊涂了,為什么輸出的不是"B and B”呢?!!先來回顧一下多態性。

                  運行時多態性是面向對象程序設計代碼重用的一個最強大機制,動態性的概念也可以被說成“一個接口,多個方法”。Java實現運行時多態性的基礎是動態方法調度,它是一種在運行時而不是在編譯期調用重載方法的機制。

                  方法的重寫Overriding和重載Overloading是Java多態性的不同表現。

                 - 重寫(Overriding) 是父類與子類之間多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。

                 - 重載(Overloading) 是一個類中多態性的一種表現。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

                  當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。 (但是如果強制把超類轉換成子類的話,就可以調用子類中新添加而超類沒有的方法了。)

                  好了,先溫習到這里,言歸正傳!實際上這里涉及方法調用的優先問題 ,優先級由高到低依次為:

                 this.show(O),

                 super.show(O),

                 this.show((super)O),

                 super.show((super)O)。讓我們來看看它是怎么工作的。

                  比如④,a2.show(b),a2是一個引用變量,類型為A,則this為a2,b是B的一個實例,于是它到類A里面找show(B obj)方法,沒有找到,于是到A的super(超類)找,而A沒有超類,因此轉到第三優先級this.show((super)O),this仍然是 a2,這里O為B,(super)O即(super)B即A,因此它到類A里面找show(A obj)的方法,類A有這個方法,但是由于a2引用的是類B的一個對象,B覆蓋了A的show(A obj)方法,因此最終鎖定到類B的show(A obj),輸出為"B and A”。

                  再比如⑧,b.show(c),b是一個引用變量,類型為B,則this為b,c是C的一個實例,于是它到類B找show(C obj)方法,沒有找到,轉而到B的超類A里面找,A里面也沒有,因此也轉到第三優先級this.show((super)O),this為b,O為C, (super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是類B的一個對象,因此直接鎖定到類B的show(B obj),輸出為"B and B”。

                  按照上面的方法,可以正確得到其他的結果。

                  問題還要繼續,現在我們再來看上面的分析過程是怎么體現出藍色字體那句話的內涵的。它說:當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用 變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。還是拿a2.show(b)來說吧。

                  a2是一個引用變量,類型為A,它引用的是B的一個對象,因此這句話的意思是由B來決定調用的是哪個方法。因此應該調用B的show(B obj)從而輸出"B and B”才對。但是為什么跟前面的分析得到的結果不相符呢?問題在于我們不要忽略了藍色字體的后半部分,那里特別指明:這個被調用的方法必須是在超類中定義過的,也就是被子類覆蓋的方法。B里面的show(B obj)在超類A中有定義嗎?沒有!那就更談不上被覆蓋了。實際上這句話隱藏了一條信息:它仍然是按照方法調用的優先級來確定的。它在類A中找到了 show(A obj),如果子類B沒有覆蓋show(A obj)方法,那么它就調用A的show(A obj)(由于B繼承A,雖然沒有覆蓋這個方法,但從超類A那里繼承了這個方法,從某種意義上說,還是由B確定調用的方法,只是方法是在A中實現而已); 現在子類B覆蓋了show(A obj),因此它最終鎖定到B的show(A obj)。這就是那句話的意義所在。


          個人讀后的一點思考:

          第5個問題值得思考,輸出 a2.show(c) ,答案是 B and A

          分析:

          a2是類A的引用變量,引用的是類B的一個實例對象。c是類C的一個實例。

          1)this.show(c),在A中找show(C obj)的方法,沒有找到,進行第二步。

          2)super.show(c),A沒有超類,進行第三步。

          3)this.show(super(c)), super(c)是B,A中是沒有show(B obj)方法的,但是這時候會繼續往上找,找B的父類,super(B)是A,在A中找show(A obj), 找到了。

          4)a2引用的是類B的一個對象,由B來決定調用哪個方法,因為類B中覆蓋了A的show(A obj)方法,因此最終用類B中的show(A obj)方法。 

          所以結論是這里super(O)是采用了逐層往上尋找的方式,具體來說,父類找不到對應的show方法,就找父類的父類,如果還沒有,繼續往上找,直到找到根基類。

          為了驗證作者原文中藍色字體段文字的正確性,我測試了輸出a1.show(c),結果和預想的一樣,是A and A.

          這里,a1.show(c)和a2.show(c)的區別在于持有的引用對象的不同,a1是持有了A類的一個實例對象,而a2是持有了B類的一個實例對象,所以當都找到了A類中的show(A obj)時,引用的對象的類型決定了該調用哪個成員的方法,前提是這個被調用的方法必須被子類覆蓋了。所以a1.show(c)輸出的是A and A,而 a2.show(c)輸出的是 B and A.

          posted @ 2009-07-11 06:39 電子牛 閱讀(201) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 咸宁市| 五指山市| 东明县| 五台县| 崇礼县| 鹤庆县| 周宁县| 和田市| 滨州市| 若羌县| 高唐县| 亚东县| 裕民县| 浮山县| 宁国市| 禹城市| 贵港市| 资源县| 西贡区| 和政县| 察隅县| 黎平县| 伊川县| 平和县| 柏乡县| 邮箱| 蓬溪县| 海门市| 金昌市| 松潘县| 灵璧县| 河曲县| 邛崃市| 调兵山市| 尼勒克县| 闸北区| 神农架林区| 思南县| 凉山| 奉新县| 禹城市|