BlogJava 聯(lián)系 聚合 管理  

          Blog Stats

          隨筆檔案

          exams


          java世界

          世界Java

          2007年12月9日 #

          1.錯(cuò)誤提示內(nèi)容:Can‘t find class HelloworldApp
          

            解釋:(當(dāng)鍵入java HelloWorldApp時(shí)發(fā)生該錯(cuò)誤。)

            系統(tǒng)找不到名為HelloWorldApp的類文件。一般地,該錯(cuò)誤意味著類名拼寫和源文件名不一樣,系統(tǒng)創(chuàng)建filename.class文件時(shí)使用的是類定義的名字,并且區(qū)分大小寫。

            例如:

            class HelloWorldapp(…)

            經(jīng)編譯后將創(chuàng)建HelloWorldapp.class類。執(zhí)行時(shí),也要使用這個(gè)名字。發(fā)生這個(gè)錯(cuò)誤時(shí),可以使用文件查看命令I(lǐng)s或dir看看當(dāng)前目錄下是否存在相應(yīng)的文件,并檢查文件名的大小寫。

            2.錯(cuò)誤提示內(nèi)容:In class HelloWorldApp:main must be public and static

            解釋:如果main()方法的左側(cè)缺少static或public,會(huì)發(fā)生這個(gè)錯(cuò)誤。前面已經(jīng)解釋過對(duì)main()方法前面的修飾符有特殊的要求。

            3.文件中含有的類個(gè)數(shù)錯(cuò)誤

            解釋:按照J(rèn)ava規(guī)則,在一個(gè)源文件中最多只能定義一個(gè)公有類,否則會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。如果一個(gè)應(yīng)用系統(tǒng)中有多個(gè)公有類,則要把它們分別放在各自不同的文件中。文件中非公有類的個(gè)數(shù)不限。

            4.層次錯(cuò)誤

            解釋:一個(gè)。java源文件可以含有三個(gè)“頂層”元素,這三個(gè)元素是:

            (1)一個(gè)包說明,即package語句,包說明是可選的。

            (2)任意多個(gè)引入語句,即import語句。

            (3)類和接口說明。

            這些語句必須按一定的次序出現(xiàn),即,引入語句必須出現(xiàn)在所有的類說明之前,如果使用了包說明,則它必須出現(xiàn)在類說明和引入語句之前。

            例如,下面是正確的語句序列:

            package Transportation;

            import jaya.awt.Graphics

            import jays.applet.Applet;

            下面是兩例錯(cuò)誤的語句順序:

            import java.aWt.Graphics

            import java.applet.Applet;

            package Transportation;

            該例中在包說明語句之前含有其他語句。

            package Transportation;

            package House;

            import java.applet.Applet;

            該例中含有兩個(gè)包說明語句。HP0-345 HP0-634

          1.錯(cuò)誤提示內(nèi)容:Can‘t find class HelloworldApp

            解釋:(當(dāng)鍵入java HelloWorldApp時(shí)發(fā)生該錯(cuò)誤。)

            系統(tǒng)找不到名為HelloWorldApp的類文件。一般地,該錯(cuò)誤意味著類名拼寫和源文件名不一樣,系統(tǒng)創(chuàng)建filename.class文件時(shí)使用的是類定義的名字,并且區(qū)分大小寫。

            例如:

            class HelloWorldapp(…)

            經(jīng)編譯后將創(chuàng)建HelloWorldapp.class類。執(zhí)行時(shí),也要使用這個(gè)名字。發(fā)生這個(gè)錯(cuò)誤時(shí),可以使用文件查看命令I(lǐng)s或dir看看當(dāng)前目錄下是否存在相應(yīng)的文件,并檢查文件名的大小寫。

            2.錯(cuò)誤提示內(nèi)容:In class HelloWorldApp:main must be public and static

            解釋:如果main()方法的左側(cè)缺少static或public,會(huì)發(fā)生這個(gè)錯(cuò)誤。前面已經(jīng)解釋過對(duì)main()方法前面的修飾符有特殊的要求。

            3.文件中含有的類個(gè)數(shù)錯(cuò)誤

            解釋:按照J(rèn)ava規(guī)則,在一個(gè)源文件中最多只能定義一個(gè)公有類,否則會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。如果一個(gè)應(yīng)用系統(tǒng)中有多個(gè)公有類,則要把它們分別放在各自不同的文件中。文件中非公有類的個(gè)數(shù)不限。

            4.層次錯(cuò)誤

            解釋:一個(gè)。java源文件可以含有三個(gè)“頂層”元素,這三個(gè)元素是:

            (1)一個(gè)包說明,即package語句,包說明是可選的。

            (2)任意多個(gè)引入語句,即import語句。HP0-645 HP0-661

            (3)類和接口說明。

            這些語句必須按一定的次序出現(xiàn),即,引入語句必須出現(xiàn)在所有的類說明之前,如果使用了包說明,則它必須出現(xiàn)在類說明和引入語句之前。

            例如,下面是正確的語句序列:

            package Transportation;

            import jaya.awt.Graphics

            import jays.applet.Applet;

            下面是兩例錯(cuò)誤的語句順序:

            import java.aWt.Graphics

            import java.applet.Applet;

            package Transportation;

            該例中在包說明語句之前含有其他語句。

            package Transportation;

            package House;

            import java.applet.Applet;

            該例中含有兩個(gè)包說明語句。

          posted @ 2008-03-01 09:55 java2java 閱讀(1258) | 評(píng)論 (1)編輯 收藏

          一 JAVA 類中
          1。取出指定所在類的路徑

          class A {
          String getPath() {
               return this.getClass().getClassLoader().getSystemResource("A").getPath();
              }
          }

          2。取出類ClassLoader的開始路徑(執(zhí)行路徑)
          //String preUri=this.getClass().getClassLoader().getResource("").getPath();

          比如WebApp的項(xiàng)目,以下的指令得出的結(jié)果就是

          /D:/project/crFj163Web/web/exploded/WEB-INF/classes/

          比如你是純java的程序,就是你執(zhí)行java指令的當(dāng)前路徑

          3。取出jdk所在的bin目錄

          //得到當(dāng)前用戶路徑,執(zhí)行路徑 System.getProperty(”user.dir”)

          其中user.dir是一個(gè)參數(shù),更多參數(shù)請(qǐng)看這里

          二、jsp/servlet 中的取路徑

          以前我們常用getRealPath(),不過這個(gè)方法已經(jīng)不推薦用了。但我們可以使用request.getContextPath().另外還有request.getRequestURL() 或者request.getRequestURI()。下面舉例,以建立一個(gè)app1的webapp為例

          1。request.getContextPath()打印出來的是

          /app1

          2。request.getRequestURL() 打印出來的是

          http://localhost:8080/app1/index.jsp

          3。request.getRequestURI() 打印出來的是

          /app1/index.jsp

          轉(zhuǎn)載(  190-721 000-746 )
          posted @ 2008-01-10 11:35 java2java 閱讀(1226) | 評(píng)論 (0)編輯 收藏

           
          import java.sql.*;

          public class Create {
          public Create() {
          }
          public static void main(String[] args){
          String url = "jdbc:oracle:thin:@10.0.1.3:1521:SDCDB";
          String query = "CREATE TABLE MYFIRST" + "(id INT,name CHAR(10))";
          String sql="insert into MYFIRST values(''1'',''liming'')";
          String sql1="insert into MYFIRST values(''2'',''mm'')";
          String sql2="delete MYFIRST where id=2";
          try
          {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          Connection conn = DriverManager.getConnection(url, "test", "test");
          Statement stmt = conn.createStatement();
          stmt.executeUpdate(query);
          stmt.executeUpdate(sql);
          stmt.executeUpdate(sql1);
          stmt.executeUpdate(sql2);
          System.out.println("Create Success!");
          stmt.close();
          conn.close();
          }
          catch(java.lang.ClassNotFoundException e){
          System.err.print(e.getMessage());
          }
          catch(SQLException ex){
          System.out.println("\n***SQLException caught ***\n");
          }
          }
          }
          posted @ 2008-01-10 10:54 java2java 閱讀(1732) | 評(píng)論 (0)編輯 收藏

           Sun Java認(rèn)證分為兩個(gè)級(jí)別:Sun 認(rèn)證Java程序員和Sun 認(rèn)證Java開發(fā)員。Sun 認(rèn)證Java程序員考試內(nèi)容涉及Java所有相關(guān)知識(shí)、編程概念及applet開發(fā)技巧。Sun認(rèn)證Java程序員考試旨在考察您通過應(yīng)用軟件分配進(jìn)行復(fù)雜編程的能力。之后還要測(cè)試您完成編程所需的知識(shí)。每次考試都包括65道以上的多項(xiàng)選擇題,時(shí)間大約為90分鐘。考試合格后由Sun公司頒發(fā)的國(guó)際通用的Java程序員證書。

             Java程序員
             概述:本課程使學(xué)員掌握如何使用標(biāo)準(zhǔn)Java Development kit(JDK)開發(fā)應(yīng)用程序和applets。在本課程中您將學(xué)會(huì)Java語言的語法。如何使用Java來創(chuàng)建圖形用戶接口(GUI),事件處理機(jī)制,例外處理,通過設(shè)計(jì)與開發(fā)各種Java程序來獲得實(shí)際的編程經(jīng)驗(yàn)。您也將學(xué)到文件輸入/輸出(I/O),多線程和網(wǎng)絡(luò)的知識(shí)。

             目標(biāo):本課程完成后,您將具備以下能力:
             使用Java編程語言創(chuàng)建Java應(yīng)用程序和applets
             定義和描述垃圾搜集,安全性和Java虛擬機(jī)(JVM)
             描述和使用Java語言面向?qū)ο蟮奶攸c(diǎn);開發(fā)圖形用戶接口(GUI)
             利用Java支持的多種布局管理
             描述和使用 Java的事件處理模式
             使用Java語言的鼠標(biāo)輸入,文本,窗口和菜單窗口部件
             使用Java的例外處理來控制程序執(zhí)行和定義用戶自己的例外事件
             使用Java語言的先進(jìn)的面向?qū)ο筇攸c(diǎn),包括方法重載,方法覆蓋,抽象類,接口,final,static和訪問控制;實(shí)現(xiàn)文件的輸入輸出(I/O)
             使用Java語言內(nèi)在的線程模式來控制多線程
             使用Java的Sockets機(jī)制進(jìn)行網(wǎng)絡(luò)通信
             預(yù)備知識(shí):熟悉DOS操作,用過WINDOWS并能用C或C++編程。

             Java開發(fā)員
             概述:本課程將提供給學(xué)員設(shè)計(jì)資料服務(wù)器應(yīng)用法的實(shí)際設(shè)計(jì)方法,學(xué)員將使用Java聲音、圖形、網(wǎng)絡(luò)通訊等接口,編寫與服務(wù)器相連接的Java應(yīng)用程度,通過本課程學(xué)員還能學(xué)到如何在Java程序中調(diào)用本機(jī)用其它計(jì)算機(jī)語言編寫的程序 117-102 117-301 190-721 。

             本課程是為熟悉Java語言結(jié)構(gòu)及語法的程序員而設(shè)立的。以便他們能在本課程中獲得開發(fā)復(fù)雜的、產(chǎn)品級(jí)的Java應(yīng)用技術(shù)。
             目標(biāo):在學(xué)完本課程后,學(xué)員將能夠:
             設(shè)計(jì)和開發(fā)Java GUI
             設(shè)計(jì)和開發(fā)動(dòng)畫Java應(yīng)用程序
             掌握了Java網(wǎng)絡(luò)編程技術(shù)
             懂得了JDBC-API的基本結(jié)構(gòu)
             知道UNIX與Windows NT互連有哪些技術(shù)問題
             能夠解釋在Java程序中調(diào)用其它語言所編寫的程序的方法與步驟

             Sun認(rèn)證Java程序員考試(JDK1.1)由一門考試組成,可以用來測(cè)試考生對(duì)Java語言的掌握程度。考生可以使用考試大綱(exam objectives)作為準(zhǔn)備考試的工具。
             為了保證Sun客戶使用的是Sun的最新技術(shù),Sun Educational Services已經(jīng)把Sun認(rèn)證Java程序員考試更新為JDK1.1。

             考試細(xì)則
             考試名稱:
             The Sun Certified Java Programmer for JDK 1.1
             考試號(hào):
             310-022(IBM考生除外),310-023(只對(duì)IBM考生)
             推薦教材:
             SL-275 “Java Programming(UNIX)”
             SL-276“Java Progrmming(Windows 95)”
             JTL-SL-275“Java Tutor:Java Programming Library”
             題數(shù):60
             考題類型:多選/簡(jiǎn)答
             通過分?jǐn)?shù): 70%
             考試時(shí)間: 2小時(shí)
             考試費(fèi)用: $150
          posted @ 2008-01-07 10:11 java2java 閱讀(572) | 評(píng)論 (2)編輯 收藏

          在ChinaITLAB導(dǎo)師制輔導(dǎo)中,筆者發(fā)現(xiàn)問得最多的問題莫過于"如何學(xué)習(xí)編程?JAVA該如何學(xué)習(xí)?"。類似的問題回答多了,難免會(huì)感覺厭煩,就萌生了寫下本文的想法。到時(shí)候再有人問起類似的問題,我可以告訴他(她),請(qǐng)你去看看《JAVA學(xué)習(xí)之路》。拜讀過臺(tái)灣蔡學(xué)鏞先生的《JAVA夜未眠》,有些文章如《JAVA學(xué)習(xí)之道》等讓我們確實(shí)有共鳴,本文題目也由此而來。
            軟件開發(fā)之路是充滿荊棘與挑戰(zhàn)之路,也是充滿希望之路。JAVA學(xué)習(xí)也是如此,沒有捷徑可走。夢(mèng)想像《天龍八部》中虛竹一樣被無崖子醍醐灌頂而輕松獲得一甲子功力,是很不現(xiàn)實(shí)的。每天仰天大叫"天神啊,請(qǐng)賜給我一本葵花寶典吧",殊不知即使你獲得了葵花寶典,除了受自宮其身之苦外,你也不一定成得了"東方不敗",倒是成"西方失敗"的幾率高一點(diǎn)。
            "不走彎路,就是捷徑",佛經(jīng)說的不無道理。
            1.如何學(xué)習(xí)程序設(shè)計(jì)?
            JAVA是一種平臺(tái),也是一種程序設(shè)計(jì)語言,如何學(xué)好程序設(shè)計(jì)不僅僅適用于JAVA,對(duì)C++等其他程序設(shè)計(jì)語言也一樣管用。有編程高手認(rèn)為,JAVA也好C也好沒什么分別,拿來就用。為什么他們能達(dá)到如此境界?我想是因?yàn)榫幊陶Z言之間有共通之處,領(lǐng)會(huì)了編程的精髓,自然能夠做到一通百通。如何學(xué)習(xí)程序設(shè)計(jì)理所當(dāng)然也有許多共通的地方。
            1.1 培養(yǎng)興趣
            興趣是能夠讓你堅(jiān)持下去的動(dòng)力。如果只是把寫程序作為謀生的手段的話,你會(huì)活的很累,也太對(duì)不起自己了。多關(guān)心一些行業(yè)趣事,多想想蓋茨。不是提倡天天做白日夢(mèng),但人要是沒有了夢(mèng)想,你覺得有味道嗎?可能像許多深圳本地農(nóng)民一樣,打打麻將,喝喝功夫茶,拜拜財(cái)神爺;每個(gè)月就有幾萬十幾萬甚至更多的進(jìn)帳,憑空多出個(gè)"食利階層"。你認(rèn)為,這樣有味道嗎?有空多到一些程序員論壇轉(zhuǎn)轉(zhuǎn),你會(huì)發(fā)現(xiàn),他們其實(shí)很樂觀幽默,時(shí)不時(shí)會(huì)冒出智慧的火花。
            1.2 慎選程序設(shè)計(jì)語言
            男怕入錯(cuò)行,女怕嫁錯(cuò)郎。初學(xué)者選擇程序設(shè)計(jì)語言需要謹(jǐn)慎對(duì)待。軟件開發(fā)不僅僅是掌握一門編程語言了事,它還需要其他很多方面的背景知識(shí)。軟件開發(fā)也不僅僅局限于某幾個(gè)領(lǐng)域,而是已經(jīng)滲透到了各行各業(yè)幾乎每一個(gè)角落。
            如果你對(duì)硬件比較感興趣,你可以學(xué)習(xí)C語言/匯編語言,進(jìn)入硬件開發(fā)領(lǐng)域。如果你對(duì)電信的行業(yè)知識(shí)及網(wǎng)絡(luò)比較熟悉,你可以在C/C++等之上多花時(shí)間,以期進(jìn)入電信軟件開發(fā)領(lǐng)域。如果你對(duì)操作系統(tǒng)比較熟悉,你可以學(xué)習(xí)C/Linux等等,為L(zhǎng)inux內(nèi)核開發(fā)/驅(qū)動(dòng)程序開發(fā)/嵌入式開發(fā)打基礎(chǔ)。如果你想介入到應(yīng)用范圍最廣泛的應(yīng)用軟件開發(fā)(包括電子商務(wù)電子政務(wù)系統(tǒng))的話,你可以選擇J2EE或.NET,甚至LAMP組合。每個(gè)領(lǐng)域要求的背景知識(shí)不一樣。做應(yīng)用軟件需要對(duì)數(shù)據(jù)庫等很熟悉。總之,你需要根據(jù)自己的特點(diǎn)來選擇合適你的編程語言。
            1.3 要腳踏實(shí)地,快餐式的學(xué)習(xí)不可取
            先分享一個(gè)故事。
            有一個(gè)小朋友,他很喜歡研究生物學(xué),很想知道那些蝴蝶如何從蛹?xì)だ锍鰜恚兂珊銜?huì)飛。  有一次,他走到草原上面看見一個(gè)蛹,便取了回家,然后看著,過了幾天以后,這個(gè)蛹出了一條裂痕,看見里面的蝴蝶開始掙扎,想抓破蛹?xì)わw出來。  這個(gè)過程達(dá)數(shù)小時(shí)之久,蝴蝶在蛹里面很辛苦地拼命掙扎,怎么也沒法子走出來。這個(gè)小孩看著看著不忍心,就想不如讓我?guī)蛶退桑汶S手拿起剪刀在蛹上剪開,使蝴蝶破蛹而出。  但蝴蝶出來以后,因?yàn)槌岚虿粔蛄Γ兊煤苡纺[,飛不起來。
            這個(gè)故事給我們的啟示是:欲速則不達(dá)。
            浮躁是現(xiàn)代人最普遍的心態(tài),能怪誰?也許是貧窮落后了這么多年的緣故,就像當(dāng)年的大躍進(jìn)一樣,都想大步跨入共產(chǎn)主義社會(huì)。現(xiàn)在的軟件公司、客戶、政府、學(xué)校、培訓(xùn)機(jī)構(gòu)等等到處彌漫著浮躁之氣。就拿筆者比較熟悉的深圳IT培訓(xùn)行業(yè)來說吧,居然有的打廣告宣稱"參加培訓(xùn),100%就業(yè)",居然報(bào)名的學(xué)生不少,簡(jiǎn)直是藐視天下程序員。社會(huì)環(huán)境如是,我們不能改變,只能改變自己,鬧市中的安寧,彌足珍貴。許多初學(xué)者C++/JAVA沒開始學(xué),立馬使用VC/JBuilder,會(huì)使用VC/JBuilder開發(fā)一個(gè)Hello  World程序,就忙不迭的向世界宣告,"我會(huì)軟件開發(fā)了",簡(jiǎn)歷上也大言不慚地寫上"精通VC/JAVA"。結(jié)果到軟件公司面試時(shí)要么被三兩下打發(fā)走了,要么被駁的體無完膚,無地自容。到處碰壁之后才知道捧起《C++編程思想》《JAVA編程思想》仔細(xì)鉆研,早知如此何必當(dāng)初呀。
            "你現(xiàn)在講究簡(jiǎn)單方便,你以后的路就長(zhǎng)了",好象也是佛經(jīng)中的勸戒。
            1.4 多實(shí)踐,快實(shí)踐
            彭端淑的《為學(xué)一首示子侄》中有窮和尚與富和尚的故事。
            從前,四川邊境有兩個(gè)和尚,一個(gè)貧窮,一個(gè)有錢。一天,窮和尚對(duì)富和尚說:"我打算去南海朝圣,你看怎么樣?"富和尚說:"這里離南海有幾千里遠(yuǎn),你靠什么去呢?"窮和尚說:"我只要一個(gè)水缽,一個(gè)飯碗就夠了。"富和尚為難地說:"幾年前我就打算買條船去南海,可至今沒去成,你還是別去吧!"  一年以后,富和尚還在為租賃船只籌錢,窮和尚卻已經(jīng)從南海朝圣回來了。
            這個(gè)故事可解讀為:任何事情,一旦考慮好了,就要馬上上路,不要等到準(zhǔn)備周全之后,再去干事情。假如事情準(zhǔn)備考慮周全了再上路的話,別人恐怕捷足先登了。軟件開發(fā)是一門工程學(xué)科,注重的就是實(shí)踐,"君子動(dòng)口不動(dòng)手"對(duì)軟件開發(fā)人員來講根本就是錯(cuò)誤的,他們提倡"動(dòng)手至上",但別害怕,他們大多溫文爾雅,沒有暴力傾向,雖然有時(shí)候蓬頭垢面的一副"比爾蓋茨"樣。有前輩高人認(rèn)為,學(xué)習(xí)編程的秘訣是:編程、編程、再編程,筆者深表贊同。不僅要多實(shí)踐,而且要快實(shí)踐。我們?cè)诳磿臅r(shí)候,不要等到你完全理解了才動(dòng)手敲代碼,而是應(yīng)該在看書的同時(shí)敲代碼,程序運(yùn)行的各種情況可以讓你更快更牢固的掌握知識(shí)點(diǎn)。
            1.5 多參考程序代碼
            程序代碼是軟件開發(fā)最重要的成果之一,其中滲透了程序員的思想與靈魂。許多人被《仙劍奇?zhèn)b傳》中凄美的愛情故事感動(dòng),悲劇的結(jié)局更有一種缺憾美。為什么要以悲劇結(jié)尾?據(jù)說是因?yàn)閷憽断蓜ζ鎮(zhèn)b傳》的程序員失戀而安排了這樣的結(jié)局,他把自己的感覺融入到游戲中,卻讓眾多的仙劍迷扼腕嘆息。
            多多參考代碼例子,對(duì)JAVA而言有參考文獻(xiàn)[4.3],有API類的源代碼(JDK安裝目錄下的src.zip文件),也可以研究一些開源的軟件或框架。
            1.6 加強(qiáng)英文閱讀能力
            對(duì)學(xué)習(xí)編程來說,不要求英語,  但不能一點(diǎn)不會(huì),。最起碼像JAVA  API文檔(參考文獻(xiàn)[4.4])這些東西還是要能看懂的,連猜帶懵都可以;旁邊再開啟一個(gè)"金山詞霸"。看多了就會(huì)越來越熟練。在學(xué)JAVA的同時(shí)學(xué)習(xí)英文,一箭雙雕多好。另外好多軟件需要到英文網(wǎng)站下載,你要能夠找到它們,這些是最基本的要求。英語好對(duì)你學(xué)習(xí)有很大的幫助。口語好的話更有機(jī)會(huì)進(jìn)入管理層,進(jìn)而可以成為剝削程序員的"周扒皮"。
            1.7 萬不得已才請(qǐng)教別人
            筆者在ChinaITLab網(wǎng)校的在線輔導(dǎo)系統(tǒng)中解決學(xué)生問題時(shí)發(fā)現(xiàn),大部分的問題學(xué)生稍做思考就可以解決。請(qǐng)教別人之前,你應(yīng)該先回答如下幾個(gè)問題。
            你是否在google中搜索了問題的解決辦法?
            你是否查看了JAVA  API文檔?
            你是否查找過相關(guān)書籍?
            你是否寫代碼測(cè)試過?
            如果回答都是"是"的話,而且還沒有找到解決辦法,再問別人不遲。要知道獨(dú)立思考的能力對(duì)你很重要。要知道程序員的時(shí)間是很寶貴的。
            1.8 多讀好書
            書中自有顏如玉。比爾?蓋茨是一個(gè)飽讀群書的人。雖然沒有讀完大學(xué),但九歲的時(shí)候比爾?蓋茨就已經(jīng)讀完了所有的百科全書,所以他精通天文、歷史、地理等等各類學(xué)科,可以說比爾?蓋茨不僅是當(dāng)今世界上金錢的首富,而且也可以稱得上是知識(shí)的巨富。
            筆者在給學(xué)生上課的時(shí)候經(jīng)常會(huì)給他們推薦書籍,到后來學(xué)生實(shí)在忍無可忍開始抱怨,"天吶,這么多書到什么時(shí)候才能看完了","學(xué)軟件開發(fā),感覺上了賊船"。這時(shí)候,我的回答一般是,"別著急,什么時(shí)候帶你們?nèi)タ纯次业臅浚浆F(xiàn)在每月花在技術(shù)書籍上的錢400元,這在軟件開發(fā)人員之中還只能夠算是中等的",學(xué)生當(dāng)場(chǎng)暈倒。(注:這一部分學(xué)生是剛學(xué)軟件開發(fā)的)
            對(duì)于在JAVA開發(fā)領(lǐng)域的好書在筆者另外一篇文章中會(huì)專門點(diǎn)評(píng)。該文章可作為本文的姊妹篇。
            1.9 使用合適的工具
            工欲善其事必先利其器。軟件開發(fā)包含各種各樣的活動(dòng),需求收集分析、建立用例模型、建立分析設(shè)計(jì)模型、編程實(shí)現(xiàn)、調(diào)試程序、自動(dòng)化測(cè)試、持續(xù)集成等等,沒有工具幫忙可以說是寸步難行。工具可以提高開發(fā)效率,使軟件的質(zhì)量更高BUG更少。組合稱手的武器。到飛花摘葉皆可傷人的境界就很高了,無招勝有招,手中無劍心中有劍這樣的境界幾乎不可企及。在筆者另外一篇文章中會(huì)專門闡述如何選擇合適的工具(該文章也可作為本文的姊妹篇)。
            2.軟件開發(fā)學(xué)習(xí)路線
            兩千多年的儒家思想孔孟之道,中庸的思想透入骨髓,既不冒進(jìn)也不保守并非中庸之道,而是找尋學(xué)習(xí)軟件開發(fā)的正確路線與規(guī)律。
            從軟件開發(fā)人員的生涯規(guī)劃來講,我們可以大致分為三個(gè)階段,軟件工程師→軟件設(shè)計(jì)師→架構(gòu)設(shè)計(jì)師或項(xiàng)目管理師。不想當(dāng)元帥的士兵不是好士兵,不想當(dāng)架構(gòu)設(shè)計(jì)師或項(xiàng)目管理師的程序員也不是好的程序員。我們應(yīng)該努力往上走。讓我們先整理一下開發(fā)應(yīng)用軟件需要學(xué)習(xí)的主要技術(shù)。
            A.基礎(chǔ)理論知識(shí),如操作系統(tǒng)、編譯原理、數(shù)據(jù)結(jié)構(gòu)與算法、計(jì)算機(jī)原理等,它們并非不重要。如不想成為計(jì)算機(jī)科學(xué)家的話,可以采取"用到的時(shí)候再來學(xué)"的原則。
            B.一門編程語言,現(xiàn)在基本上都是面向?qū)ο蟮恼Z言,JAVA/C++/C#等等。如果做WEB開發(fā)的話還要學(xué)習(xí)HTML/JavaScript等等。
            C.一種方法學(xué)或者說思想,現(xiàn)在基本都是面向?qū)ο笏枷耄∣OA/OOD/設(shè)計(jì)模式)。由此而衍生的基于組件開發(fā)CBD/面向方面編程AOP等等。
            D.一種關(guān)系型數(shù)據(jù)庫,ORACLE/SqlServer/DB2/MySQL等等
            E.一種提高生產(chǎn)率的IDE集成開發(fā)環(huán)境JBuilder/Eclipse/VS.NET等。
            F.一種UML建模工具,用ROSE/VISIO/鋼筆進(jìn)行建模。
            G.一種軟件過程,RUP/XP/CMM等等,通過軟件過程來組織軟件開發(fā)的眾多活動(dòng),使開發(fā)流程專業(yè)化規(guī)范化。當(dāng)然還有其他的一些軟件工程知識(shí)。
            H.項(xiàng)目管理、體系結(jié)構(gòu)、框架知識(shí)。
            正確的路線應(yīng)該是:B→C→E→F→G→H。
            還需要補(bǔ)充幾點(diǎn):
            1).對(duì)于A與C要補(bǔ)充的是,我們應(yīng)該在實(shí)踐中逐步領(lǐng)悟編程理論與編程思想。新技術(shù)雖然不斷涌現(xiàn),更新速度令人眼花燎亂霧里看花;但萬變不離其宗,編程理論與編程思想的變化卻很慢。掌握了編程理論與編程思想你就會(huì)有撥云見日之感。面向?qū)ο蟮乃枷朐谀壳皝碇v是相當(dāng)關(guān)鍵的,是強(qiáng)勢(shì)技術(shù)之一,在上面需要多投入時(shí)間,給你的回報(bào)也會(huì)讓你驚喜。
            2).對(duì)于數(shù)據(jù)庫來說是獨(dú)立學(xué)習(xí)的,這個(gè)時(shí)機(jī)就由你來決定吧。
            3).編程語言作為學(xué)習(xí)軟件開發(fā)的主線,而其余的作為輔線。
            4).軟件工程師著重于B、C、E、  D;軟件設(shè)計(jì)師著重于B、C、E、  D、F;架構(gòu)設(shè)計(jì)師著重于C、F、H。
            3.如何學(xué)習(xí)JAVA?
            3.1  JAVA學(xué)習(xí)路線
            3.1.1  基礎(chǔ)語法及JAVA原理
            基礎(chǔ)語法和JAVA原理是地基,地基不牢靠,猶如沙地上建摩天大廈,是相當(dāng)危險(xiǎn)的。學(xué)習(xí)JAVA也是如此,必須要有扎實(shí)的基礎(chǔ),你才能在J2EE、J2ME領(lǐng)域游刃有余。參加SCJP(SUN公司認(rèn)證的JAVA程序員)考試不失為一個(gè)好方法,原因之一是為了對(duì)得起你交的1200大洋考試費(fèi),你會(huì)更努力學(xué)習(xí),原因之二是SCJP考試能夠讓你把基礎(chǔ)打得很牢靠,它要求你跟JDK一樣熟悉JAVA基礎(chǔ)知識(shí);但是你千萬不要認(rèn)為考過了SCJP就有多了不起,就能夠獲得軟件公司的青睞,就能夠獲取高薪,這樣的想法也是很危險(xiǎn)的。獲得"真正"的SCJP只能證明你的基礎(chǔ)還過得去,但離實(shí)際開發(fā)還有很長(zhǎng)的一段路要走。
            3.1.2  OO思想的領(lǐng)悟
            掌握了基礎(chǔ)語法和JAVA程序運(yùn)行原理后,我們就可以用JAVA語言實(shí)現(xiàn)面向?qū)ο蟮乃枷肓恕C嫦驅(qū)ο螅且环N方法學(xué);是獨(dú)立于語言之外的編程思想;是CBD基于組件開發(fā)的基礎(chǔ);屬于強(qiáng)勢(shì)技術(shù)之一。當(dāng)以后因工作需要轉(zhuǎn)到別的面向?qū)ο笳Z言的時(shí)候,你會(huì)感到特別的熟悉親切,學(xué)起來像喝涼水這么簡(jiǎn)單。
            使用面向?qū)ο蟮乃枷脒M(jìn)行開發(fā)的基本過程是:
            ●調(diào)查收集需求。
            ●建立用例模型。
            ●從用例模型中識(shí)別分析類及類與類之間的靜態(tài)動(dòng)態(tài)關(guān)系,從而建立分析模型。
            ●細(xì)化分析模型到設(shè)計(jì)模型。
            ●用具體的技術(shù)去實(shí)現(xiàn)。
            ●測(cè)試、部署、總結(jié)。
            3.1.3  基本API的學(xué)習(xí)
            進(jìn)行軟件開發(fā)的時(shí)候,并不是什么功能都需要我們?nèi)?shí)現(xiàn),也就是經(jīng)典名言所說的"不需要重新發(fā)明輪子"。我們可以利用現(xiàn)成的類、組件、框架來搭建我們的應(yīng)用,如SUN公司編寫好了眾多類實(shí)現(xiàn)一些底層功能,以及我們下載過來的JAR文件中包含的類,我們可以調(diào)用類中的方法來完成某些功能或繼承它。那么這些類中究竟提供了哪些方法給我們使用?方法的參數(shù)個(gè)數(shù)及類型是?類的構(gòu)造器需不需要參數(shù)?總不可能SUN公司的工程師打國(guó)際長(zhǎng)途甚至飄洋過海來告訴你他編寫的類該如何使用吧。他們只能提供文檔給我們查看,JAVA  DOC文檔(參考文獻(xiàn)4.4)就是這樣的文檔,它可以說是程序員與程序員交流的文檔。
            基本API指的是實(shí)現(xiàn)了一些底層功能的類,通用性較強(qiáng)的API,如字符串處理/輸入輸出等等。我們又把它成為類庫。熟悉API的方法一是多查JAVA  DOC文檔(參考文獻(xiàn)4.4),二是使用JBuilder/Eclipse等IDE的代碼提示功能。
            3.1.4  特定API的學(xué)習(xí)
            JAVA介入的領(lǐng)域很廣泛,不同的領(lǐng)域有不同的API,沒有人熟悉所有的API,對(duì)一般人而言只是熟悉工作中要用到的API。如果你做界面開發(fā),那么你需要學(xué)習(xí)Swing/AWT/SWT等API;如果你進(jìn)行網(wǎng)絡(luò)游戲開發(fā),你需要深入了解網(wǎng)絡(luò)API/多媒體API/2D3D等;如果你做WEB開發(fā),就需要熟悉Servlet等API啦。總之,需要根據(jù)工作的需要或你的興趣發(fā)展方向去選擇學(xué)習(xí)特定的API。
            3.1.5  開發(fā)工具的用法
            在學(xué)習(xí)基礎(chǔ)語法與基本的面向?qū)ο蟾拍顣r(shí),從鍛煉語言熟練程度的角度考慮,我們推薦使用的工具是Editplus/JCreator+JDK,這時(shí)候不要急于上手JBuilder/Eclipse等集成開發(fā)環(huán)境,以免過于關(guān)注IDE的強(qiáng)大功能而分散對(duì)JAVA技術(shù)本身的注意力。過了這一階段你就可以開始熟悉IDE了。
            程序員日常工作包括很多活動(dòng),編輯、編譯及構(gòu)建、調(diào)試、單元測(cè)試、版本控制、維持模型與代碼同步、文檔的更新等等,幾乎每一項(xiàng)活動(dòng)都有專門的工具,如果獨(dú)立使用這些工具的話,你將會(huì)很痛苦,你需要在堆滿工具的任務(wù)欄上不斷的切換,效率很低下,也很容易出錯(cuò)。在JBuilder、Eclipse等IDE中已經(jīng)自動(dòng)集成編輯器、編譯器、調(diào)試器、單元測(cè)試工具JUnit、自動(dòng)構(gòu)建工具ANT、版本控制工具CVS、DOC文檔生成與更新等等,甚至可以把UML建模工具也集成進(jìn)去,又提供了豐富的向?qū)椭煽蚣艽a,讓我們的開發(fā)變得更輕松。應(yīng)該說IDE發(fā)展的趨勢(shì)就是集成軟件開發(fā)中要用到的幾乎所有工具。
            從開發(fā)效率的角度考慮,使用IDE是必經(jīng)之路,也是從一個(gè)學(xué)生到一個(gè)職業(yè)程序員轉(zhuǎn)變的里程碑。
            JAVA開發(fā)使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等幾種;而Eclipse、JBuilder占有的市場(chǎng)份額是最大的。JBuilder在近幾年來一直是JAVA集成開發(fā)環(huán)境中的霸主,它是由備受程序員尊敬的Borland公司開發(fā),在硝煙彌漫的JAVA  IDE大戰(zhàn)中,以其快速的版本更新?lián)魯BM的Visual  Age  for  JAVA等而成就一番偉業(yè)。IBM在Visual  Age  for  JAVA上已經(jīng)無利可圖之下,干脆將之貢獻(xiàn)給開源社區(qū),成為Eclipse的前身,真所謂"柳暗花明又一村"。浴火重生的Eclipse以其開放式的插件擴(kuò)展機(jī)制、免費(fèi)開源獲得廣大程序員(包括幾乎所有的骨灰級(jí)程序員)的青睞,極具發(fā)展?jié)摿Α?
            3.1.6  學(xué)習(xí)軟件工程
            對(duì)小型項(xiàng)目而言,你可能認(rèn)為軟件工程沒太大的必要。隨著項(xiàng)目的復(fù)雜性越來越高,軟件工程的必要性才會(huì)體現(xiàn)出來。參見"軟件開發(fā)學(xué)習(xí)路線"小節(jié)。
            3.2學(xué)習(xí)要點(diǎn)
            確立的學(xué)習(xí)路線之后,我們還需要總結(jié)一下JAVA的學(xué)習(xí)要點(diǎn),這些要點(diǎn)在前文多多少少提到過,只是筆者覺得這些地方特別要注意才對(duì)它們進(jìn)行匯總,不要嫌我婆婆媽媽啊。
            3.2.1勤查API文檔
            當(dāng)程序員編寫好某些類,覺得很有成就感,想把它貢獻(xiàn)給各位苦難的同行。這時(shí)候你要使用"javadoc"工具(包含在JDK中)生成標(biāo)準(zhǔn)的JAVA  DOC文檔,供同行使用。J2SE/J2EE/J2ME的DOC文檔是程序員與程序員交流的工具,幾乎人手一份,除了菜鳥之外。J2SE  DOC文檔官方下載地址:http://java.sun.com/j2se/1.5.0/download.jsp,你可以到google搜索CHM版本下載。也可以在線查看:http://java.sun.com/j2se/1.5.0/docs/api/index.html
            對(duì)待DOC文檔要像毛主席語錄,早上起床念一遍,吃飯睡覺前念一遍。
            當(dāng)需要某項(xiàng)功能的時(shí)候,你應(yīng)該先查相應(yīng)的DOC文檔看看有沒有現(xiàn)成的實(shí)現(xiàn),有的話就不必勞神費(fèi)心了直接用就可以了,找不到的時(shí)候才考慮自己實(shí)現(xiàn)。使用步驟一般如下:
            ●找特定的包,包一般根據(jù)功能組織。
            ●找需要使用類,類命名規(guī)范的話我們由類的名字可猜出一二。
            ●選擇構(gòu)造器,大多數(shù)使用類的方式是創(chuàng)建對(duì)象。
            ●選擇你需要的方法。
            3.2.2  查書/google->寫代碼測(cè)試->查看源代碼->請(qǐng)教別人
            當(dāng)我們遇到問題的時(shí)候該如何解決?
            這時(shí)候不要急著問別人,太簡(jiǎn)單的問題,沒經(jīng)過思考的問題,別人會(huì)因此而瞧不起你。可以先找找書,到google中搜一下看看,絕大部分問題基本就解決了。而像"某些類/方法如何使用的問題",DOC文檔就是答案。對(duì)某些知識(shí)點(diǎn)有疑惑是,寫代碼測(cè)試一下,會(huì)給你留下深刻的印象。而有的問題,你可能需要直接看API的源代碼驗(yàn)證你的想法。萬不得已才去請(qǐng)教別人。
            3.2.3學(xué)習(xí)開源軟件的設(shè)計(jì)思想
            JAVA領(lǐng)域有許多源代碼開放的工具、組件、框架,JUnit、ANT、Tomcat、Struts、Spring、Jive論壇、PetStore寵物店等等多如牛毛。這些可是前輩給我們留下的瑰寶呀。入寶山而空手歸,你心甘嗎?對(duì)這些工具、框架進(jìn)行分析,領(lǐng)會(huì)其中的設(shè)計(jì)思想,有朝一日說不定你也能寫一個(gè)XXX框架什么的,風(fēng)光一把。分析開源軟件其實(shí)是你提高技術(shù)、提高實(shí)戰(zhàn)能力的便捷方法。
            3.2.4  規(guī)范的重要性
            沒有規(guī)矩,不成方圓。這里的規(guī)范有兩層含義。第一層含義是技術(shù)規(guī)范,多到http://www.jcp.org下載jsrxxx規(guī)范,多讀規(guī)范,這是最權(quán)威準(zhǔn)確最新的教材。第二層含義是編程規(guī)范,如果你使用了大量的獨(dú)特算法,富有個(gè)性的變量及方法的命名方式;同時(shí),沒給程序作注釋,以顯示你的編程功底是多么的深厚。這樣的代碼別人看起來像天書,要理解談何容易,更不用說維護(hù)了,必然會(huì)被無情地掃入垃圾堆。java編碼規(guī)范到此查看或下載 http://java.sun.com/docs/codeconv/,中文的也有,啊,還要問我在哪,請(qǐng)參考3.2.2節(jié)。
            3.2.5  不局限于JAVA
            很不幸,很幸運(yùn),要學(xué)習(xí)的東西還有很多。不幸的是因?yàn)橐獙W(xué)的東西太多且多變,沒時(shí)間陪老婆家人或女朋友,導(dǎo)致身心疲憊,嚴(yán)重者甚至導(dǎo)致抑郁癥。幸運(yùn)的是別人要搶你飯碗絕非易事,他們或她們需要付出很多才能達(dá)成心愿。
            JAVA不要孤立地去學(xué)習(xí),需要綜合學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)、OOP、軟件工程、UML、網(wǎng)絡(luò)編程、數(shù)據(jù)庫技術(shù)等知識(shí),用橫向縱向的比較聯(lián)想的方式去學(xué)習(xí)會(huì)更有效。如學(xué)習(xí)JAVA集合的時(shí)候找數(shù)據(jù)結(jié)構(gòu)的書看看;學(xué)JDBC的時(shí)候復(fù)習(xí)數(shù)據(jù)庫技術(shù);采取的依然是"需要的時(shí)候再學(xué)"的原則 000-834 000-861 。
            4.結(jié)束語
            需要強(qiáng)調(diào)的是,學(xué)習(xí)軟件開發(fā)確實(shí)有一定的難度,也很辛苦,需要付出很多努力,但千萬不要半途而廢。本文如果能對(duì)一直徘徊在JAVA神殿之外的朋友有所幫助的話,筆者也欣慰了。哈哈,怎么聽起來老氣橫秋呀?沒辦法,在電腦的長(zhǎng)期輻射之下,都快變成小老頭了。最后奉勸各位程序員尤其是MM程序員,完成工作后趕快遠(yuǎn)離電腦,據(jù)《胡播亂報(bào)》報(bào)道,電腦輻射會(huì)在白皙的皮膚上面點(diǎn)綴一些小黑點(diǎn),看起來鮮艷無比……
          posted @ 2008-01-07 10:09 java2java 閱讀(2002) | 評(píng)論 (3)編輯 收藏

          首先我們來看看Java程序的反加密,也就是通常所說的Crack過程,只有明白了這個(gè)過程,我們才能有效的對(duì)我們的程序進(jìn)行加密。

          通常我們得到的Java程序的Crack包有兩種,一種屬于KeyGen(注冊(cè)碼生成器)、一種屬于替換修改;

          我們先看第一種,當(dāng)我們找到一個(gè)應(yīng)用程序的KeyGen的時(shí)候我們總是很佩服那個(gè)做出KeyGen的人,覺得他很厲害,但是你仔細(xì)分析一下,為什么他能做出KeyGen呢?只有
          他對(duì)這個(gè)Java程序的加密算法了解的非常清楚;這種人有哪些呢?一個(gè)是那個(gè)公司里面的人,那不可能,除非內(nèi)訌,還又呢,就是猜想,反推,這個(gè)可能嗎?呵呵,更不可能,那這個(gè)算法從哪里來呢?呵呵,往往泄漏秘密的就是秘密本身……回過頭來想想,Java應(yīng)用程序怎么知道你輸入的注冊(cè)碼是否正確呢?呵呵,那你就該從應(yīng)用程序入手……
          得到的它的加密算法,自然KeyGen就不在話下了……(但是這也有列外,如果它是用的公鑰秘鑰對(duì)加密的,就沒有辦法嘍,只能用第二種方法。)

          這種辦法只適合對(duì)付只要一個(gè)注冊(cè)號(hào),別的什么都不要的情況,經(jīng)典代表Borland JBuilder & Optimizeit Suite

          再看第二種,為什么要用替換修改?我們是修改了那部分呢?不用想,肯定是License驗(yàn)證的部分,為什么我們不像上面的方法那樣找加密算法呢?原因有兩種:(1)使用上面的辦法搞不定;(2)Java程序不僅要Key,還有其他的License配置;遇到這種情況,我們只要找到用于License驗(yàn)證的類,進(jìn)行修改替換就行了。

          這種辦法使用于任何情況,經(jīng)典代表BEA WebLogic

          經(jīng)過上面的分析,我們的問題就集中了,關(guān)鍵就是怎么找到用于License驗(yàn)證的部分或加密算法的部分,我們需要3個(gè)工具:一個(gè)是Sun公司提供的標(biāo)準(zhǔn)JVM:),一個(gè)是你
          的耐心和細(xì)心:),一個(gè)是Jad(經(jīng)典Java反編譯工具)。

          第一步是定位,這也是最關(guān)鍵的一步,我們這里以Together For JBuilder Edition為例,啟動(dòng)Together,先看看長(zhǎng)什么樣子?喔,上來就問我要License;Ok,
          每關(guān)系,退出;找到Together的啟動(dòng)Bat文件,找到它的啟動(dòng)命令:java .....,OK,在Java啟動(dòng)的時(shí)候給一個(gè)參數(shù):“ -Xrunhprof:cpu=times”,保存,在啟動(dòng),還是要
          License,退出,這個(gè)時(shí)候,我們可以發(fā)現(xiàn),在這個(gè)目錄下多了一個(gè)“java.hprof.txt”文件,打開一看,就是我要的JVM的Dump文件,好多內(nèi)容啊,沒關(guān)系,慢慢看來。

          我們可以看見這個(gè)文件里面有好多熟悉的東西啊:java.*/com.sun.*/javax.*等等,但這個(gè)不是我們關(guān)心的,我們要的是com.togethersoft.*或者是一些沒有包名的zd.d等等。(這里插一句,幾乎所有的Java應(yīng)用程序都會(huì)混淆的,其實(shí)混淆的原理也很簡(jiǎn)單,我們后面再說。)先找找有沒有License有關(guān)的,Serach一下,嘿嘿,果然,474行:com.togethersoft.together.impl.ide.license.LicenseSetup.execute([DashoPro-V2-050200]:Unknown line),Ok上那堆classpath中的Jar包里面找一下吧(推薦用WinRAR),找到了之后用Jad反編譯,一看,這個(gè)沒有混淆,但是用了一個(gè)zae的類,這個(gè)看名字就知道混淆過了,先不理它,再看看下面一句IdeLicenseAccess.setLicense(zae1),Ok接著找到IdeLicenseAccess,哈哈,就這點(diǎn)名堂,所有的License驗(yàn)證都是走的這個(gè)類,面向?qū)ο蟮乃枷氩诲e(cuò),呵呵:)

          定位定完了,接下來的事情就是按猜想的方法修改這兩個(gè)類,屏蔽掉LicenseSetup里面execute方法的實(shí)際內(nèi)容,修改IdeLicenseAccess,讓多有的驗(yàn)證都返回true,然后編譯,替換;不要高興太早,這還沒有完呢,要有責(zé)任心!!啟動(dòng)Together,果然,這下不要License了,有啟動(dòng)畫面,進(jìn)去了,但是一片灰色,怎么回事,一看控制臺(tái),一堆錯(cuò),沒關(guān)系,就怕不出錯(cuò),查找根源,還有一個(gè)IdeLicenseUtil類出了問題,再反編譯,修改,替換;這下搞定了。再啟動(dòng),測(cè)試一下,OK MB7-222 70-210 1Y0-327 。

          就這樣,一個(gè)Java應(yīng)用程序搞定了。看看其實(shí)也很簡(jiǎn)單。

          再來說說混淆,大家可能都知道沒有經(jīng)過混淆的Java的Class反編譯回來連方法和變量的名字都不會(huì)變,這是什么原因呢?這就要追述到Class文件的結(jié)構(gòu)了,簡(jiǎn)單來說,Class文件種包含又一個(gè)常數(shù)池(constant pool)這個(gè)里面就存放了變量和方法的名稱等一下和Class相關(guān)的東西,我們通常所說的混淆就是用一種工具把這個(gè)常數(shù)池里面的東東弄的胡涂一點(diǎn),這樣就能騙過反編譯器和你,呵呵:)這就是為什么有時(shí)候反編譯回來的東西編譯不過去的原因。

          再回過頭來說說Java程序的加密;從上面的兩種方法來看,Java程序似乎是沒有什么完美的辦法進(jìn)行加密的,其實(shí)不然,我們必須遵循一些原則,才能有效的保護(hù)你的產(chǎn)品。

          原則一,盡量使用公鑰和秘鑰對(duì)進(jìn)行加密;
          原則二,不要在加密驗(yàn)證的部分使用面向?qū)ο笏枷耄海┌羊?yàn)證的方法寫在程序的各個(gè)角落,并標(biāo)注為private final void,讓編譯器替你處理成內(nèi)聯(lián)方法;
          原則三,盡可能的大幅度混淆:)找個(gè)好點(diǎn)的混淆器

          posted @ 2008-01-03 17:51 java2java 閱讀(5418) | 評(píng)論 (5)編輯 收藏



          第一,final, finally, finalize的區(qū)別.

          final 修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖儭1宦暶鳛閒inal的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載

          finally 再異常處理時(shí)提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話)。
          finalize 方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。

          第二,Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)?

          匿名的內(nèi)部類是沒有名字的內(nèi)部類。不能extends(繼承) 其它類,但一個(gè)內(nèi)部類可以作為一個(gè)接口,由另一個(gè)內(nèi)部類實(shí)現(xiàn)。

          第三,Static Nested Class 和 Inner Class的不同,說得越多越好
          Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內(nèi)部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。具體可見http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
          注: 靜態(tài)內(nèi)部類(Inner Class)意味著1創(chuàng)建一個(gè)static內(nèi)部類的對(duì)象,不需要一個(gè)外部類對(duì)象,2不能從一個(gè)static內(nèi)部類的一個(gè)對(duì)象訪問一個(gè)外部類對(duì)象

          第四,&和&&的區(qū)別。

          &是位運(yùn)算符。&&是布爾邏輯運(yùn)算符。

          第五,HashMap和Hashtable的區(qū)別。

          都屬于Map接口的類,實(shí)現(xiàn)了將惟一鍵映射到特定的值上。
          HashMap 類沒有分類或者排序。它允許一個(gè) null 鍵和多個(gè) null 值。
          Hashtable 類似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因?yàn)樗峭降摹?

          第六,Collection 和 Collections的區(qū)別。
          Collections是個(gè)java.util下的類,它包含有各種有關(guān)集合操作的靜態(tài)方法。
          Collection是個(gè)java.util下的接口,它是各種集合結(jié)構(gòu)的父接口。

          第七,什么時(shí)候用assert。
          斷言是一個(gè)包含布爾表達(dá)式的語句,在執(zhí)行這個(gè)語句時(shí)假定該表達(dá)式為 true。如果表達(dá)式計(jì)算為 false,那么系統(tǒng)會(huì)報(bào)告一個(gè) Assertionerror。它用于調(diào)試目的:
          assert(a > 0); // throws an Assertionerror if a <= 0
          斷言可以有兩種形式:
          assert Expression1 ;
          assert Expression1 : Expression2 ;
          Expression1 應(yīng)該總是產(chǎn)生一個(gè)布爾值。
          Expression2 可以是得出一個(gè)值的任意表達(dá)式。這個(gè)值用于生成顯示更多調(diào)試信息的 String 消息。
          斷言在默認(rèn)情況下是禁用的。要在編譯時(shí)啟用斷言,需要使用 source 1.4 標(biāo)記:
          javac -source 1.4 Test.java
          要在運(yùn)行時(shí)啟用斷言,可使用 -enableassertions 或者 -ea 標(biāo)記。
          要在運(yùn)行時(shí)選擇禁用斷言,可使用 -da 或者 -disableassertions 標(biāo)記。
          要系統(tǒng)類中啟用斷言,可使用 -esa 或者 -dsa 標(biāo)記。還可以在包的基礎(chǔ)上啟用或者禁用斷言。
          可以在預(yù)計(jì)正常情況下不會(huì)到達(dá)的任何位置上放置斷言。斷言可以用于驗(yàn)證傳遞給私有方法的參數(shù)。不過,斷言不應(yīng)該用于驗(yàn)證傳遞給公有方法的參數(shù),因?yàn)椴还苁欠駟⒂昧藬嘌裕蟹椒ǘ急仨殭z查其參數(shù)。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測(cè)試后置條件。另外,斷言不應(yīng)該以任何方式改變程序的狀態(tài)。

          第八,GC是什么? 為什么要有GC? (基礎(chǔ))。

          GC是垃圾收集器。Java 程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:
          System.gc()
          Runtime.getRuntime().gc()

          第九,String s = new String("xyz");創(chuàng)建了幾個(gè)String Object?

          兩個(gè)對(duì)象,一個(gè)是“xyx”,一個(gè)是指向“xyx”的引用對(duì)象s。

          第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

          Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

          第十一,short s1 = 1; s1 = s1 + 1;有什么錯(cuò)? short s1 = 1; s1 += 1;有什么錯(cuò)?

          short s1 = 1; s1 = s1 + 1;有錯(cuò),s1是short型,s1+1是int型,不能顯式轉(zhuǎn)化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

          第十二,sleep() 和 wait() 有什么區(qū)別? 搞線程的最愛
          sleep()方法是使線程停止一段時(shí)間的方法。在sleep 時(shí)間間隔期滿后,線程不一定立即恢復(fù)執(zhí)行。這是因?yàn)樵谀莻€(gè)時(shí)刻,其它線程可能正在運(yùn)行而且沒有被調(diào)度為放棄執(zhí)行,除非(a)“醒來”的線程具有更高的優(yōu)先級(jí)
          (b)正在運(yùn)行的線程因?yàn)槠渌蚨枞?
          wait()是線程交互時(shí),如果線程對(duì)一個(gè)同步對(duì)象x 發(fā)出一個(gè)wait()調(diào)用,該線程會(huì)暫停執(zhí)行,被調(diào)對(duì)象進(jìn)入等待狀態(tài),直到被喚醒或等待時(shí)間到。

          第十三,Java有沒有g(shù)oto?
          Goto java中的保留字,現(xiàn)在沒有在java中使用。

          第十四,數(shù)組有沒有l(wèi)ength()這個(gè)方法? String有沒有l(wèi)ength()這個(gè)方法?

          數(shù)組沒有l(wèi)ength()這個(gè)方法,有l(wèi)ength的屬性。
          String有有l(wèi)ength()這個(gè)方法。

          第十五,Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型?

          方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)它而言,父類中的定義如同被“屏蔽”了。如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

          第十六,Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?

          Set里的元素是不能重復(fù)的,那么用iterator()方法來區(qū)分重復(fù)與否。equals()是判讀兩個(gè)Set是否相等。
          equals()和==方法決定引用值是否指向同一對(duì)象equals()在類中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類型相配的話,返回真值。

          第十七,給我一個(gè)你最常見到的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  190-802 000-834 000-861 117-102 117-301 190-721

          第十八,error和exception有什么區(qū)別?
          error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。
          exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。

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

          Map不是

          第二十,abstract class和interface有什么區(qū)別?

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

          第二十一,abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?

          都不能

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

          第二十三,啟動(dòng)一個(gè)線程是用run()還是start()?
          啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來停止一個(gè)線程。

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

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

          第二十六,當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?
          不能,一個(gè)對(duì)象的一個(gè)synchronized方法只能由一個(gè)線程訪問。

          第二十七,try {}里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?

          會(huì)執(zhí)行,在return前執(zhí)行。

          第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?

          有C背景的程序員特別喜歡問這種問題。

          2 << 3

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

          第三十,當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

          是值傳遞。Java 編程語言只由值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的。

          第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

          switch(expr1)中,expr1是一個(gè)整數(shù)表達(dá)式。因此傳遞給 switch 和 case 語句的參數(shù)應(yīng)該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

          第三十二,編程題: 寫一個(gè)Singleton出來。

          Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類Class只有一個(gè)實(shí)例存在。
          一般Singleton模式通常有幾種種形式:
          第一種形式: 定義一個(gè)類,它的構(gòu)造函數(shù)為private的,它有一個(gè)static的private的該類變量,在類初始化時(shí)實(shí)例話,通過一個(gè)public的getInstance方法獲取對(duì)它的引用,繼而調(diào)用其中的方法。
          public class Singleton {
            private Singleton(){}
            //在自己內(nèi)部定義自己一個(gè)實(shí)例,是不是很奇怪?
            //注意這是private 只供內(nèi)部調(diào)用
            private static Singleton instance = new Singleton();
            //這里提供了一個(gè)供外部訪問本class的靜態(tài)方法,可以直接訪問  
            public static Singleton getInstance() {
              return instance;   
             }
          }
          第二種形式:
          public class Singleton {
            private static Singleton instance = null;
            public static synchronized Singleton getInstance() {
            //這個(gè)方法比上面有所改進(jìn),不用每次都進(jìn)行生成對(duì)象,只是第一次     
            //使用時(shí)生成實(shí)例,提高了效率!
            if (instance==null)
              instance=new Singleton();
          return instance;   }
          }
          其他形式:
          定義一個(gè)類,它的構(gòu)造函數(shù)為private的,所有方法為static的。
          一般認(rèn)為第一種形式要更加安全些

          第三十三 Hashtable和HashMap
          Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)

          HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許

          還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。

          最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
          多個(gè)線程訪問Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap
          就必須為之提供外同步。

          Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。
          posted @ 2008-01-03 17:50 java2java 閱讀(612) | 評(píng)論 (1)編輯 收藏

          問題. 什么是 Java API for XML-Based RPC(JAX-RPC)?
            答. Java API for XML-Based RPC(JAX-RPC)使得 Java 技術(shù)開發(fā)人員使用基于 XML 的 RPC 功能構(gòu)建 Web 應(yīng)用程序和 Web 服務(wù),此功能遵循 SOAP(簡(jiǎn)單對(duì)象訪問協(xié)議,Simple Object Access Protocol)1.1 規(guī)范。
            問題. JAX-RPC 如何使用 SOAP ?
            答. 請(qǐng)參考 JSR-101 。
            問題. 什么是 RPC?
            答. RPC 代表遠(yuǎn)程過程調(diào)用(remote procedure call),它是能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機(jī)制。RPC 機(jī)制常用于分布式客戶端/服務(wù)器模型。服務(wù)器將服務(wù)定義為一系列過程,可供遠(yuǎn)程客戶端調(diào)用。
            問題. XML 如何與 RPC 相關(guān)聯(lián)?
            答. 遠(yuǎn)程過程調(diào)用是由基于 XML 的協(xié)議來表示的,比如 SOAP 。除了定義信封結(jié)構(gòu)和編碼規(guī)則之外,SOAP 規(guī)范還定義了遠(yuǎn)程過程調(diào)用和響應(yīng)的表示慣例。
            問題. 對(duì)于 Web 服務(wù),JAX-RPC 必須做哪些工作?
            答. 一個(gè)基于 XML 的 RPC 服務(wù)器應(yīng)用程序可以定義、描述和導(dǎo)出一個(gè)的 Web 服務(wù),如同基于 RPC 的服務(wù)一樣。WSDL(Web 服務(wù)描述語言,Web Service Description Language  HP0-922 )定義了一種 XML 格式,將服務(wù)描述為一組消息操作的端點(diǎn)集合。通過使用 JAX-RPC API ,開發(fā)人員可以用 WSDL 描述來實(shí)現(xiàn)客戶端和服務(wù)。
            問題. 客戶端與 JAX-RPC 服務(wù)之間采用什么交互模式?
            答. 有以下三種不同的模式:
            1. 同步請(qǐng)求-響應(yīng)(Synchronous Request-Response):客戶端調(diào)用遠(yuǎn)程程序并阻塞,直到它收到一個(gè)返回值或異常。
            2. 單向 RPC(One-Way RPC):客戶端調(diào)用遠(yuǎn)程過程,但自身不阻塞或等待直到收到一個(gè)返回值。JAX-RPC 客戶端的運(yùn)行時(shí)系統(tǒng)可能會(huì)拋出異常。
            3. 非阻塞 RPC 調(diào)用(Non-Blocking RPC Invocation 190-823 1Y0-614):客戶端調(diào)用遠(yuǎn)程過程,并繼續(xù)處理同一個(gè)線程的內(nèi)容而不等待返回值。此后,客戶端通過阻塞來接受返回值或輪詢返回值,以此來處理遠(yuǎn)程方法的返回。
            問題. 遠(yuǎn)程方法調(diào)用或響應(yīng)能否傳送服務(wù)內(nèi)容信息?
            答. 是的。例如它可能會(huì)傳送唯一的事務(wù)標(biāo)識(shí)符或數(shù)字簽名。
            問題. 為什么 xrpcc 沒有生成 WSDL 文件?
            答. xrpcc 工具實(shí)際上可以生成 WSDL 文件,但由于設(shè)計(jì)失誤,如果不指定 –keep 選項(xiàng),該文件會(huì)同源文件一起被刪除。您可以使用 –keep 選項(xiàng)讓 xrpcc 不刪除 WSDL 或 .java 源文件。如果您使用 –s sourcepath 選項(xiàng),所有源文件將被放置在 sourcepath 目錄中,然后您可以很容易地刪除它們。 WSDL 文件將被放置在當(dāng)前目錄或由 –d 選項(xiàng)指定的目錄中。
          posted @ 2007-12-09 14:47 java2java 閱讀(1280) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 仁布县| 黔西县| 英德市| 青海省| 天等县| 准格尔旗| 皋兰县| 定州市| 西宁市| 霍林郭勒市| 郁南县| 永仁县| 嘉禾县| 中宁县| 革吉县| 海南省| 瑞金市| 永嘉县| 固安县| 黎城县| 洱源县| 项城市| 栾川县| 盱眙县| 轮台县| 凤冈县| 吉安市| 洛川县| 霍林郭勒市| 仁布县| 晋城| 汨罗市| 榆社县| 青浦区| 随州市| 绥江县| 永昌县| 广平县| 樟树市| 阜宁县| 建平县|