gdufo

           

          Filter與interceptor的區別

               摘要:   閱讀全文

          posted @ 2008-08-18 19:51 gdufo| 編輯 收藏

          java網絡編程-Ajax+servlet實例

               摘要:   閱讀全文

          posted @ 2008-08-18 11:49 gdufo| 編輯 收藏

          Spring Autowire自動裝配

               摘要:   閱讀全文

          posted @ 2008-08-15 11:17 gdufo| 編輯 收藏

          hibernate 幾問

               摘要:   閱讀全文

          posted @ 2008-08-14 22:02 gdufo| 編輯 收藏

          final 于 abstract 的問題

          第一題:
             class Something{
                  final int f;
                public void doSomething(){
                      System.out.println("f="+f)
                  }
              }
          第二題:
              abstract class Something{
                  private abstract void doSomething();
              }

          出錯在哪里?

          1)Something類在實例化的時候,會對成員變量進行初始化,f會被賦值于0,按照語法結果就是f=0,可是實際上不是。Java編譯器為了減少人犯低級錯誤,對final修飾的變量不會再進行默認初始化,而是強制要求你顯示的賦一個值。Java編譯器考慮的可真周到啊,把它自己的語法都給推翻了。這么低級的程序我是寫不出來,所以我答錯了。
          2)這一題按照語法也沒錯了,可是為什么會被編譯不過去呢,說白了原因也就是Java編譯器為我們考慮太周到了,我們為什么要在抽象類中定義一個抽象方法,我們大家都知道抽象類是不能實例化,定義抽象方法就是為了定義一個子類來繼承該抽象類并實現它的抽象方法,但是題目中給定的抽象方法是private修飾的,也就是說它是不能被繼承的,也就是說我們根本不肯能寫出來一個能實現該抽象方法的類,說的更具體一點也就是這個抽象類被定義的毫無意義。Java編譯器真是太強了,連這個也被考慮到了,反正我是從來沒寫過這么低級的程序,更不會去寫出來一個毫無意義的抽象類。
          一句話,這兩道題考得不是final和abstract的語法,因為完全合法,而是語義,也就是Java編程規范。
           PS:關于為什么final修飾的成員變量不能被默認初始化的問題,我想了很久,終于想明白了。我們大家都知道對象初始化分為三步:
          1)默認初始化
          2)賦值初始化
          3)構造方法初始化
          如果你在類中定義的是一個普通的成員變量非final成員變量,對該類的對象初始化時,該成員變量會嚴格按照以上三步進行初始化。如果是該類的成員變量是用final修飾的,該類對象初始化時,對該成員變量的初始化按照常規也應該由這三步組成,但是由于final修飾的變量是常量,不能進行二次賦值,所以對該類型的變量初始化只能由其中一步來完成,不能出現交叉,否則會有編譯錯誤。下面是兩個可以正常編譯、運行的寫法:
          /**
           * 
           * 
          @author <a href="mailto:flustar2008@163.com">flustar</a>
           * 
          @version 1.0 Creation date: Mar 22, 2008 7:18:18 PM
           
          */

          public class TestFinal {
              
          final int f=1;
              
          public void doSomething() {
                  System.out.println(
          "f=" + f);
              }

              
          public static void main(String args[]) {
                  TestFinal test 
          = new TestFinal();
                  test.doSomething();
              }

          }

          /**
           * 
           * 
          @author <a href="mailto:flustar2008@163.com">flustar</a>
           * 
          @version 1.0 Creation date: Mar 22, 2008 7:18:18 PM
           
          */

          public class TestFinal {
              
          final int f;
              
          public TestFinal(){
                  f
          =1;
              }

              
          public void doSomething() {
                  System.out.println(
          "f=" + f);
              }

              
          public static void main(String args[]) {
                  TestFinal test 
          = new TestFinal();
                  test.doSomething();
              }

          }
          下面再讓我們回過頭來看看下面這個程序它完全符合Java的語法:
          class Something{
                  
          final int f;
                
          public void doSomething(){
                      System.out.println(
          "f="+f)
                  }

              }

          為什么說它完全符合語法:
          1)按照常理會對f默認初始化為0;
          2)程序中并沒有出現交叉,也就是說并沒有進行二次賦值的可能。
          但是編譯器為什么不放過它呢?
          現在讓我們來假設一下如果不給f變量不顯示的賦一個值,它一定會被初始化為0,按照final的定義一旦被初始化一個值后就不能修改了,也就是說f的值只能是0了。再想想當初我們為什么要定義一個final修飾的常量,難道僅僅就是為了得到一個默認的不能修改的初始值嗎,這恐怕有違我們當初定義final變量的真正意愿,那么我定義這個final變量又有何意義呢。所以在對對象進行初始化時,發現對象的成員是用final修飾的就會查看它是否被顯示的賦了值,如果沒有就會不能正常編譯。這也是Java編程規范中為什么要強制對final變量進行顯示賦值的真正原因。同樣的道理在abstract類里面定義private abstract方法,這個又有何意義呢?Java中把那些符合語法但不符合常規的用法定義成了規范,我想這也是Java為什么會有編程規范的原因吧,呵呵,扯遠了。。。

          posted @ 2008-08-14 21:39 gdufo 閱讀(565) | 評論 (0)編輯 收藏

          JAVA 面試

          找工作要面試,有面試就有對付面試的辦法。以下一些題目來自我和我朋友痛苦的面試經歷,提這些問題的公司包括IBM, E*Trade, Siebel, Motorola, SUN, 以及其它大小公司。 

            面試是沒什么道理可講的,它的題目有的不合情理、脫離實際。有在紙上寫的,有當面考你的,也有在電話里問的,給你IDE的估計很少(否則你趕快去買彩票, 說不定中)。所以如果你看完此文后,請不要抱怨說這些問題都能用IDE來解決。你必須在任何情況下準確回答這些問題,在面試中如果出現一兩題回答不準確很有可能你就被拒之門外了。 

            當然這些都是Java的基本題,那些面試的人大多數不會問你Hibernate有多先進,Eclipse的三個組成部分,或command design pattern,他們都是老一輩了,最喜歡問的就是基礎知識。別小看了這些基礎,我朋友水平一流,結果就栽在一到基礎知識的問題下,和高薪無緣。 




          找工作要面試,有面試就有對付面試的辦法。以下一些題目來自我和我朋友痛苦的面試經歷,提這些問題的公司包括IBM, E*Trade, Siebel, Motorola, SUN, 以及其它大小公司。 

            面試是沒什么道理可講的,它的題目有的不合情理、脫離實際。有在紙上寫的,有當面考你的,也有在電話里問的,給你IDE的估計很少(否則你趕快去買彩票, 說不定中)。所以如果你看完此文后,請不要抱怨說這些問題都能用IDE來解決。你必須在任何情況下準確回答這些問題,在面試中如果出現一兩題回答不準確很有可能你就被拒之門外了。 

            當然這些都是Java的基本題,那些面試的人大多數不會問你Hibernate有多先進,Eclipse的三個組成部分,或command design pattern,他們都是老一輩了,最喜歡問的就是基礎知識。別小看了這些基礎,我朋友水平一流,結果就栽在一到基礎知識的問題下,和高薪無緣。 

            好了廢話少說,開始正題。 

            第一,談談final, finally, finalize的區別。 

            final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
          finally是異常處理語句結構的一部分,表示總是執行。
          finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。

            第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)? 
          可以繼承其他類或完成其他接口,在swing編程中常用此方式。
            第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。 
          Static Nested Class是被聲明為靜態(static)的內部類,它可以不依賴于外部類實例被實例化。而通常的內部類需要在外部類實例化后才能實例化。
            第四,&和&&的區別。 
          &是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and).
            第五,HashMap和Hashtable的區別。 
          HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable.


            第六,Collection 和 Collections的區別。 

            Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
          Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

            第七,什么時候用assert。 
          1.4新增關鍵字(語法),用于測試boolean表達式狀態,可用于調試程序。
          使用方法 assert <boolean表達式>,表示如果表達式為真(true),則下面的語句執行,否則拋出AssertionError。
          另外的使用方式assert < boolean表達式>:<other表達式>,表示如果表達式為真,后面的表達式忽略,否則后面表達式的值用于AssertionError的構建參數。
          注意編譯時要增加-source 1.4 參數,否則報錯。]運行時要增加 -ea參數,否則assert行被忽略

            第八,GC是什么? 為什么要有GC? 

            GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。 

            第九,String s = new String("xyz");創建了幾個String Object? 
          兩個
            第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 
          Math.round(11.5)==12
          Math.round(-11.5)==-11
          round方法返回與參數最接近的長整數,參數加1/2后求其floor.
            第十一,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯? 
          short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)
          short s1 = 1; s1 += 1;(可以正確編譯)
            第十二,sleep() 和 wait() 有什么區別? 
          sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。
          wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
            第十三,Java有沒有goto? 
          沒有
            很十三的問題,如果哪個面試的問到這個問題,我勸你還是別進這家公司。(完)(job.sohu.com)




          第十四,數組有沒有length()這個方法? String有沒有length()這個方法?
          數組沒有length()這個方法,有length的屬性。
          String有有length()這個方法。

          第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
          方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

          第十六,Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?
          Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。
          equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

          第十七,給我一個你最常見到的runtime exception。
          ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, 
          ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

          第十八,error和exception有什么區別?
          error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
          exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。


          第十九,List, Set, Map是否繼承自Collection接口?
          List,Set是
          Map不是

          第二十,abstract class和interface有什么區別?
          聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
          接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

          第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
          都不能

          第二十二,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
          接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

          第二十三,啟動一個線程是用run()還是start()?
          啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。



          第二十四,構造器Constructor是否可被override?
          構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。

          第二十五,是否可以繼承String類?
          String類是final類故不可以繼承。

          第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
          不能,一個對象的一個synchronized方法只能由一個線程訪問。

          第二十七,try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
          會執行,在return前執行。


          第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?
          有C背景的程序員特別喜歡問這種問題。
          2 << 3

          第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
          不對,有相同的hash code。

          第三十,當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞? 
          是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。


          第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
          switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

          第三十二,編程題: 寫一個Singleton出來。
          Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
          一般Singleton模式通常有幾種種形式:
          第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
          public class Singleton {
            private Singleton(){}
            //在自己內部定義自己一個實例,是不是很奇怪?
            //注意這是private 只供內部調用
            private static Singleton instance = new Singleton();
            //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問  
            public static Singleton getInstance() {
              return instance;   
             } 

          第二種形式: 
          public class Singleton { 
            private static Singleton instance = null;
            public static synchronized Singleton getInstance() {
            //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次     
            //使用時生成實例,提高了效率!
            if (instance==null)
              instance=new Singleton();
          return instance;   } 

          其他形式:
          定義一個類,它的構造函數為private的,所有方法為static的。
          一般認為第一種形式要更加安全些

          posted @ 2008-08-11 16:45 gdufo| 編輯 收藏

          Hibernate Annotations筆記

               摘要:   閱讀全文

          posted @ 2008-08-10 08:13 gdufo| 編輯 收藏

          Appfuse2.x學習-Ajax

               摘要:   閱讀全文

          posted @ 2008-08-09 08:35 gdufo| 編輯 收藏

          AppFuse中DisplayTag亂碼問題的解決(1.9)

               摘要:   閱讀全文

          posted @ 2008-08-06 23:00 gdufo| 編輯 收藏

          實戰Struts-Menu(5)

          > 新建JSP文件web/dynamic-menu.jsp,內容如下:
          <%@ page contentType="text/html; charset=GBK" %>
          <%@ taglib uri="struts-menu" prefix="menu" %>

          <p>沒有使用Bundle和權限控制:
          <menu:useMenuDisplayer name="ListMenu" repository="examplesRepository">
              
          <menu:displayMenu name="DatabaseMenu"/>
              
          <menu:displayMenu name="StandaloneMenu"/>
          </menu:useMenuDisplayer></p>

          <p>使用Bundle, 沒有使用權限控制:
          <menu:useMenuDisplayer name="ListMenu" bundle="examplesBundle" repository="examplesRepository">
              
          <menu:displayMenu name="DatabaseMenu"/>
              
          <menu:displayMenu name="StandaloneMenu"/>
          </menu:useMenuDisplayer></p>

          <p>使用Bundle和權限控制:
          <menu:useMenuDisplayer name="ListMenu" permissions="examplesPermession"  bundle="examplesBundle" repository="examplesRepository">
              
          <menu:displayMenu name="DatabaseMenu"/>
              
          <menu:displayMenu name="StandaloneMenu"/>
          </menu:useMenuDisplayer></p>

          七、關于Struts-Menu配置文件和API的使用方法,請參考附錄中的官方網站


          附:
          Struts-Menu官方網站:http://struts-menu.sourceforge.net
          數據庫驅動的動態菜單:http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp

          posted @ 2008-08-05 15:07 gdufo| 編輯 收藏

          僅列出標題
          共19頁: First 上一頁 11 12 13 14 15 16 17 18 19 下一頁 

          導航

          統計

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 陆良县| 新泰市| 拉萨市| 禄劝| 沽源县| 利津县| 深圳市| 清苑县| 延津县| 博客| 黄梅县| 博白县| 观塘区| 英吉沙县| 永新县| 乡宁县| 临洮县| 芒康县| 赤水市| 石棉县| 甘泉县| 张家界市| 重庆市| 株洲市| 南宫市| 定结县| 金华市| 清镇市| 成安县| 兴文县| 凉山| 宝山区| 丰顺县| 泽普县| 图们市| 韶关市| 襄樊市| 丹寨县| 墨竹工卡县| 洪泽县| 含山县|