<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    Blog Stats

    隨筆檔案

    exams


    java世界

    世界Java

    2008年3月1日 #

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

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

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

      例如:

      class HelloWorldapp(…)

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

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

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

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

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

      4.層次錯誤

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

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

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

      (3)類和接口說明。

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

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

      package Transportation;

      import jaya.awt.Graphics

      import jays.applet.Applet;

      下面是兩例錯誤的語句順序:

      import java.aWt.Graphics

      import java.applet.Applet;

      package Transportation;

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

      package Transportation;

      package House;

      import java.applet.Applet;

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

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

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

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

      例如:

      class HelloWorldapp(…)

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

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

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

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

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

      4.層次錯誤

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

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

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

      (3)類和接口說明。

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

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

      package Transportation;

      import jaya.awt.Graphics

      import jays.applet.Applet;

      下面是兩例錯誤的語句順序:

      import java.aWt.Graphics

      import java.applet.Applet;

      package Transportation;

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

      package Transportation;

      package House;

      import java.applet.Applet;

      該例中含有兩個包說明語句。

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

    2008年1月10日 #

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

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

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

    比如WebApp的項目,以下的指令得出的結(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是一個參數(shù),更多參數(shù)請看這里

    二、jsp/servlet 中的取路徑

    以前我們常用getRealPath(),不過這個方法已經(jīng)不推薦用了。但我們可以使用request.getContextPath().另外還有request.getRequestURL() 或者request.getRequestURI()。下面舉例,以建立一個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 閱讀(1217) | 評論 (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 閱讀(1725) | 評論 (0)編輯 收藏

    2008年1月7日 #

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

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

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

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

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

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

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

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

    2008年1月3日 #

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

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

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

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

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

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

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

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

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

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

    就這樣,一個Java應(yīng)用程序搞定了。看看其實也很簡單。

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

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

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

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



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

    final 修飾符(關(guān)鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載

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

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

    匿名的內(nèi)部類是沒有名字的內(nèi)部類。不能extends(繼承) 其它類,但一個內(nèi)部類可以作為一個接口,由另一個內(nèi)部類實現(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)建一個static內(nèi)部類的對象,不需要一個外部類對象,2不能從一個static內(nèi)部類的一個對象訪問一個外部類對象

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

    &是位運算符。&&是布爾邏輯運算符。

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

    都屬于Map接口的類,實現(xiàn)了將惟一鍵映射到特定的值上。
    HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。
    Hashtable 類似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因為它是同步的。

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

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

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

    GC是垃圾收集器。Java 程序員不用擔(dān)心內(nèi)存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調(diào)用下面的方法之一:
    System.gc()
    Runtime.getRuntime().gc()

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

    兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象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;有什么錯? short s1 = 1; s1 += 1;有什么錯?

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

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

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

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

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

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

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

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

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

    第十七,給我一個你最常見到的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ù)不是不可能但很困難的情況下的一種嚴重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。
    exception 表示一種設(shè)計或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。

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

    Map不是

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

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

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

    都不能

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

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

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

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

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

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

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

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

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

    2 << 3

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

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

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

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

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

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

    Singleton模式主要作用是保證在Java應(yīng)用程序中,一個類Class只有一個實例存在。
    一般Singleton模式通常有幾種種形式:
    第一種形式: 定義一個類,它的構(gòu)造函數(shù)為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調(diào)用其中的方法。
    public class Singleton {
      private Singleton(){}
      //在自己內(nèi)部定義自己一個實例,是不是很奇怪?
      //注意這是private 只供內(nèi)部調(diào)用
      private static Singleton instance = new Singleton();
      //這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問  
      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;   }
    }
    其他形式:
    定義一個類,它的構(gòu)造函數(shù)為private的,所有方法為static的。
    一般認為第一種形式要更加安全些

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

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

    還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

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

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

    2007年12月9日 #

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

    2007年11月26日 #

     下面代碼中用到的sourceImage是一個已經(jīng)存在的Image對象

    圖像剪切
    對于一個已經(jīng)存在的Image對象,要得到它的一個局部圖像,可以使用下面的步驟:

     //import java.awt.*;
    //import java.awt.image.*;
    Image croppedImage;
    ImageFilter cropFilter;
    CropFilter =new CropImageFilter(25,30,75,75); //四個參數(shù)分別為圖像起點坐標和寬高,即CropImageFilter(int x,int y,int width,int height),詳細情況請參考API
    CroppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter));


    如果是在Component的子類中使用,可以將上面的Toolkit.getDefaultToolkit().去掉。FilteredImageSource是一個ImageProducer對象。
    圖像縮放
    對于一個已經(jīng)存在的Image對象,得到它的一個縮放的Image對象可以使用Image的getScaledInstance方法:

    Image scaledImage=sourceImage. getScaledInstance(100,100, Image.SCALE_DEFAULT); //得到一個100X100的圖像
    Image doubledImage=sourceImage. getScaledInstance(sourceImage.getWidth(this)*2,sourceImage.getHeight(this)*2, Image.SCALE_DEFAULT); //得到一個放大兩倍的圖像,這個程序一般在一個swing的組件中使用,而類Jcomponent實現(xiàn)了圖像觀察者接口ImageObserver,所有可以使用this。
    //其它情況請參考API


    灰度變換
    下面的程序使用三種方法對一個彩色圖像進行灰度變換,變換的效果都不一樣。一般而言,灰度變換的算法是將象素的三個顏色分量使用R*0.3+G*0.59+B*0.11得到灰度值,然后將之賦值給紅綠藍,這樣顏色取得的效果就是灰度的。另一種就是取紅綠藍三色中的最大值作為灰度值。java核心包也有一種算法,但是沒有看源代碼,不知道具體算法是什么樣的,效果和上述不同。

     GrayFilter.java
    @author :tiffanyin
    email:cherami@163.netimport java.awt.image.*;
    public class GrayFilter extends RGBImageFilter {
    int modelStyle;
    public GrayFilter() {
    modelStyle=GrayModel.CS_MAX;
    canFilterIndexColorModel=true;
    }
    public GrayFilter(int style) {
    modelStyle=style;
    canFilterIndexColorModel=true;
    }
    public void setColorModel(ColorModel cm) {
    if (modelStyle==GrayModel
    else if (modelStyle==GrayModel
    }
    public int filterRGB(int x,int y,int pixel) {
    return pixel;
    }
    }
     GrayFilter.java
    @author:tiffanyin 
    email:cherami@163.net
    import java.awt.image.*;
    public class GrayModel extends ColorModel {
    public static final int CS_MAX=0;
    public static final int CS_FLOAT=1;
    ColorModel sourceModel;
    int modelStyle;

    public GrayModel(ColorModel sourceModel) {
    super(sourceModel.getPixelSize());
    this.sourceModel=sourceModel;
    modelStyle=0;
    }

    public GrayModel(ColorModel sourceModel,int style) {
    super(sourceModel.getPixelSize());
    this.sourceModel=sourceModel;
    modelStyle=style;
    }

    public void setGrayStyle(int style) {
    modelStyle=style;
    }

    protected int getGrayLevel(int pixel) {
    if (modelStyle==CS_MAX) {
    return Math.max(sourceModel.getRed(pixel),Math.max(sourceModel.getGreen(pixel),sourceModel.getBlue(pixel)));
    }
    else if (modelStyle==CS_FLOAT){
    return (int)(sourceModel.getRed(pixel)*0.3+sourceModel.getGreen(pixel)*0.59+sourceModel.getBlue(pixel)*0.11);
    }
    else {
    return 0;
    }
    }

    public int getAlpha(int pixel) {
    return sourceModel.getAlpha(pixel);
    }

    public int getRed(int pixel) {
    return getGrayLevel(pixel);
    }

    public int getGreen(int pixel) {
    return getGrayLevel(pixel);
    }

    public int getBlue(int pixel) {
    return getGrayLevel(pixel);
    }

    public int getRGB(int pixel) {
    int gray=getGrayLevel(pixel);
    return (getAlpha(pixel)<<24)+(gray<<16)+(gray<<8)+gray;
    }
    }


    如果你有自己的算法或者想取得特殊的效果,你可以修改類GrayModel的方法getGrayLevel()。
    色彩變換
    根據(jù)上面的原理,我們也可以實現(xiàn)色彩變換,這樣的效果就很多了。下面是一個反轉(zhuǎn)變換的例子:


    /* ReverseColorModel.java*/
      @author: tiffanyin 
    /*email:cherami@163.net*/
    import java.awt.image.*;
    public class ReverseColorModel extends ColorModel {
    ColorModel sourceModel;
    public ReverseColorModel(ColorModel sourceModel) {
    super(sourceModel.getPixelSize());
    this.sourceModel=sourceModel;
    }

    public int getAlpha(int pixel) {
    return sourceModel.getAlpha(pixel);
    }

    public int getRed(int pixel) {
    return ~sourceModel.getRed(pixel);
    }

    public int getGreen(int pixel) {
    return ~sourceModel.getGreen(pixel);
    }

    public int getBlue(int pixel) {
    return ~sourceModel.getBlue(pixel);
    }

    public int getRGB(int pixel) {
    return (getAlpha(pixel)<<24)+(getRed(pixel)<<16)+(getGreen(pixel)<<8)+getBlue(pixel);
    }
    }
    /* ReverseColorModel.java*/
    /*@author:tiffanyin */
    /*email:cherami@163.net*/
    import java.awt.image.*;
    public class ReverseFilter extends RGBImageFilter {
    public ReverseFilter() {
    canFilterIndexColorModel=true;
    }

    public void setColorModel(ColorModel cm) {
    substituteColorModel(cm,new ReverseColorModel(cm));
    }

    public int filterRGB(int x,int y,int pixel) {
    return pixel;
    }
    }


    要想取得自己的效果,需要修改ReverseColorModel.java中的三個方法,getRed、getGreen、getBlue。
    下面是上面的效果的一個總的演示程序。


    /*GrayImage.java*/
    /*@author: tiffanyin */
    /*email:cherami@163.net*/
    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
    import java.awt.color.*;
    public class GrayImage extends JFrame{
    Image source,gray,gray3,clip,bigimg;
    BufferedImage bimg,gray2;
    GrayFilter filter,filter2;
    ImageIcon ii;
    ImageFilter cropFilter;
    int iw,ih;

    public GrayImage() {
    ii=new ImageIcon(\"images/11.gif\");
    source=ii.getImage();
    iw=source.getWidth(this);
    ih=source.getHeight(this);
    filter=new GrayFilter();
    filter2=new GrayFilter(GrayModel.CS_FLOAT);
    gray=createImage(new FilteredImageSource(source.getSource(),filter));
    gray3=createImage(new FilteredImageSource(source.getSource(),filter2));
    cropFilter=new CropImageFilter(5,5,iw-5,ih-5);
    clip=createImage(new FilteredImageSource(source.getSource(),cropFilter));
    bigimg=source.getScaledInstance(iw*2,ih*2,Image.SCALE_DEFAULT);
    MediaTracker mt=new MediaTracker(this);
    mt.addImage(gray,0);
    try {
    mt.waitForAll();
    } catch (Exception e) {
    }
    }

    public void paint(Graphics g) {
    Graphics2D g2=(Graphics2D)g;
    bimg=new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
    Graphics2D srcG = bimg.createGraphics();
    RenderingHints rhs = g2.getRenderingHints();
    srcG.setRenderingHints(rhs);
    srcG.drawImage(source, 0, 0, null);
    ColorSpace graySpace=ColorSpace.getInstance(ColorSpace.CS_GRAY);
    ColorConvertOp op=new ColorConvertOp(graySpace,rhs);
    gray2=new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
    op.filter(bimg,gray2);
    g2.drawImage(source,40,40,this);
    g2.drawImage(gray,80,40,this);
    g2.drawImage(gray2,120,40,this);
    g2.drawImage(gray3,160,40,this);
    g2.drawImage(clip,40,80,this);
    g2.drawImage(bigimg,80,80,this);
    }

    public void update(Graphics g) {
    paint(g);
    }

    public static void main(String args[]) {
    GrayImage m=new GrayImage();
    m.setSize(400,400);
    m.setVisible(true);
    }
    }

    posted @ 2007-11-26 13:47 java2java 閱讀(1711) | 評論 (1)編輯 收藏

    2007年11月19日 #

    數(shù)值類型:

    雖然是面向?qū)ο蟮恼Z言,但是在使用上數(shù)值類型還是必不可少的,如果在C的學(xué)習(xí)中已經(jīng)掌握了C的數(shù)值計算和轉(zhuǎn)換規(guī)則,那我想這里應(yīng)該沒有什么問題,只有兩點需要注意:1、14.0這樣的浮點常量被認為是double型,只有加上f后綴才是float型的;2、整數(shù)常量說起來被認為是int型,但是在編譯時,可以認為編譯器將其看作能表示該數(shù)的最小數(shù)值,因此byte b = 100;不會報錯。

    引用類型:

    其實所謂引用類型在C++中已有體現(xiàn),就是傳參的時候有一種引用類型,從C來考慮,它就是一個指針,只不過,我們不能對它進行指針上的硬操作。所以這里的重點是:1、Java里所有的對象都是在堆中生成的,所以需要類似指針的東西指向它,那就是引用;2、我們通過引用操作的是引用所指向的對象,除了賦值操作外,應(yīng)該就沒有什么操作是針對引用本身的了,這一點是C的指針與Java的引用區(qū)別所在。

    類和對象:

    這是一個大塊,有很多東西,不展開說了,就說幾個重點:1、類方法、類屬性與成員方法、成員屬性在加載、初始化、使用上的異同;2、在構(gòu)造函數(shù)中,this()和super()的用法;3、子類的加載過程、初始化過程和構(gòu)造過程;4、方法的重載和覆寫;5、覆寫所引出的多態(tài)問題。(注意:多態(tài)之應(yīng)用在方法上,對屬性沒有作用)

    函數(shù)調(diào)用的參數(shù)傳遞:

    如果把引用類型所記錄的地址值,就看作是引用類型變量的值的話,那么,Java的所有方法調(diào)用的時候,都是采用的值傳遞??數(shù)值類型傳數(shù)值,引用類型傳地址。

    IO流:

    與C比起來,Java的輸入輸出,尤其是輸入是非常麻煩的,也許是因為出于面向?qū)ο蟮目紤]吧?不知道。Java提供了很多的IO流,但是我們并不必將各種IO都搞清楚,我們只需要了解字節(jié)流與字符流各有什么功能,字符流是如何在字節(jié)流之上構(gòu)造的,幾乎所有的字符流構(gòu)造的時候都是建立在一個已有的字節(jié)流的基礎(chǔ)上的,并且它的這種設(shè)計使得我們可以像套管子一樣,將IO流一節(jié)一節(jié)套起來,直到得到我們想使用的IO對象(例:BufferedReader的使用)。在我們以后使用的時候,我們可以再去查API,主要要看的幾個類是:FileReader、FileWriter、BufferedReader,再配合上System.out對象,對于文本的輸入、輸出來說,就足夠用了,其他的沒有必要看那么多,用的時候再看了。

    容器:

    個人認為,這是Java編程的一大利器,常用的類是:ArrayList(List)作為可變長數(shù)組、HashMap(Map)用來建立查找表,Set很少用,只在HashMap的使用中連帶用過一些。通過對這兩個類的熟悉,能夠?qū)ist、Set和Map三大類的基本用法掌握。另外它的幾個輔助類要掌握:Iterator和Collections。Collections類提供容器的一些通用工具,比如排序。而說到排序,就牽扯出了比較器:Comparator。能夠熟練使用Comparator類,可以讓你為自己的需求和自己的類定制排序方案。

    AWT和SWING:

    個人認為,Java在圖形界面的制作上有著非常好的封裝性,我以前曾經(jīng)試圖學(xué)過MFC,MFC在生成圖形界面的時候會幫助你生成一些代碼,然后讓你在這些代碼的指定位置添加代碼以實現(xiàn)功能,我這個人有個習(xí)慣,如果讓我看到了一些東西,那么我不搞清除為什么這么寫,就不會往下走,看到那許多代碼,自然就想弄清楚那些是什么,結(jié)果引出來好多知識,后來我才知道其中有些是調(diào)用WinAPI,結(jié)果我到現(xiàn)在還是不會用MFC。這里并不是貶低MFC,我相信MFC有其過人之處,只不過個人認為它的封裝性做得不好,暴露出了太多東西,也許能夠提高靈活性,不過,可能我跟它無緣:(。在這方面Java就做得不錯,給你一個類,你用就是了,它將圖形界面的低層實現(xiàn)隱藏的很好,將其作為一個對象給你,而你只需要在這個對象上修修改改,挺方便的。

    作為初學(xué)者,我覺得AWT的重點在于它的幾個Listener的用法,還有布局格式,然后就是那許多的Component的用處和用法。

    不過,因為我個人使用的原因,所以至今AWT和SWING都用得很少,所以這方面也就不便多說了,抱歉。寫這些并不是告訴大家怎么解決問題,因為每一個都有很多可寫,只是希望能給初學(xué)者一點參考,希望能夠幫助初學(xué)者們有的放矢地看書. ( 轉(zhuǎn)載920-432 920-553 )
    posted @ 2007-11-19 11:34 java2java 閱讀(1511) | 評論 (4)編輯 收藏

    僅列出標題  下一頁
    主站蜘蛛池模板: 亚洲&#228;v永久无码精品天堂久久| 中文字幕成人免费高清在线视频 | 一级一黄在线观看视频免费| 亚洲精品高清久久| 亚洲第一极品精品无码久久| 亚洲第一区精品观看| 毛片视频免费观看| 日本三级2019在线观看免费| 免费在线观看一级片| 中文字幕成人免费高清在线 | 国产亚洲精品免费| 免费做爰猛烈吃奶摸视频在线观看 | 国产免费牲交视频免费播放| 亚洲成a人片在线不卡一二三区| 亚洲深深色噜噜狠狠网站| 亚洲大成色www永久网址| 精品亚洲成在人线AV无码| 亚洲人成色777777老人头| 亚洲精品无码永久在线观看男男| 亚洲欧洲另类春色校园网站| 久久狠狠爱亚洲综合影院| 亚洲AV无码国产一区二区三区| 国产偷国产偷亚洲清高APP| 成人久久久观看免费毛片| 成人无码a级毛片免费| 91精品免费不卡在线观看| 女人让男人免费桶爽30分钟| 亚洲精品乱码久久久久久蜜桃 | 久久午夜夜伦鲁鲁片免费无码影视| 蜜臀98精品国产免费观看| 日本特黄特黄刺激大片免费| 激情综合色五月丁香六月亚洲| 久久综合亚洲色HEZYO社区| 亚洲中文无码mv| 久久成人免费播放网站| 免费看片免费播放| 久久夜色精品国产噜噜噜亚洲AV | 波霸在线精品视频免费观看| 18女人腿打开无遮掩免费| 亚洲AⅤ视频一区二区三区| 青青草原精品国产亚洲av|