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

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

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

    BlogJava 聯系 聚合 管理  

    Blog Stats

    隨筆檔案

    exams


    java世界

    世界Java

    2007年11月26日 #

    1.錯誤提示內容:Can‘t find class HelloworldApp
    

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

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

      例如:

      class HelloWorldapp(…)

      經編譯后將創建HelloWorldapp.class類。執行時,也要使用這個名字。發生這個錯誤時,可以使用文件查看命令Is或dir看看當前目錄下是否存在相應的文件,并檢查文件名的大小寫。

      2.錯誤提示內容:In class HelloWorldApp:main must be public and static

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

      3.文件中含有的類個數錯誤

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

      4.層次錯誤

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

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

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

      (3)類和接口說明。

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

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

      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.錯誤提示內容:Can‘t find class HelloworldApp

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

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

      例如:

      class HelloWorldapp(…)

      經編譯后將創建HelloWorldapp.class類。執行時,也要使用這個名字。發生這個錯誤時,可以使用文件查看命令Is或dir看看當前目錄下是否存在相應的文件,并檢查文件名的大小寫。

      2.錯誤提示內容:In class HelloWorldApp:main must be public and static

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

      3.文件中含有的類個數錯誤

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

      4.層次錯誤

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

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

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

      (3)類和接口說明。

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

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

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

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

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

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

    比如WebApp的項目,以下的指令得出的結果就是

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

    比如你是純java的程序,就是你執行java指令的當前路徑

    3。取出jdk所在的bin目錄

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

    其中user.dir是一個參數,更多參數請看這里

    二、jsp/servlet 中的取路徑

    以前我們常用getRealPath(),不過這個方法已經不推薦用了。但我們可以使用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

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

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

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

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

       Java開發員
       概述:本課程將提供給學員設計資料服務器應用法的實際設計方法,學員將使用Java聲音、圖形、網絡通訊等接口,編寫與服務器相連接的Java應用程度,通過本課程學員還能學到如何在Java程序中調用本機用其它計算機語言編寫的程序 117-102 117-301 190-721 。

       本課程是為熟悉Java語言結構及語法的程序員而設立的。以便他們能在本課程中獲得開發復雜的、產品級的Java應用技術。
       目標:在學完本課程后,學員將能夠:
       設計和開發Java GUI
       設計和開發動畫Java應用程序
       掌握了Java網絡編程技術
       懂得了JDBC-API的基本結構
       知道UNIX與Windows NT互連有哪些技術問題
       能夠解釋在Java程序中調用其它語言所編寫的程序的方法與步驟

       Sun認證Java程序員考試(JDK1.1)由一門考試組成,可以用來測試考生對Java語言的掌握程度。考生可以使用考試大綱(exam objectives)作為準備考試的工具。
       為了保證Sun客戶使用的是Sun的最新技術,Sun Educational Services已經把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”
       題數:60
       考題類型:多選/簡答
       通過分數: 70%
       考試時間: 2小時
       考試費用: $150
    posted @ 2008-01-07 10:11 java2java 閱讀(563) | 評論 (2)編輯 收藏

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

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

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

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

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

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

    這種辦法使用于任何情況,經典代表BEA WebLogic

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

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

    我們可以看見這個文件里面有好多熟悉的東西啊:java.*/com.sun.*/javax.*等等,但這個不是我們關心的,我們要的是com.togethersoft.*或者是一些沒有包名的zd.d等等。(這里插一句,幾乎所有的Java應用程序都會混淆的,其實混淆的原理也很簡單,我們后面再說。)先找找有沒有License有關的,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驗證都是走的這個類,面向對象的思想不錯,呵呵:)

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

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

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

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

    原則一,盡量使用公鑰和秘鑰對進行加密;
    原則二,不要在加密驗證的部分使用面向對象思想:)把驗證的方法寫在程序的各個角落,并標注為private final void,讓編譯器替你處理成內聯方法;
    原則三,盡可能的大幅度混淆:)找個好點的混淆器

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



    第一,final, finally, finalize的區別.

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

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

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

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

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

    第四,&和&&的區別。

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

    第五,HashMap和Hashtable的區別。

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

    第六,Collection 和 Collections的區別。
    Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。
    Collection是個java.util下的接口,它是各種集合結構的父接口。

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

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

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

    第九,String s = new String("xyz");創建了幾個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型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

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

    第十三,Java有沒有goto?
    Goto java中的保留字,現在沒有在java中使用。

    第十四,數組有沒有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  190-802 000-834 000-861 117-102 117-301 190-721

    第十八,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的。
    一般認為第一種形式要更加安全些

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

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

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

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

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

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

     下面代碼中用到的sourceImage是一個已經存在的Image對象

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

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


    如果是在Component的子類中使用,可以將上面的Toolkit.getDefaultToolkit().去掉。FilteredImageSource是一個ImageProducer對象。
    圖像縮放
    對于一個已經存在的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實現了圖像觀察者接口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()。
    色彩變換
    根據上面的原理,我們也可以實現色彩變換,這樣的效果就很多了。下面是一個反轉變換的例子:


    /* 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 閱讀(1712) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 亚洲成AV人影片在线观看| 国产成人无码免费网站| 免费被黄网站在观看| 一本到卡二卡三卡免费高| 亚洲国产精品一区| 超pen个人视频国产免费观看| www成人免费观看网站| 亚洲综合一区二区| 一本色道久久88亚洲综合| 玖玖在线免费视频| 亚洲aⅴ无码专区在线观看| 久久久青草青青亚洲国产免观| 久草视频在线免费| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 精品无码一区二区三区亚洲桃色| 妞干网在线免费观看| 国产精品免费视频观看拍拍| 亚洲一区二区三区深夜天堂| a级亚洲片精品久久久久久久| 国产乱码免费卡1卡二卡3卡| 最近中文字幕免费大全| 亚洲七久久之综合七久久| 国产精品亚洲片在线观看不卡| 在线观看国产情趣免费视频| 99久久人妻精品免费一区| 色窝窝亚洲av网| 亚洲日韩乱码久久久久久| 亚洲精品无码Av人在线观看国产| 宅男666在线永久免费观看| 1000部国产成人免费视频| a级毛片毛片免费观看久潮| 美女视频黄视大全视频免费的| 亚洲制服在线观看| 久久久久亚洲av无码尤物| 亚洲天堂在线视频| 免费无码又爽又刺激毛片| 国产在线jyzzjyzz免费麻豆| 亚洲免费人成在线视频观看 | 9久热精品免费观看视频| 亚洲午夜理论片在线观看| 亚洲精品在线电影|