久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

java自學心得

時間:2019-05-13 17:24:32下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《java自學心得》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《java自學心得》。

第一篇:java自學心得

Java 自學心得體會

學習一門新的知識,不可能指望只看一本,或者兩本書就能夠完全掌握。需要有一個循序漸進的閱讀過程。我推薦Oreilly出版的Java系列書籍。

在這里我只想補充一點看法,很多人學習Java是從《ThinkinginJava》這本書入手的,但是我認為這本書是不適合初學者的。我認為正確的使用這本書的方法應該是作為輔助的讀物。《ThinkinginJava》并不是在完整的介紹Java的整個體系,而是一種跳躍式的寫作方法,是一種類似tips的方法來對Java很多知識點進行了深入的分析和解釋。

對于初學者來說,最好是找一本Java入門的書籍,但是比較完整的循序的介紹Java的語法,面向對象的特性,核心類庫等等,在看這本書的同時,可以同步來看《ThinkinginJava》,來加深對Java的理解和原理的運用,同時又可以完整的了解Java的整個體系。

對于Java的入門書籍,蔡學鏞推薦的是Oreilly的《ExploringJava,2ndEdition》或者《JavainaNutshell,2ndEdition(針對C++背景)》,我并沒有看過這兩本書。其實我覺得電子工業出版社的《Java2編程詳解》或者《Java2從入門到精通》就很不錯。

在所有的Java書籍當中,其實最最有用的,并不是O 'reilly的JavaSerials,真正最最有用處是JDK的Documentation!幾乎你想獲得的所有的知識在Documentation里面全部都有,其中最主要的部分當然是Java基礎類庫的API文檔,是按照package來組織的,對于每一個class都有詳細的解釋,它的繼承關系,是否實現了某個接口,通常用在哪些場合,還可以查到它所有的public的屬性和方法,每個屬性的解釋,意義,每個方法的用途,調用的參數,參數的意義,返回值的類型,以及方法可能拋出的異常等等。可以這樣來說,所有關于Java編程方面的書籍其實都不過是在用比較通俗易懂的語言,和良好的組織方式來介紹Documentation里面的某個package里面包含的一些類的用法而已。所以萬變不離其宗,如果你有足夠的能力來直接通過Documentation來學習Java的類庫,那么基本上就不需要看其他的書籍了。除此之外,Documentation也是編程必備的手冊,我的桌面上有三個Documentation的快捷方式,分別是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了這個三個Documentation,什么其他的書籍都不需要了。

對于JavaWeb編程來說,最核心的是要熟悉和掌握HTTP協議,這個就和Java無關了,在熟悉HTTP協議之后,就需要熟悉Java的實現HTTP協議的類庫,也就是ServletAPI,所以最重要的東西就是ServletAPI。當然對于初學者而言,直接通過ServletAPI來學習Web編程有很大的難度,我推薦O 'reilly的《JavaServerPages》這本書來學習Web編程。

EJB的書籍當中,《EnterpriseJavaBeans,2ndEdition》是一本很不錯的書,EJB的學習門檻是比較高,入門很難,但是這本書完全降低了學習的難度,特別重要的一點是,EJB的學習需要結合一種AppServer的具體實現,所以在學習EJB的同時,必須同步的學習某種AppServer,而這本書相關的出了三本書,分別是Weblogic6.1,Websphere4.0

和JBoss3.0上面部署書中例子的實做。真是既有理論,又有實踐。在學習EJB的同時,可以邊看邊做,EJB的學習會變得很輕松。

但是這本書也有一個問題,就是版本比較舊,主要講EJB1.1規范和部分EJB2.0的規范。而EdRoman寫的《MasteringEJB2.0》這本書完全是根據EJB2.0規范寫的,深入淺出,覆蓋了EJB編程的各個方面,并且還有很多編程經驗tips,也是學習EJB非常推薦的書籍之一。

如果是結合Weblogic來學習J2EE的話,《J2EE應用與BEAWeblogicServer》絕對是首選讀物,雖然是講述的Weblogic6.0,仍然值得購買,這本書是BEA官方推薦的教材,作者也是BEA公司的工程師。現在中文版已經隨處可見了。這本書結合Weblogic介紹了J2EE各個方面的技術在Weblogic平臺上的開發和部署,實踐指導意義非常強。

在掌握了Java平臺基礎知識和J2EE方面的知識以后,更進一步的是學習如何運用OO的方法進行軟件的設計,那么就一定要學習“設計模式”。Sun公司出版了一本《J2EE核心模式》,是每個開發Java企業平臺軟件的架構師必備的書籍。這本書全面的介紹了J2EE體系架構的各種設計模式,是設計師的必讀書籍。

JavaLearningPath

(三)過程篇

每個人的學習方法是不同的,一個人的方法不見得適合另一個人,我只能是談自己的學習方法。因為我學習Java是完全自學的,從來沒有問過別人,所以學習的過程基本上完全是自己摸索出來的。我也不知道這種方法是否是比較好的方法,只能給大家提供一點參考了。

學習Java的第一步是安裝好JDK,寫一個HelloWorld,其實JDK的學習沒有那么簡單,關于JDK有兩個問題是很容易一直困擾Java程序員的地方:一個是CLASSPATH的問題,其實從原理上來說,是要搞清楚JRE的ClassLoader是如何加載Class的;另一個問題是package和import問題,如何來尋找類的路徑問題。把這兩個問題摸索清楚了,就掃除了學習Java和使用JDK的最大障礙。推薦看一下王森的《Java深度歷險》,對這兩個問題進行了深入的探討。

第二步是學習Java的語法。Java的語法是類C++的,基本上主流的編程語言不是類C,就是類C++的,沒有什么新東西,所以語法的學習,大概就是半天的時間足夠了。唯一需要注意的是有幾個不容易搞清楚的關鍵字的用法,public,protected,private,static,什么時候用,為什么要用,怎么用,這可能需要有人來指點一下,我當初是完全自己琢磨出來的,花了很久的時間。不過后來我看到《ThinkinginJava》這本書上面是講了這些概念的。

第三步是學習Java的面向對象的編程語言的特性的地方。比如繼承,構造器,抽象類,接口,方法的多態,重載,覆蓋,Java的異常處理機制。對于一個沒有面向對象語言背景的人來說,我覺得這個過程需要花很長很長時間,因為學習Java之前沒有C++的經驗,只有C的經驗,我是大概花了一個月左右吧,才徹底把這些概念都搞清楚,把書上面的例子反復的揣摩,修改,嘗試,把那幾章內容反復的看過來,看過去,看了不下5遍,才徹底領悟了。不過我想如果有C++經驗的話,應該一兩天時間足夠了。那么在這個過程中,可以多看看《ThinkinginJava》這本書,對面向對象的講解非常透徹。可惜的是我學習的時候,并

沒有看到這本書,所以自己花了大量的時間,通過自己的嘗試和揣摩來學會的。

第四步就是開始熟悉Java的類庫。Java的基礎類庫其實就是JDK安裝目錄下面jrelibrt.jar這個包。學習基礎類庫就是學習rt.jar。基礎類庫里面的類非常非常多。據說有3000多個,我沒有統計過。但是真正對于我們來說最核心的只有4個,分別是

java.lang.*;

java.io.*;

java.util.*;

java.sql.*;

這四個包的學習,每個包的學習都可以寫成一本厚厚的教材,而O 'reilly也確實是這樣做的。我覺得如果時間比較緊,是不可能通過讀四本書來學習。我覺得比較好的學習方法是這樣的:

首先要通讀整個package的框架,了解整個package的class,interface,exception的構成,最好是能夠找到介紹整個包框架的文章。這些專門介紹包的書籍的前幾章應該就是這些總體的框架內容介紹。

對包整體框架的把握并不是要熟悉每個類的用法,記住它有哪些屬性,方法。想記也記不住的。而是要知道包有哪些方面的類構成的,這些類的用途是什么,最核心的幾個類分別是完成什么功能的。我在給人培訓的時候一般是一次課講一個包,所以不可能詳細的介紹每個類的用法,但是我反復強調,我給你們講這些包的不是要告訴你們類的方法是怎么調用的,也不要求你們記住類的方法調用,而是要你們了解,Java給我們提供了哪些類,每個類是用在什么場合,當我遇到問題的時候,我知道哪個類,或者哪幾個類的組合可以解決我的問題,That 'all!,當我們具體寫程序的時候,只要你知道該用哪個類來完成你的工作就足夠了。編碼的時候,具體的方法調用,是邊寫代碼,邊查Documentation,所有的東西都在Documentation里面,不要求你一定記住,實際你也記不住3000多個類的總共將近10萬個方法調用。所以對每個包的總體框架的把握就變得極為重要。

第五步,通過上面的學習,如果學的比較扎實的話,就打好了Java的基礎了,剩下要做的工作是掃清Documentation里面除了上面4個包之外的其他一些比較有用處的類。相信進展到這一步,Java的自學能力已經被培養出來了,可以到了直接學習Documentation的水平了。除了要做GUI編程之外,JDK里面其他會有用處的包是這些:

java.text.*;

java.net.*;

javax.naming.*;

這些包里面真正用的比較多的類其實很少,只有幾個,所以不需要花很多時間。

第六步,JavaWeb編程

Web編程的核心是HTTP協議,HTTP協議和Java無關,如果不熟悉HTTP協議的話,雖然也可以學好Servlet/JSP編程,但是達不到舉一反三,一通百通的境界。所以HTTP協議的學習是必備的。如果熟悉了HTTP協議的話,又有了Java編程的良好的基礎,學習Servlet/JSP簡直易如反掌,我學習Servlet/JSP就用了不到一周的時間,然后就開始用JSP來做項目了。

在Servlet/JSP的學習中,重頭仍然是ServletDocumentation。ServletAPI最常用的類很少,花比較少的時間就可以掌握了。把這些類都看一遍,多寫幾個例子試試。Servlet/JSP編程本質就是在反復調用這些類來通過HTTP協議在WebServer和Brower之間交談。另外對JSP,還需要熟悉幾個常用JSP的標記,具體的寫法記不住的話,臨時查就是了。

此外JavaWeb編程學習的重點要放在WebApplication的設計模式上,如何進行業務邏輯的分析,并且進行合理的設計,按照MVC設計模式的要求,運用Servlet和JSP分別完成不同的邏輯層,掌握如何在Servlet和JSP之間進行流程的控制和數據的共享,以及WebApplication應該如何配置和部署。

第七步,J2EE編程

以上的學習過程如果是比較順利的話,進行到這一步,難度又陡然提高。因為上面的知識內容都是只涉及一個方面,而像EJB,JMS,JTA等核心的J2EE規范往往是幾種Java技術的綜合運用的結晶,所以掌握起來難度比較大。

首先一定要學習好JNDI,JNDI是AppServer定位服務器資源(EJB組件,Datasouce,JMS)查找方法,如果對JNDI不熟悉的話,EJB,JMS這些東西幾乎學不下去。JNDI其實就是javax.naming.*這個包,運用起來很簡單。難點在于服務器資源文件的配置。對于服務器資源文件的配置,就需要看看專門的文檔規范了,比如web.xml的寫法,ejb-jar.xml的寫法等等。針對每種不同的AppServer,還有自己的服務資源配置文件,也是需要熟悉的。

然后可以學習JTA,主要是要理解JTA對于事務的控制的方法,以及該在什么場合使用JTA。這里可以簡單的舉個例子,我們知道一般情況可以對于一個數據庫連接進行事務控制(conn.setAutoCommit(false),....,conn.commit()),做為一個原子操作,但是假設我的業務需求是要把對兩個不同數據庫的操作做為一個原子操作,你能做的到嗎?這時候只能用JTA了。假設操作過程是先往A數據庫插一條記錄,然后刪除B數據庫另一個記錄,我們自己寫代碼是控制不了把整個操作做為一個原子操作的。用JTA的話,由AppServer來完成控制。

在學習EJB之前要學習對象序列化和RMI,RMI是EJB的基礎。接著學習JMS和EJB,對于EJB來說,最關鍵是要理解EJB是如何通過RMI來實現對遠端對象的調用的,以及在什么情況下要用到EJB。

在學習完EJB,JMS這些東西之后,你可能會意識到要急不可待學習兩個領域的知識,一個是UML,另一個是DesignPattern。Java企業軟件的設計非常重視框架(Framework)的設計,一個好的軟件框架是軟件開發成功的必要條件。在這個時候,應該開始把學習的重點放在設計模式和框架的學習上,通過學習和實際的編程經驗來掌握EJB的設計模式和J2EE的核心模式。

J2EE規范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外還有很多很多的企業技術,這里不一一進行介紹了。

另外還有一個最新領域WebServices。WebServices也完全沒有任何新東西,它像是一種黏合劑,可以把不同的服務統一起來提供一個統一的調用接口,作為使用者來說,我只要獲得服務提供者給我的WSDL(對服務的描述),就夠了,我完全不知道服務器提供者提供的服務究竟是EJB組件,還是.Net組件,還是什么CORBA組件,還是其他的什么實現,我也不需要知道。WebServices最偉大的地方就在于通過統一的服務提供方式和調用方式,實現了整個Internet服務的共享,是一個非常令人激動的技術領域。WebServices好像目前還沒有什么很好的書籍,但是可以通過在網絡上面查資料的方式來學習。

JavaLearningPath

(四)方法篇

Java作為一門編程語言,最好的學習方法就是寫代碼。當你學習一個類以后,你就可以自己寫個簡單的例子程序來運行一下,看看有什么結果,然后再多調用幾個類的方法,看看運行結果,這樣非常直觀的把類給學會了,而且記憶非常深刻。然后不應該滿足把代碼調通,你應該想想看如果我不這樣寫,換個方式,再試試行不行。記得哪個高人說過學習編程就是個破壞的過程,把書上的例子,自己學習Documentation編寫的例子在運行通過以后,不斷的嘗試著用不同的方法實現,不斷的嘗試破壞代碼的結構,看看它會有什么結果。通過這樣的方式,你會很徹底的很精通的掌握Java。

舉個例子,我們都編過HelloWorld

publicclassHelloWorld{

publicstaticvoidmain(String[]args){

System.out.println(“HelloWorld ”);

}

}

很多初學者不是很理解為什么main方法一定要這樣來定義publicstaticvoidmain(String[]args),能不能不這樣寫?包括我剛學習Java的時候也有這樣的疑問。想知道答案嗎?很簡單,你把main改個名字運行一下,看看報什么錯誤,然后根據出錯信息進行分析;把main的public取掉,在試試看,報什么錯誤;static去掉還能不能運行;不知道main方法是否一定要傳一個String[]數組的,把String[]改掉,改成int[],或者String試試看;不知道是否必須寫args參數名稱的,也可以把args改成別的名字,看看運行結果如何。

我當初學習Java的時候就是這樣做的,把HelloWorld程序反復改了七八次,不斷運行,分析運行結果,最后就徹底明白為什么了main方法是這樣定義的了。

此外,我對于staic,public,private,Exception,try{}catch{}finally{}等等等等一開始都不是很懂,都是把參考書上面的例子運行成功,然后就開始破壞它,不斷的根據自己心里面的疑問來重新改寫程序,看看能不能運行,運行出來是個什么樣子,是否可以得到預期的結果。這樣雖然比較費時間,不過一個例子程序這樣反復破壞幾次之后。我就對這個相關的知識徹底學通了。有時候甚至故意寫一些錯誤的代碼來運行,看看能否得到預期的運行錯誤。這樣對于編程的掌握是及其深刻的。

其中特別值得一提的是JDK有一個非常棒的調試功能,-verbose

java–verbose

javac–verbose以及其它很多JDK工具都有這個選項

-verbose可以顯示在命令執行的過程中,JVM都依次加載哪里Class,通過這些寶貴的調試信息,可以幫助我們分析出JVM在執行的過程中都干了些什么。

另外,自己在學習過程中,寫的很多的這種破壞例程,應該有意識的分門別類的保存下來,在工作中積累的典型例程也應該定期整理,日積月累,自己就有了一個代碼庫了。遇到類似的問題,到代碼庫里面Copy&Paste,Search&Replace,就好了,極大提高了開發速度。最理想的情況是把一些通用的例程自己再抽象一層,形成一個通用的類庫,封裝好。那么可復用性就更強了。

所以我覺得其實不是特別需要例程的,自己寫的破壞例程就是最好的例子,如果你實在對自己寫的代碼不放心的話,我強烈推薦你看看JDK基礎類庫的Java源代碼。在JDK安裝目錄下面會有一個src.zip,解開來就可以完整的看到整個JDK基礎類庫,也就是rt.jar的Java源代碼,你可以參考一下Sun是怎么寫Java程序的,規范是什么樣子的。我自己在學習Java的類庫的時候,當有些地方理解的不是很清楚的時候,或者想更加清晰的理解運作的細節的時候,往往會打開相應的類的源代碼,通過看源代碼,所有的問題都會一掃而空。

第二篇:自學Java心得

要學好java找一份工作,需要很大的毅力,具體學多長時間就可以找工作,要看個人的悟性和學習能力,以我們宿舍6個人來說,計算機專業大專學歷,我比較笨在大學里自學了一年左右的時間,畢業后在北京一家做移動增值的公司上班了。同宿舍的其它5個人,其中一個比較強,自學半年就去深圳華為上班了,2個找了個培訓班學了4個月,現在都干上開發了,還有2個家里有關系,工作和計算機沒關系。

總的來說,經濟不困難的話,找個培訓班比較好,學得比較全面,有老師指導學起來也不困難,就業比較順利。如果經濟條件不好,自己又喜歡這行,自學能堅持的話那就自學,老大不小了,總不能老伸手找家里拿錢不是。選擇自學的話,基本上要分以下幾個階段:

1、要學java,肯定首先得把Java語言本身給掌握了,萬事開頭難,學java最難的也是java的入門,學習順序是先掌握java的語法(多練就行),再掌握java面向對象的思想(封裝、繼承、多態、接口這些東西是重點,要多理解),接下來就是熟悉java常用的API(集合、IO等,主要是跟著書多寫多練),這些東西掌握后,Java語言就算入門了。入門java推薦大家下載張孝祥的《java就業培訓教程》視頻教程,學java的沒有不知道這套視頻的,我們宿舍當時都是學這套視頻入門的。這套視頻最大的好處簡單易懂,并引用了很多實用案例,并且還有配套書(書名好像也是java就業培訓教程,新華書店有),省得忘了的地方,動不動對著電腦翻視頻了。還有一些視頻也比較好,例如孫鑫的java視頻,馬士兵的java視頻等。不過對初學者而言,選中一套視頻了就跟著好好學,不要下很多視頻,東抓一把、西抓一把,最后啥也沒學到。

2、有java基礎了想馬上從事實際開發還是不夠的,接下來就需要掌握1-2門數據庫技術了,對java來說數據庫當然是oracle和mysql。oracle數據庫現在還沒發現好的視頻,不過現在大學都學了數據庫,有了數據庫基礎后,找本好書學oracle也就不難了。這里推薦何明的《從實踐中學習Oracle/SQL》,作者來頭很大,有非常深的oracle功底,書寫得由淺入深,相當不錯。對程序員來講,學數據庫關鍵是把增刪改查的sql語句學好了就OK了,不要去摳什么數據庫管理方面的東西。學了oracle后,要把數據庫和java程序聯系起來,這時候就要學jdbc了,jdbc不難,網上很多資料,大概一周時間就可以掌握了。

3、有了上面的基礎后,恭喜你已經具備用java開發企業級應用的基礎了。這時候你可以學習javaweb試著做點小項目玩了。不過學javaweb需要很多雜七雜八的知識點,比如xml、html、javascript、tomcat服務器等,學了這些后,大家才可以學servlet、jsp。學javaweb推薦大家買《深入體驗Javaweb開發內幕-核心基礎》這本書,還是張孝祥寫的,這本書寫的書很有特點,很細很深入,書上還帶大量的實驗案例,一步步講得非常清晰,非常適合初學者。學javaweb這本書絕對是首選,并且這本書也有配套視頻,在網上有下,不過視頻只有前4章,比較可惜,希望張孝祥老師能早日錄制全套視頻。還有些視頻和書也不錯,比如李興華的JSP視頻教程、孫鑫的JAVA WEB 開發詳解等,這些也不錯,在網上都有免費下的。

4、接下來為找工作就要學strutshibernatespringajax這些流行技術了。這些技術我學習的時候沒有視頻,買的孫衛琴的書學,花了我大半年時間才學明白。現在幸福多了,網上有很多視頻,個人推薦大家下傳智播客的視頻看。這個機構的老師很牛課程很有深度,真正能學到技術,不會誤了大家。不過他們的視頻里老打廣告,很煩。書籍推薦struts看孫衛琴的,hibernate看夏昕的,spring看林信良的,具體書名叫什么忘了,大家google一下就清楚了。

學完上面這些就可以試著找工作了,我找了40天找著了。順便再說一句,自學不可能不碰到問題,CSDN的論壇很不錯,有問題上去問,一般都會有人回答你。要找培訓班的話北京的傳智播客還不錯,我宿舍的2個就在那里,教學質量高,學完后很輕松都上班了,這家機構就是在外地沒有分部,想培訓要去北京,生活費用高,花費大。北京還有一些培訓也不錯,達內什么的,可以看看。

第三篇:Java自學成長路線

Java自學成長路線

JAVA自學之路 一:學會選擇

決心做軟件的,大多數人選的是java,或是.net,也有一些選擇了手機、嵌入式、游戲、3G、測試等。

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文件中包含的類,我們可以調用類中的方法來完成某些功能或繼承它。

那么究竟應該選擇什么方向呢?

我的意見是,不要太過相信各種培訓機構或是搶手文章的說法(包括我),當你要走向社會的時候,就不要再把自己當成學生,不要把自己的將來交給別人,學會運用自己的眼睛去觀察,去了解這個世界吧。

每個培訓機構都會宣傳自己的好處,并不能說明大的趨勢。一些新聞文章很有可能是槍手寫的,不必太過相信。國外背景的教師和課程,未必適合你。

那么怎么才能確定自己將來的方向?如何才能從紛繁復雜、或真或假的數據世界中挖出一條路?

我講一個通過招聘網站的觀察方法。

可以到各種招聘的網站上查詢信息(可以到google上查詢招聘的網站),例如: http:// 得到別人的回答,要懂得感恩。

第四篇:Java心得

JAVA心得

1.Only public & abstract are permitted for interface.2.Only public, abstract & final are permitted for class.3.main方法作為程序的入口,其modifier必須是 public static void

且必須有一個類型為String的數組參數, 否則不能運行.4.非static內部類中不能有static的域和方法.static的域和方法只能存在于頂級類中或者是static嵌套類中.5.interface 中定義的變量都是public static final的, 且必須賦值.6.如果試圖在方法中更改final變量的值, 則編譯不能通過;

7.兩個int類型的數相除其結果也是int型且不會四舍五入而是直接截取整數部分.一個浮點型數字與整數相除其結果是浮點型.8.try{}塊后面必須有catch(Exception){}或者finally{}

try{return a;}

finally{

}

執行順序是return語句返回結果之前 先執行finally{}再返回結果.9.子類override父類方法是可見修飾符級別不能降低,例如父類是protected

子類可以是protected和public 但不可以是default和private.如果子類有個方法與父類同名且參數類型也相同,則必須返回值類型也相同 否則不能編譯.Java允許方法名與類名相同, IDE會給出警告但可以編譯和運行.

第五篇:Java語言-自學手冊完全版

北京廣播電視大學 Java語言自主學習手冊

理工教學部 2010.10

Java的發展史?1991.4—Sun進軍消費電子產品市場, 成立Green小組,開發Oak語言?1992.10—成立First Person公司,將Oak應用于Web,改名為Java?1993~4 —Web技術在Internet上流行?1995.5—Sun正式發表Java與HotJava產品?1995.10 ——與Netscape合作?1995.12 ——微軟支持Java?1996.2 ——Java 1.0正式出品?2000.9 ——升級至Java 1.3?2001.7 ——升級至Java 1.41第1講概述2

Java 2 PlatformJava 2 Enterprise Edition(J2EE)包含開發基于Web的應用程序類與接口,包含servlet、JavaServerPages和Enterprise JavaBeans類等等Java體系結構應用程序Java編程語言Java類文件Java 2PlatformJava 2 Standard Edition(J2SE)包含Java類和GUI類Java運行時環境Java APIJava虛擬機Java 2 Micro Edition(J2ME)Java對電子設備提供優化的運行時環境3操作系統(Windows、Unix等等)4

Java運行環境Java運行時環境(JRE,Java Runtime Environment)是Java虛擬機與核心類的組合,即Java平臺Java運行環境的主要功能:–加載代碼:將字節碼轉化為本機代碼,進行類的裝載和符號引用的消解,由類裝載器完成–校驗代碼:由字節碼校驗器完成–執行代碼:控制代碼的執行,由運行時解釋器完成5?Java類庫API類庫APIJava API是SUN提供的用Java語言開發的集合Java應用程序編程接口(API,Application Program Interface)是預先編好的代碼,組成類似主題的包Java API包括幾十個包,常用的有:java.lang,java.io, java.util, java.net, java.awt, java.applet等6

Java 核心類包舉例1.java.lang----包含一些Java語言的核心類2.java.awt----包含了構成抽象窗口工具集(AWT)的多個類,這些類被用來構建和管理應用程序的圖形用戶界面(GUI)3.java.applet----包含applet運行所需的一些類4.java.net----包含執行與網絡相關的操作的類5.java.io----包含能提供多種輸入/輸出功能的類6.java.util----包含一些實用工具類7Java的語法機制Java是面向對象程序設計語言。面向對象的編程思想力圖使對計算機語言中對事物的的描述與現實世界中該事物的本來面目盡可能的一致面向對象程序設計是使用類和對象將現實世界中真實的或抽象的實體在程序中建立模型8 1 / 50

Java的語法機制類(class)和對象(object)是面向對象方法的核心概念。類是對一類事物描述,是抽象的、概念上的定義;對象是實際存在的該類事物的每個個體,因而也稱實例(instance)類(class)最重要、最基本的語法設施,類的定義與繼承與C++類似,主要區別:?Java不允許多重繼承,多重繼承必須通過接口實現?Java引進了abstract 和final修飾詞9直譯式語言Java與C++比較JavaC++編譯后產生機器碼跨平臺運行速度具有指針類型繼承10

接口(interface)?是一種抽象類,其中只能出現靜態常量或抽象方法定義?主要目的是實現多重繼承功能,避免C++在多重繼承語義上的復雜性?一個Java類可以實現(繼承)多個接口程序包(package)?是一些相關類或接口的集合?Java提供包括可重用類標準程序包,用戶可自定義程序包?通過import 語句將程序包引入應用程序11自動內存回收?Java取消了指針類型,所有動態內存請求均通過new運算符,并且得到的不是指針而是引用?系統自動進行內存回收多線程?語言級支持多線程,忽略操作系統多線程機制的差異,軟件具有更好的可靠性和可移植性12

Java的特性Sun公司的Java語言白皮書中指出Java的特性1.2.3.4.5.6.簡單性面向對象分布式特征健壯性直譯性結構中立性7.可移植性8.安全性9.多線程10.高性能11.動態特征Java三種核心機制?Java 虛擬機(Java Virtual Machine)?垃圾收集機制(Garbage collection)?代碼安全性檢測(Code Security)1314

Java虛擬機(Java Virtual Machine)????在一臺計算機上由軟件或硬件模擬的計算機Java虛擬機(JVM)讀取并處理經編譯過的平臺無關的字節碼class文件Java編譯器針對Java虛擬機產生_______文件,因此是獨立于平臺的Java_________負責將Java虛擬機的代碼在特定的平臺上運行15Java虛擬機(JVM)Java虛擬機規范定義了:–指令集–寄存器集:程序計數器、棧頂指針等–類文件結構–堆棧:提供各種參數等–垃圾收集堆–內存區域:存放字節碼的方法代碼、符號表16 2 / 50

Java自動垃圾收集技術(garbage collection)?不再使用的內存空間應回收?在C/C++等語言中,由負責回收無用內存?垃圾收集在Java程序運行過程中自動進行,程序員無法精確控制和干預?Java語言解除了程序員回收無用內存空間的責任。它提供一種系統級線程跟蹤存儲空間的分配情況。并在JVM的空閑時,檢查并釋放那些可被釋放的存儲器空間17Java代碼安全性檢測?三級代碼安全檢查–驗證:在類下載時完成,檢查從哪里下載文件,是否有權限進到本機系統–字節碼校驗:分析下載的字節碼是否合乎規則–跟蹤監測:執行時安全管理器始終監測所執行的每步操作,檢查其合法性18

Java運行環境安裝及配置Java開發工具集JDK(Java Development Kits)–Java編譯器–Java運行時解釋器–Java應用程序編程接口–Java文檔化化工具–其它工具及資源19設置環境變量?Path 外部命令搜索路徑?CLASSPATH類資源位置搜索路徑20

安裝后的目錄結構21Java 程序分類?Java Application以main()方法作為程序入口,由Java解釋器加載執行?Java Applet沒有main()方法作為程序入口,可由瀏覽器加載執行22

簡單Java應用程序(Application)舉例源文件:HelloWorld.javapublic class HelloWorld{ public static void main(Stringargs[]){System.out.println(“HelloWorld!”);}}23Application應用程序分析?類定義(class)Java程序的基本組成部分是類public class HelloWorld?主方法Java Application程序的入口是方法固定的書寫格式:public static void main(Stringargs[]){……}24 / 50

Application應用程序分析?源文件–Java程序的源文件擴展名必須是―‖–Java程序的源文件名必須與main()方法所在相同–Java源文件中包含多個類?程序內容–由方法體實現程序要完成的功能,方法的實現由一個個語句組成–語句以―‖作為結束標志25–大小寫Application應用程序分析?命名–如果.java 文件包含一個public 類,它必需按命名–如果一個類中含有main()方法,它必需按命名–文件名、類名大小寫?類個數–一個源文件中有多個類,但只能有一個類其它類的個數不限26

Java編譯器?javac.exe將.java文件編譯成.class字節碼文件格式javac<參數> <.java源文件名>-d <路徑> 指定存放所產生類文件路徑27Java解釋器?java.exe解釋執行.class字節碼文件格式java <.class文件> [實參表]java-jar <.jar文件> [實參表]28

Java Application 的運行?javacHelloWorld.java功能:源文件名為HelloWorld.java,由javac編譯器編譯源程序,產生字節碼文件(.class文件)?java HelloWorld功能:字節碼文件由java解釋器解釋執行29Java Applet?Applet就是使用Java語言編寫的在環境中運行?Applet類存于類的子類?它與Application的區別主要在于其不同?Application是從其中的方法開始運行的?Applet是在中運行的,必須創建一個文件,通過編寫HTML語言代碼告訴瀏覽器載入何種Applet以及如何運行30的包中,是,它可以

Java Applet–code:–height:–width:31?HelloWorld.java源程序:import java.awt.Graphics;import java.applet.Applet;public class HelloWorldextends Applet {String hw_text;public void init(){hw_text= “Hello World”;}public void paint(Graphicsg){g.drawString(hw_text, 25, 25);}}32 / 50

簡單Java應用程序(Applet)舉例編譯源文件:javacHelloWorld.java產生字節代碼:HelloWorld.classApplet 舉例?創建一個HTML文件:hello.html3334

Java數據類型劃分第2講Java語言基礎數據類型整數類型數值型(byte,short,int,long)浮點類型(float,double)基本數據類型字符型(char)邏輯(布爾)型(boolean)類(class)引用數據類型接口(interface)數組復合類型3536

邏輯型?boolean類型適于邏輯(布爾型)運算,一般用于。?boolean類型數據只允許取值true或false,不可以替代字符型?char型數據用來表示通常意義上―字符‖?字符常量是用單引號括起來的單個字符?Java字符采用占字節,因而可用編碼形式表示,每個字符進制?Java語言中還允許使用轉義字符''來將其后的字符轉變為其它的含義3738

整數類型Java各整數類型有固定的表數范圍和字段長度,而不受具體操作系統的影響,以保證Java程序的可移植性類型占用存儲空間1字節2字節4字節8字節表數范圍-128 ~ 127-215 ~ 215-1-231 ~ 231-1-263 ~ 263-1 39整數類型?整型常量的三種表示形式–十進制整數(如12,-345, 0)–八進制整數,要求以0開頭(如012,0345)–十六進制數,要求0x或0X開頭(如0x12,0X345)byteshortintlong?Java的整型常量默認為int型?聲明long型常量可以后加?l ‘或?L ‘40 / 50

浮點型Java浮點類型有固定的表數范圍和字段長度類型floatdouble占用存儲空間4字節8字節表數范圍-3.403E38~3.403E38-1.798E308~1.798E308 浮點型?Java浮點類型常量有兩種表示形式–十進制數形式,必須含有小數點–科學記數法形式?Java浮點型常量默認為double型,如要聲明一個常量為float型,則需在數字后面加f或F4142 Java引用類型?Java語言中除8種基本數據類型以外的數據類型稱為引用類型?引用類型數據以的形式存在?引用類型變量的值是某個對象的存儲地址,而不是對象本身?聲明引用類型變量時,系統只為該變量分配,并未創建。43引用類型應用舉例public class MyDate{private intday = 1;private intmonth = 1;private intyear = 2000;public MyDate(intd, intm, inty){year = y;month = m;day = d;} public void display(){System.out.println(year+ “ / ” + month + “ / ” +day);}public static void main(String[] args){MyDatem;m = new MyDate(1, 8, 2003);} }44

對象的構造和初始化對象的構造和初始化1.為引用類型變量分配引用空間MyDatem;m2.創建新對象①②4546

分配內存:new MyDate(1, 8, 2003);daymmonthyeardaymonthyeardaymonthyear473.調用所屬類的構造方法new Mydate(1, 8, 2003);public Mydate(inty, intm, intd){year = y;month = m;day = d;} mdaymonthyear默認初始化:m顯示初始化:m48 / 50

4.為引用類型變量m賦值m = new MyDate(1, 8, 2003);0x11111111默認初始化原則成員變量類型byteshortintlongcharfloatdoubleboolean所有引用類型49mdaymonthyear取值0 000L'u0000' 0.0F 0.0D false null 50

常量?常量一經建立在程序運行的整個過程中都不會改變?final標記的變量(成員變量或局部變量)即稱為常量?常量只能賦值一次,一般大寫?字符常量用引起來表示單個字符?字符串常量用引起來表示一串字符51Java變量?變量用于的數據?按所屬的數據類型劃分?基本數據類型變量?引用數據類型變量?按被聲明的位置劃分?局部變量定義的變量?成員變量定義的變量52

局部變量聲明和初始化?Java變量使用前必須先聲明和初始化(賦初值)?局部變量聲明語法格式DataTypevarName1[=value1][,varName2[=value2]…] 成員變量聲明和初始化?成員變量在中聲明?在同時創建有關的成員變量?成員變量創建后系統自動對其進行–初始化–初始化5354

變量作用域?局部變量的作用域就是它所在的方法或語句塊?在時,局部變量才被創建并,隨方法(語句塊)的,局部變量將被銷毀?成員變量依附于具有與作用域55標識符?Java語言中,為各種變量、常量、方法、對象和類等起的名字稱為標識符?Java標識符的命名規則–以字母、下劃線、美元符開頭–后跟字母、下劃線、美元符或數字?Java標識符大小寫敏感,長度無限制?標識符在命名時,應在一定程度上反映所表示的變量、常量、方法、對象和類的意義56存在,相同的生存期和 / 50

Java 編碼慣例??????包名類名接口名方法名變量名常量名package date.newdateclass IOExceptioninterface RunnableaMethod()aNewWordPIMAX_SIZE57關鍵字?關鍵字(keyword):Java中一些賦以特定的含義、并用做專門用途的單詞?所有Java關鍵字都是的,true、false、null等都不是Java關鍵字?goto和const 雖然從未使用,但也作被為Java關鍵字保留58

Java 分隔符作用?Java語句必須以分號作為結束標記?Java語句中逗號分隔方法的參數和變量的說明?Java語句中冒號說明語句標號?Java允許用花括號―{}‖將一組語句括起來,形成一個語句塊(block)?Java程序源代碼中各組成部分之間可以插入任意數量的空格,包括換行59Java 分隔符Java語句塊(block)用法–定義類時類體必須采用語句塊形式–定義方法時方法體必須采用語句塊的形式–定義循環語句時,循環體可以語句塊的形式,采用將0~多條語句集合到一起,作為一個整體進行處理–語句塊可以嵌套,嵌套層數無限制60

Java運算符與表達式與C不同之處:?Java是強類型語言,類型限制比C嚴格,運算符的操作對象的類型會受到更多限制?Java不提供指針運算符,增加了對象操作符instanceof,字符串運算符+和零填充的右移>>>等61算術運算符算術運算符功能+ 加-減* 乘/ 除% 取余++ 前(/后)加1--前(/后)減162

邏輯運算符邏輯運算符!邏輯非& 邏輯與| 邏輯或^ 邏輯異或&& 短路與|| 短路或6364短路邏輯運算符&& 第一個操作數為假則不判斷第二個操作數|| 第一個操作數為真則不判斷第二個操作數 8 / 50

移位運算符位運算符位運算符功能~--取反&--按位與|--按位或^--按位異或65左移–―a<>b;‖將二進制形式的a逐位右移b位,最高位空出的b位補原來的符號位無符號右移–―a>>>b;‖將二進制形式的a逐位右移b位,最高位空出的b位補066

運算符?賦值運算符: = ?擴展賦值運算符:+=,―=,*=,/=,/=,%=,&=,|=,^=,<<=,>>=,>>>=?字符串連接運算符: + ?其它運算符:?:,[],.,(),(type),new,instanceof(對象操作符)67擴展賦值運算符運算符+=-=*=/=%=&=|=^=<<=>>=>>>=用法舉例a += ba-= ba *= ba /= ba %= ba &= ba |= ba ^= ba <<= ba >>= ba >>>= b等效的表達式a = a+ba = a-ba = a*ba = a/ba = a%ba = a&ba = a|ba = a^ba = a<>ba = a>>>b68

字符串連接運算符?―+‖除用于算術加法運算外,還可用于對字符串進行連接操作inti = 300 +7;String s = ―hello, ‖+ ―world!‖?―+‖運算符兩側的操作數中只要有一個是字符串(String)類型,系統會自動將另一個操作數轉換為字符串然后再進行連接inti = 300 +7;String s = ―hello, ‖+ i + ―號‖;System.out.println(s);//輸出:hello, 307號69其它運算符操作符?:[][][].()(type)new格式op1 ? op2 : op3描述如op1 是true, 返回op2,否則返op3數組聲明s創建op1 個元素的數組訪問op1數組的索引為op2 的元素引用op1對象的成員op2方法調用強制類型轉換創建對象或數組70type []type[ op1 ]op1[ op2 ]op1.op2op1(params)(type)op1new op1instanceofop1 instanceofop2如果op1 是op2的實例,則返回true

強制類型轉換?強制類型轉換形式:(type)表達式例:intx=15;float f =(float)x/2;?Java對于數據類型所占用空間大小有嚴格規定,因此在進行數據類型轉換時可能因為內存空間的改變而影響變量值?轉換時,盡量由所占內存空間小的轉換成內存空間大的71強制類型轉換對強制類型轉換的限制:?整型與浮點型相互轉換?基本類型和數組、對象等復合類型之間互相轉換72 / 50

表達式?表達式是符合一定語法規則的運算符和操作數的序列?表達式的類型和值–對表達式中操作數進行運算得到的結果稱為表達式的值–表達式的值的數據類型即為表達式的類型?表達式的運算順序–首先應按照運算符的優先級從高到低的順序進行–優先級相同的運算符按照事先約定的結合方向進行73數組?數組是多個相同類型數據的有序的組合,實現對這些數據的統一管理?數組屬引用數據類型,數組型數據是對象(object),數組中的每個元素相當于該對象的成員變量?數組中的元素可以是任何數據類型,包括基本類型和引用類型?數組要經過聲明(定義)、分配存儲空間、賦值后才能被使用74

數組的特征1.數組中每個元素的數據類型都是相同的2.數組中的各個元素是有順序的3.所有元素公用一個數組名4.數組名和數組下標唯一確定數組中每個元素的位置75一維數組聲明一維數組的聲明方式:type var[];或type[] var;例如:inta[];int[] b;double d[];MyDate[] md;?Java語言中聲明數組時不能指定其長度(數組中元素的個數)76

數組初始化靜態初始化:在定義數組的同時就為數組元素分配空間并賦值動態初始化:數組定義與為數組元素分配空間并賦值的操作分開進行77數組元素的默認初始化數組是類型,它的元素相當于,因此數組一經分配空間,其中的每個元素也被按照成員變量同樣的方式被隱式初始化。78

數組元素的引用?定義并用運算符new為之分配空間后,才可以引用數組中的每個元素?數組元素的引用方式arrayName[index]a[0]a[1]a[2]多維數組inta[][] = {{1,2},{3,4,5,6},{7,8,9}};12a[0][0]a[0][1]345789a[2][0]a[2][1]a[2][2]80a[1][0]a[1][1]a[1][2]a[1][3]–index為數組元素下標,可以是整型常量或整型表達式,如a[3],b[i],c[6*i]–數組元素下標從開始。79a6–長度為n的數組合法下標取值范圍是?每個數組都有一個length屬性表示數組的長度 / 50

多維數組?Java中多維數組被做為數組的數組處理?Java中多維數組的聲明和初始化應按從高維到低維的順序進行?Java中多維數組不必須是規則矩陣形式inttwoDim[][] = new int[4][];twoDim[0] = new int[5];twoDim[1] = new int[5];inttwoDim[][] = new int[][4];8182inttwoDim[][] = new int[4][5];tweDim[0][1][2][3]

復制數組java.lang.System類的arraycopy()方法提供了數組元素復制功能?源數組intsour [ ] = { 11, 12, 13, 14, 15,16 };?目的數組intdest[ ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };?復制源數組中的所有元素到目的數組,從下標0的位置開始存儲System.arraycopy(sour,0,dest,2,sour.length);83第3講Java語言的結構化程序設計84

Java程序結構import java.applet.Applet;import java.awt.*;public class GetSextends Applet{Label label;Java包引入語句類聲明語句成員變量Init方法paint方法Java程序結構?Java源程序是由類定義組成的,每個程序可以定義若干個類,但是只有一個類是主類–Java Application:包含main方法的類–Java Applet:Applet類的子類public void init(){label1=new Label(“前30個數的平方”);add(label1);}}public void paint(Graphicsg){for(inti=0;i<30;i++){intx=i%10, y=i/10;循g.drawString(String.valueOf((i+1)*(i+1)),環20+30*x,50+25*y);}}類體8586

Java程序結構Java程序中定義類使用關鍵字class,每個類定義由類頭定義和類體定義兩部分組成–類頭部分用來聲明類名和說明類的繼承特性–類體部分用來定義靜態屬性和方法87語句?表達式語句(expression statements)?聲明語句(declaration statement)?程序流控制語句(control flow statement)88 / 50

表達式語句將表達式后綴以―;‖,構成表達式語句?賦值語句?增量語句(使用++ 或--)?方法調用語句?對象創建語句aValue= 8933.234;//賦值語句aValue++;//增量語句System.out.println(aValue);//方法調用語句integerObject= new Integer(4);//對象創建語句89語句塊?由―{ }‖括起來的0個或多個語句組成?可以出現在任何單個語句可以出現的位置?在流程控制語句中,即使只有一條語句也最好使用語句塊90 程序流程控制?if …else ?switch ?for?while?do …while分支語句分支語句實現程序流程控制的功能,即根據一定的條件有選擇地執行或跳過特定的語句Java分支語句分類–if-else 語句–switch 語句9192

if-else語句語法格式if(boolean類型表達式){語句或語句塊;}if(boolean類型表達式){語句或語句塊;} else if(boolean類型表達式){語句或語句塊;} else {語句或語句塊;}switch語句語法格式switch(exp){case const1:statement1;break;case const2:statement2;break;……case constN:statementN;break;[default:statement_dafault;break;]} 9394

循環語句功能–在循環條件滿足的情況下,反復執行特定代碼循環語句分類–for 循環–while 循環–do/while 循環循環語句的四個組成部分–初始化部分(init_statement)–循環條件部分(test_exp)–循環體部分(body_statement)–迭代部分(alter_statement)95循環語句for 循環語句語法格式for(init_statement;test_exp;alter_statement){body_statement}96 / 50

while/do while 循環語句語法格式while循環:[init_statement]while(test_exp){body_statement;[alter_statement;]}特殊流程控制語句break 語句–break語句用于終止某個語句塊的執行{ ……break;……}do while循環:[init_statement]do{body_statement;[alter_statement;]}while(test_exp);–break語句出現在多層嵌套的語句塊中時,可以通過標簽指明要終止的是哪一層語句塊9798

特殊流程控制語句continue 語句–continue語句用于跳過某個循環語句塊的一次執行–continue語句出現在多層嵌套的循環語句體中時,可以通過標簽指明要跳過的是哪一層循環99第4講面向對象軟件開發基礎100

對象?對象是面向對象技術的核心所在,以面向對象觀點看來,所有面向對象的程序都是由對象來組成的?面向對象技術中的對象就是現實世界中某個具體的物理實體在計算機邏輯中的映射和體現101類?類是面向對象技術中一個非常重要的概念。簡單的說,類是同種對象的集合和抽象102

面向對象技術的設計思想?傳統程序設計思想:–把現實世界中的問題抽象成計算機可以理解和處理的數據結構,即讓現實世界向計算機世界靠攏對象的狀態?對象的狀態又稱為對象的屬性,主要指對象內部所包含的各種信息即變量?一個對象的狀態是它反映于現實世界的一系列屬性–參數的數值(與對象有關系的數據)–與其它對象的關系–任一時刻的歷史狀態104?面向對象技術關鍵設計思想:–讓計算機邏輯來模擬現實世界的物理存在,即讓計算機世界向現實世界靠攏103 / 50

對象的行為?對象的行為又稱為對象的操作,主要表述對象的動態屬性,操作的作用是設置或改變對象的狀態?對象的操作一般是基于對象的屬性,并意圖改變這些屬性?對象的狀態也會影響對象的行為?定義當其它對象發出請求時,該對象如何反應?由為對象定義的一系列操作決定105對象的標識?用程序中的對象名表示?每一個對象都有一個唯一的標識, 即使其狀態有可能與其它對象一樣106

對象的屬性?狀態→屬性→變量?行為→操作→方法?標志→標識→對象名????面向對象軟件開發面向對象的分析階段面向對象的設計階段實現階段維護階段107108

面向對象程序設計方法的特點????抽象封裝多態繼承抽象?科學研究的方法,去掉被研究對象中與主旨無關的次要的部分,或暫時不考慮的部分,僅僅抽取出與研究工作有關的實質性的內容加以考慮–過程抽象–數據抽象109110

封裝抽象數據類型?在面向對象語言中,在數據類型的聲明與操作這些數據的代碼聲明之間建立緊密聯系,這種聯系通常描述為一種抽象數據類型?Java用類來實現抽象數據類型的概念?利用抽象數據類型將數據和基于數據的操作封裝在一起,數據被保護在抽象數據類型的內部,系統的其它部分只有通過包裹在數據外部被授權的操作,才能與這個抽象數據類型交流和交互?在Java中抽象數據類型用―類‖這種面向對象工具可理解和操縱的結構來代表,每個類都封裝了相關的數據和操作?保證數據的完整性和安全性?使用抽象數據類型提高可重用性111112 / 50

繼承?存在于面向對象程序的兩個類之間的一種關系,當一個類擁有另一個類的所有數據和操作時,就稱這兩個類之間具有繼承關系?被繼承的類稱為父類和超類?繼承的類稱為子類?一個父類可以同時擁有多個子類?每個子類都唯一擁有一個直接父類113面向對象概念?對象和類–類把數據和對數據的操作封裝在一起–對象是類的實例,實際操作的是對象?對象的描述–靜態結構(自身)共同構成–組織結構(空間位置)對對象的–生存狀態(時間位置)全息描述114

?利用繼承,提高代碼質量,靈活性?類庫管理的代價?領域分析的代價?學習的代價?利用封裝,提高代碼的安全性?管理的代價?利用多態,提高代碼的可讀性和設計靈活性116面向對象思想的本質????模擬現實,對現實系統的直接模擬越完善的模擬,越接近實際模擬建立在分析的基礎上模擬建立在層次的基礎上,可以層層遞進?通過正常和異常處理機制,完成處理流程面向對象的機制115

類的概念第5講Java面向對象編程基礎?類是現實世界中實體的,是封裝了的復雜的抽象數據類型,類具有完整的和相對的,可以包含豐富的內涵、更好的安全性和更大的功能?定義類的過程就是定義類的的過程–類的屬性就是類的靜態屬性的簡稱–類的服務則被稱為成員函數或方法?類包括生命周期中的要用到的所有代碼,構造方法、變量和方法的聲明等?類中直接聲明的變量(屬性)稱為變量,118方法稱為方法117

類的語法結構[修飾符] class 類名[extends 父類] [implements 接口名]{類成員變量聲明;類構造方法聲明;類方法聲明;}例:class TestClass{String name;intage;String department;public TestClass(){ }void print(){System.out.println(name+“is”+ age +“at”+department);} 119}聲明類頭?父類名?接口名?修飾符–訪問控制符–抽象類說明符–最終類說明符120 / 50

聲明類體類的屬性–基本數據類型[修飾符] 變量類型變量名[=變量初值];–引用數據類型[修飾符] 類名對象名[=new 類名(實參表)];?屬性是類的特征或特性?屬性的值是某一特定對象的屬性值?在類中屬性名必須是唯一的?每一個類的實例都存有為這個類定義的所有屬性的值121對象生命周期?_________對象?_________對象?______________對象122

創建對象創建對象的三個步驟???Employee e = newEmployee(“LiSi”,40,“Java Department”);123對象的回收?垃圾收集機制(garbage collection):Java運行環境當確定某個對象不再被使用時,將其。一個對象在沒有指向它時,可作為垃圾收集?垃圾搜集器:Java運行環境中的垃圾搜集器地釋放不用對象占用的空間124

聲明類體?類的方法–稱為成員方法,用來規定操作,實現機制,是類與外界進行的窗口[修飾符] 返回值類型方法名(參數列表)throws 例外名表{關鍵字static?static稱為修飾符時,?在Java類中聲明可使用關鍵字static做為修飾符方法體} ?類的方法作用–圍繞著類的屬性進行各種操作–與其他的類或對象進行數據交流、信息傳遞等操作125?static標記的屬性或方法由共享,如訪問控制權限允許,可不必創建該類的而直接用調用?static成員也稱類成員或靜態成員,如:類屬性、靜態屬性、類方法、靜態方法等126

類屬性?被static 修飾的屬性稱為靜態屬性或類屬性?類屬性是類的屬性,任何一個類的具體對象,即對于該類的任何一個具體對象而言,類屬性是一個,任何一個對象訪問或修改它,都是針對同一。?類屬性由該類的所有共享127類屬性?類屬性在加載該類時,只分配一次并。?類屬性可以由或,修飾?對于修飾的類屬性,可以在類外直接用類名調用而不需要初始化128 / 50

類方法?在方法前加入static標識符,即為類方法?類方法是屬于?類方法可以在不產生以來調用的方法的情況下直接類方法?在類方法內部不能對方法進行訪問?在類方法內部不能使用?this表示調用關鍵字的對象,而類方法變量和?非static 的方法是屬于某個對象的方法,在這個對象時對象的方法在內存中擁有的代碼段?static 方法只能處理的成員屬性129不需要利用對象進行調用130

靜態初始化器?由關鍵字static引導的語句塊(語句組)?存在類的中、的外部靜態初始化器與構造方法?構造方法是始化,靜態初始化器對始化初初?static塊通常用于初始化static(類)屬性?static語句塊僅在其所屬的類被載入時執行一次131?構造方法在時由系統自動執行,靜態初始化器是在其時由系統調用運行?靜態初始化器方法132

抽象類關鍵字abstract?abstract 是修飾符類方法?含有抽象方法的類必須被聲明為_______,并在類定義關鍵字class前加入_________修飾符。?抽象類必須_________,抽象方法必須_____________。?抽象類不能被實例化,一般可以利用其_________類的實例進行實例化操作。abstractclass Employee{abstractvoid raiseSalary(inti);}133134?加入abstract的類稱為?加入abstract的方法稱為

抽象方法?一個方法只有部分而沒有方法的,該方法叫做抽象方法?抽象方法必須用?抽象方法必須以束標志來修飾作為結?final是?final可以修飾關鍵字final修飾符;;類;方法;?final修飾的類稱為?final修飾的方法稱為abstractclass Employee{abstractvoid raiseSalary(inti);}class Manager extendsEmployee{void raiseSalary(inti){ ….}} ?final修飾的變量(成員變量和局部變量)稱為;?final標記的類不能被135。136?final標記的方法不能被 / 50

終結器關鍵字final?final標記的成員變量必須在或在中顯式賦值,然后才能使用?常量只能賦值,一般寫?在面向對象程序設計中,對象與單純的變量一樣,有其產生和消亡的過程,當一個對象不再有用時應該回收它(釋放其所占用及其他)?終結器是的方法?終結器無參數列表和返回值?由系統自動調用?終結器的調用時刻取決于系統的垃圾回收線程protected void finalize(){System.out.println(toString());}137138final intPI = 3.1415927;?被定義成final的類不能有類

訪問控制修飾符在對Java類中定義的屬性和方法進行訪問時,可以通過不同的訪問控制修飾符規定不同的訪問等級Modiferprivatedefaultprotectedpublic同一類同一個包YesYesYesYesYesYesYesYesYesYes139140關鍵字volatile?關鍵字volatile修飾的屬性可以同時被幾個線程所控制和修改?關鍵字volatile用來修飾接受外部輸入的屬性子類其它

關鍵字native?關鍵字native用來聲明用其他語言書寫方法體并具體實現方法功能的特殊方法native double addMethod(intx,inty);關鍵字synchronized?用于多線程共存的程序中的協調和同步?修飾類方法,調用前將當前類的對象加鎖?修飾普通方法,調用前將調用方法的對象加鎖142141

修飾符的混合使用?abstact不能與final并列修飾同一個類?abstact不能與private、static、native或final并列修飾同一個方法?abstact類中不能有private的成員(包括屬性和方法)?abstact方法必須在abstact類中?static方法中不能處理非static的屬性143第6講深入面向對象程序設計144 / 50

類的繼承?類是所有Java類的最高層父類。繼承,不允許類。類。,達145類的繼承?子類繼承父類的屬性、方法?子類中只需聲明的東西?父類中帶private 修飾符的屬性、方法被繼承,子類從父類繼承所有屬性和方法作為自己的成員?構造方法被繼承146?Java只支持一個一個繼承。類只能有一個類可以繼承出多個?一個類通過實現到多繼承效果。

類的繼承?在方法中調用構造方法用?調用父類的構造方法用;;關鍵字this?Java中為解決變量的命名沖突和不確定性問題,引入關鍵字―this‖?this代表?this在構造方法中指?this在普通方法中指?Java中任何一個類的實例都可作為類的實例使用,可調用類具有的方法Employee [ ] e= new Employee[200];e[0] = new Manager();e[1] = new Worker();e[2] = new Employee();?―this.屬性‖和―this.方法‖表示調用147?―this()‖表示調用148

屬性的繼承?子類可以繼承父類屬性,而這些屬性是所有子類都擁有的屬性的集合Employee+name : String +salary : double+birthDate: Date+getDetails(): StringManager+department : StringEngineer+project : String屬性的隱藏?屬性隱藏:?子類Child繼承父類Parent中非私有屬性變量,且子類定義了與父類同名的屬性變量,子類中擁有兩個同名的變量,即出現了子類變量對父類同名變量的隱藏?當子類執行理來自父類的變量149的方法時,處的方法時,處150?當子類執行理自己定義的變量

方法的重寫(覆蓋)方法的繼承?子類可以繼承父類的非私有的方法Employee+name : String +salary : double+birthDate: Date+getName(): StringManager+department : String+getDepartment():StringEngineer+project : String+getProject():String151?概念:?重寫的方法在調用時,使用類名或所屬類的對象名?重寫方法必須和被重寫方法具有相同的、列表和類型?重寫方法不能使用比被重寫方法更嚴格的,即方法的不能縮小?不能拋出新的例外152 / 50

方法重寫與屬性隱藏子類變量隱藏父類的屬性變量–子類繼承的同名屬性在子類對象中仍然存在,并占用獨立的內存空間–子類對象直接調用的是子類中自定義的同名屬性子類方法對父類方法的重寫–清除父類方法占用內存空間153方法的重載在同一個類中一個方法名被用來定義多個方法?參數列表?返回類型?修飾符154

指代關鍵字?Java系統默認,每個類都缺省地具有null、this和super三個量,可以直接引用–null:–this:–super:155this關鍵字?this表示的是,即this代表一個引用?利用this可以訪問、修改的屬性、調用的方法156

this關鍵字?調用當前對象所屬類的屬性和方法this.屬性名this.方法名?調用當前對象所屬類的構造方法this(參數列表)157super 關鍵字?super表示的是當前對象的直接父類對象,是當前對象的直接父類對象的引用?super可用于訪問的屬性?super可用于調用的成員方法?super可用于在構造方法中調用的構造方法?super的追溯不僅于直接父類158

super關鍵字?調用父類對象的屬性和方法super.屬性名super.方法名?調用父類對象的構造方法super(參數列表)159構造方法?用于在創建所屬類的對象時,由系統自動調用該類的構造方法為新對象初始化?構造方法無返回值?構造方法名與類名相同160 / 50

構造方法重載構造方法重載,參數列表必須。可以在構造方法的行使用this關鍵字調用其它(重載)的構造方法調用父類構造方法?在子類的構造方法中調用父類的構造方法可使用語句?如果子類的構造方法中沒有地調用父類構造方法,也沒有使用關鍵字調用重載的其它構造方法,則系統默認調用父類的構造方法?如果子類構造方法中既未父類構造方法,而父類中又沒有構造方法,則編譯出錯161調用的162

構造方法的繼承?子類繼承父類所有的成員變量和成員方法,但不繼承父類的構造方法在一個Java類中可以通過兩種方式獲得構造方法1.使用系統默認的無參構造方法2.顯式定義一個或多個構造方法163構造方法的繼承?如果子類沒有自定義構造方法,則繼承父類的構造方法?如果子類自定義了構造方法,創建新對象時,先執行構造方法,再執行構造方法?對于父類中有參數的構造方法,子類可以在自己的構造方法中利用調用,該語句必須是構造方法的可執行語句164?

對象構造和初始化細節1.綁定構造方法參數2.如有this()調用,則調用相應的重載構造方法3.顯式或隱式追溯調用父類的構造方法(Object類除外)4.進行實例變量的顯式初始化操作5.執行當前構造方法的方法體165多態性?在Java中,類的對象可以替代類的對象使用?一個對象確定的數據類型?一個引用類型變量指向(引用)類型的對象例如:Employee employee= new Manager();Object o = new Employee();o = new Manger();166

多態性多態的兩種表現形式?重載定義:?一個引用類型變量如果聲明為父類的類型,但實際引用的是子類對象,那么該變量訪問子類中添加的屬性和方法?重寫定義:?方法聲明的參數類型為父類類型,可以使用作為實參調用該方法167168 / 50

父類對象和子類對象的轉換?子類對象可以視為是其父類的一個對象?父類對象不能作為某個子類的對象?通過參數的傳遞可以將一個子類對象作為實參傳遞給父類對象的形參?父類的實例對象實際上是其某個子類實例對象時,可以通過強制類型轉換將父類的實例對象恢復為子類實例對象強制類型轉換對Java對象的強制類型轉換稱為造型–在造型前可以使用instanceof操作符測試一個對象的類型–從子類到父類的類型轉換可以自動進行–從父類到子類的類型轉換必須通過造型(強制類型轉換)實現–無繼承關系的引用類型間的轉換是非法的170169

接口?定義:?接口是一種和方法的方法的類,其中只包含,而沒有和。的,所。實?一個接口中所有成員方法都是有的成員變量都被定義為?接口類層次結構,不相關的類現相同的接口?接口是義的集合和的定171?多個無關的類?一個類?接口與實現類之間實現同一個接口實現多個無關的接口多態性172

接口的聲明[public] interface 接口名[extends 父接口名列表]{ [public][static][final]屬性類型常量名=常量值;[public][abstract]返回值方法名(參數列表)[throw 異常列表];}實現接口<訪問控制> class 實現類[extends 父類名][implements 接口名[,接口名]*] {類體}173174

接口?可以通過實現接口實現多重繼承:一個類可繼承父類,并實現接口?一個接口可作為類名使用,實現多態?一個接口可以作為一種數據類型使用,實現多態接口用法總結?通過接口可以實現?通過接口可以指明?通過接口可以了解175176 / 50

包?包(package)是集合,它提供與的一個管理創建包格式:package 包名用package語句指定源文件中的類屬于一個特定包?包定義語句在每個源程序中即一個類包?包定義語句必須在程序的可有空格及注釋)?包名用―‖分隔177178?Java平臺中的類與接口都是根據功能以包組織的?包機制的好處:條,行(之前

創建包?在缺省情況下,系統會為.java源文件創建一個包,該.java源文件中定義的所有類都隸屬于這個包,這些類之間相互引用,被其它包所引用package fly;public class Airplane extends Machine implements Fly{...}179包的引用?對于同一包中的其它類,需在要使用的屬性和方法名前加上作為前綴?對于其它包中的類,則需要在類名前加上前綴?只有類型的成員才能被包外的類訪問,訪問要通過以下方法:?使用長名引用包成員?引入包成員?引入整個包180

?當要使用另一個包中的類,而該包并沒有引入,則必須使用長名引用該類import 語句將package 引入源程序,格式:import 包名.*;import 包名.類名;[package …..][import ….][類聲明…]...?import 語句必須在源程序前,在package 后?import 語句缺省是“import java.lang.*;”181182?可以先引入包中的指定類或整個包,再使用該類,這時可以使用短名

編程中的錯誤?錯誤是編程中不可避免和必須要處理的問題,編程人員和編程工具處理錯誤能力在很大程度上影響著編程工作的效率和質量?錯誤分為錯誤和錯誤183?編譯錯誤是由于所編寫的程序存在語法問題,未能通過從源代碼到目標代碼的編譯過程而產生的,它是由語言的編譯系統負責檢測和報告?運行錯誤是在程序的運行過程中產生的錯誤。根據性質不同,可分為系統運行錯誤和邏輯運行錯誤。–系統運行錯誤:程序在執行過程中引發了操作系統的問題–邏輯運行錯誤:程序不能實現編程人員的設計意圖和設計功能而產生的錯誤184 / 50

異常和異常類?異常又稱為例外或違例,是特殊的運行錯誤對象,對應于Java語言特定的運行錯誤機制。一個異常就是其相對異常類的對象。Java中定義了很多異常類,每個異常類都代表了,類中包含了該等內容。185異常處理機制每當Java程序運行過程中發生一個可識別的運行錯誤時,即該錯誤有一個異常類與之相對應時,系統都會產生一個相應的該異常類的對象,即產生一個異常。一旦一個異常對象產生了,系統中就一定有相應的機制來處理它,確保不會產生死機、死循環或其他對操作系統的損害,從而保證了整個程序運行的安全性。186

異常的類型異常來表明出錯的優點–將處理出錯的代碼與正常的代碼分開–提供了一種針對特定錯誤作出強制響應的辦法?異常總是類?所有的標準異常都由接子類涵蓋,分別為包中的標準的一些子類對象類的兩個直和類?這些類自身都有子類可以識別特定的異常情況188187

異常類的結構與組成ThrowableErrorAWTErrorLinkageErrorVirtualMachineError……ExceptionRuntimeExceptionClassNotFoundExceptionIOExceptionInterruptedException……189違例(Exception類)?Exception違例(例外)類,是Java異常類的父類,是其它因編程錯誤或偶然的外在因素導致的一般性問題?構造函數public Exception()public Exception(Strings)190

違例(Exception類)對于Exception類的子類表示的幾乎所有異常,如果生成這些異常,在程序中必須處理它們,處理方法為:––191系統定義的運行異常Exception類有若干子類,每一個子類代表了一種特定的運行時錯誤。這些子類有些是系統事先定義好并包含在Java類庫中的通常對應系統運行錯誤。由于這種錯誤可能導致操作系統錯誤甚至整個系統的癱瘓,所以需要定義異常類來特別處理192 / 50

異常處理異常類的結構與組成ExceptionRuntimeExceptionArithmeticExceptionIndexOutOfBoundsExceptionNullPointerException……IOExceptionUnknownHostExceptionMalformedURLExceptionSocketException……193?Java中的異常(exception)是當程序中出現不同尋常的情況時生成的一個對象?這種異常對象有相關的數據成員存儲著故障的情況,一般稱異常,也就是。?該異常對象可以作為,傳遞給專門為處理相關問題而編寫的程序代碼,接收異常對象作為的代碼稱為了異常?如果Java運行時系統找不到可以捕獲異常的方法,則運行時系統將,相應的Java194程序也將。

拋出異常?所有系統定義的運行異常都可以由系統自動拋出import java.io.*;public class ExceptionTest{public static void main(String[] args){String teachers[]={“liu”,“zhang”,“wang”};for(inti=0;i<5;i++){System.out.println(teachers[i]);}System.out.println(“nthisis the end”);}}195捕獲違例?當一個異常被拋出時,應該有專門的語句來接收這個被拋出的異常對象,這個過程稱為捕獲違例或捕捉異常?當一個異常對象被捕獲或接收后,用戶程序就會發生流程的跳轉,系統終止當前的流程而跳轉至專門的異常處理語句塊,或直接跳出當前程序和Java虛擬機回到操作系統196

捕獲違例捕獲異常是通過try-catch-finally語句實現try{......}catch(ExceptionName1 e){......}catch(ExceptionName2 e){......} [ finally{......} ]197捕獲違例?getMessage()方法用來得到有關異常事件的信息?printStackTrace()方法用來跟蹤異常事件發生時執行堆棧的內容198

捕獲違例一個異常對象能否被一個catch語句塊所接收,主要看該異常對象與catch塊的異常參數的匹配情況:–異常對象與形參屬于相同的異常類–異常對象屬于形參異常類的子類–異常對象實現了形參所定義的接口199聲明拋出違例?一個方法中的語句在執行時,可能生成某種違例,但是并不能確定如何處理這種違例,則此方法。?表明該方法將不對這些違例進行處理,而由該方法的負責處理。public void readDatabaseFile(Stringfile)throws FileNotFoundException{……FileInputStreamfis= new FileInputStream(file);..……}200 / 50

?重寫方法不能拋出比被重寫方法范圍更大的違例類型public class TestA{public void methodA()throws RuntimeException{……}}public class TestB1 extends TestA{public void methodA()throws ArithmeticException{……}}public class TestB2 extends TestA{public void methodA()throws Exception {……}201}拋出違例?首先要生成,然后通過語句實現拋出操作(提交給Java運行環境)throw new IOException();?可以拋棄的例外必須是或其子類的實例。下面的語句在編譯時將會產生語法錯誤:throw new String(“throwException”);?如果一個例外在返回到main()時還未被處理,則程序將終止202

創建自定義異常?系統定義的異常主要用來處理系統可以預見的較為常見的運行錯誤,對于某個應用所特有的運行錯誤,則需要編程人員根據程序的特殊邏輯在用戶程序里自己創建用戶自定義的異常類和異常對象?這種用戶自定義異常主要用來處理用戶程序中特定的邏輯運行錯誤?用戶自定義的所有異常類都是Exception的子類203第7講常用類庫204

Java類庫?Java程序是由組成的,編寫Java程序就是設計和確定它們的過程,一旦及其之間關系確定了,程序運行中各種可能的狀態和狀態轉化原則也就確定了?根據實現功能不同,將系統標準類劃分成不同的集合,每個集合是一個,合稱為類庫?類庫是Java編程的,它可以幫助開發者方便、快捷地開發Java程序205Java 核心類包?java.lang──包含一些Java語言的核心類,包含了運行Java程序必不可少的系統類?java.io──是Java語言的標準輸入/輸出類庫,包含實現Java程序與操作系統、用戶界面以及其他Java程序做數據交互所使用的類?java.util──包含一些實用工具類?java.awt──包含了構成抽象窗口工具集(AWT)的多個類,這些類被用來構建和管理應用程序的圖形用戶界面(GUI)?java.applet──包含applet運行所需的一些類?java.net──用來實現網絡功能的類庫?java.util.zip──用來實現文件壓縮功能?java.awt.event──用于事件處理的類庫?java.sql──用于實現JDBC的類庫,使用該包可以206使Java程序具有訪問不同種類的數據庫功能

Object 類?Object類是所有Java類的類?Object定義了所有對象都需要的狀態和行為。如對象之間的比較、將對象轉換為字符串、等待某個條件變量、當某條件變量改變時通知相關對象以及返回對象的類?如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為類207Object 類主要方法?protected Object clone()生成當前對象的一個拷貝,并返回這個復制對象?public booleanequals(Objectobj)比較兩個對象是否相同?public final Class getClass()獲取當前對象所屬的類信息,返回Class對象?protected void finalize()定義回收當前對象時所需完成的清理工作?public String toString()返回當前對象本身的有關信息,按字符串對象返回208 / 50

==操作符與equals方法?比較原則:引用類型數據比較引用基本類型數據比較數據值?equals()方法只能比較引用類型?―==‖可以比較引用類型及基本類型特例:?當用equals()方法進行比較時,?用―==‖進行比較時,209210

toString方法?toString()方法在Object類中定義,其返回值是類型,描述當前對象的有關信息,內容因具體的對象而異?在進行String與其它類型數據的連接操作時,自動調用了對應的toString()方法將其它類型數據轉換為String類型?可以根據需要在用戶自定義類中該toString()方法211數據類型類(封裝類)針對八種基本定義相應的引用類型基本數據類型booleanbyteshortintlongcharfloatdoubleByteShortIntegerLongCharacterFloatDouble212封裝類Boolean

Math類?用來完成一些常用的數學運算,提供了若干實現不同標準數學函數的方法,這些方法均是static的類方法?存于java.lang包?是Object類的直接子類常用Math類方法public final static double E;數學常量epublic final static double PI;圓周率常量public static double abs(doublea);絕對值public static double max(doublea,doubleb);最大值public static double log(doublea);自然對數public static double rint(doublea);四舍五入public static double random();0~1間隨機數213214

System類?System類?public static void exit(intstatus);err;in;out;System類的屬性有三個:?public static void gc();例:char c=System.in.read();System.out.println(“Hello!”);215216 / 50

向標準輸出寫出數據System.out/System.err的println/print方法?println方法從標準輸入讀取數據標準輸入System.in?print方法217218

import java.io.*;public class KeyboardInput{public static void main(String args[]){String s;InputStreamReaderir=new InputStreamReader(System.in);BufferedReaderin = new BufferedReader(ir);try{s = in.readLine();while(!s.equals(“")){ System.out.println(”Read: “ + s);s = in.readLine();}in.close();} catch(IOExceptione){e.printStackTrace();}}219}系統屬性?在Java中,系統屬性起到替代環境變量的作用(環境變量是平臺的)?可使用System.()方法獲得一個Properties類的對象,其中包含了所有可用的系統屬性信息?獲得特定系統屬性的屬性值,可使用System.(String name)方法220

Properties 類(java.util.Properties)?Properties類可實現import java.util.Properties;import java.util.Enumeration;public class TestProperties{public static void main(String[] args){Properties ps= System.getProperties();Enumeration pnames= ps.propertyNames();while(pnames.hasMoreElements()){String pn=(String)pnames.nextElement();String p = ps.getProperty(pn);System.out.println(pn+ ” is “ + p);}}}222????propertyNames()方法getProperty方法load方法save方法221

String 類?String類對象保存不可修改的符序列,即表示的是字符串常量字String 類常用方法?public intlength();當前對象中字符個數?public booleanstartsWith(Stringprefix);判斷當前字符串的前綴是否為指定字符子串?public booleanendsWith(Stringsuffix);判斷當前字符串的后綴是否為指定字符子串?public intindexOf(intch);查找當前字符串中指定字符第一次出現位置?public intindexOf(intch,intfromIndex)查找當前字符串中自指定位置之后,指定字符第一次出現位置224?一般情況下,一個String字符串一經創建,無論其長度還是內容,都不能修改public String()public String(Stringvalue)public String(StringBufferbuffer)public String(charvalue[ ])223 / 50

String 類常用方法?public intindexOf(Stringstr);public intindexOf(Stringstr,intfromIndex);public intlastIndexOf(Stringstr);public intlastIndexOf(stringstr,intfromIndex);在當前字符串中查找指定子串?public intcompareTo(StringanotherString);public booleanequals(ObjectanObject);public booleanequalsIgnoreCase(StringanotherString);比較兩個字符串?public String concat(Stringstr);連接字符串225StringBuffer類StringBuffer類對象保存可擴充和修改的Unicode字符序列,即字符串變量?構造方法–StringBuffer()–StringBuffer(intlength)–StringBuffer(Stringstr)226

StringBuffer類實現修改操作的方法–public StringBufferappend(類型參數名)追加操作–public StringBufferinsert(int插入位置,類型參數名)插入操作–public void setCharAt(intindex,charch)替換操作227日期類?創建日期類Date?獲取日期和時間–getYear()–getMonth()–getDate()–getDay()–getHour()–getMinutes()–getSeconds()228

日期類?比較日期和時間–booleanbefore(DatecompareDate);–booleanafter(DatecompareDate);–booleanequal(ObjectcompareDate);隨機類?隨機類Random的構造方法public Random();public Random(long seed);229230

命令行參數?任何Java應用程序都可以使用命令行參數?命令行參數被系統以的方式傳遞給應用程序中的main方法,由參數接收public static void main(String[] args)?命令行參數使用格式:java TestArgsarg1 arg2 ”another arg“231第8講圖形用戶界面232 / 50

圖形用戶界面(GUI)?GUI(Graphics User Interface)圖形用戶界面,使用圖形方式,借助菜單、按鈕等標準界面元素和鼠標操作幫助用戶更方便地向計算機系統發出命令,啟動操作,并將系統運行的結果同樣以圖形方式顯示給用戶?通過GUI 用戶和程序之間可以方便友好的進行交互?在java.awt包中包含許多支持GUI設計的類233抽象窗口工具集(AWT)?AWT(Abstract Window Toolkit)抽象窗口工具集?所謂抽象是因為Java是一種平臺語言,要求其設計的圖形用戶界面必須支持平臺。AWT類庫中的各種操作被定義在一個并不存在的―‖中進行,使得開發人員設計的界面獨立于具體的界面實現234

抽象窗口工具集(AWT)?AWT中定義了多種和,用于在Application和Applet中進行GUI設計?Java 程序要顯示的GUI 組件必須是抽象類的子類?生成GUI所需的基本元素位于兩個包中,即為java.awt包和javax.swing包?swing組件類一般都是由awt包中的基礎類派生而成的,替代了許多awt包中的類235設計和實現圖形用戶界面1.創建組成界面的2.定義GUI的事件和236

Java.lang.ObjectEventBorderLayoutFlowLayoutGridBagLayoutMenuComponentMenuBarMenuItemComponentButtonContainerpanelAppletwindowDialogFrameScrollPane237組件(Component)?Java的圖形用戶界面的最基本組成部分是組件,組件是一個可以以的方式顯示在屏幕上并能與用戶進行交互的,例如按鈕、標簽等?組件不能獨立地顯示出來,必須將組件放在一定的中才可以顯示出來?抽象類是所有Java GUI組件的共同父類,它規定了所有GUI組件的基本特性,其中定義的方法實現了作為一個GUI部件所應具備的基本功能238AWT類及層次關系

屬性設置屬性的方法setBounds(Rectangle)setBounds(int,int,int,int)setCursor(Cursor)setDropTarget(DropTarget)setEnabled(boolean)setFont(Font)setLocale(Locale)setLocation(Point)setLocation(int,int)獲取屬性的方法Color getBackground()Rectangle getBounds()Cursor getCursor()DropTargetgetDropTarget()booleanisEnabled()Font getFont()Color getForeground()Locale getLocale()Point getLocation()Point getLocationOnScreen()String getName()Dimension getSize()booleangetVisible()240組件定位?決定Java組件在容器中的位置和尺寸?如果想要人工控制組件在容器中的大小和位置,可先,然后使用組件類的下述成員方法–––239背景色setBackground(Color)邊界光標拖放使能字體地區位置前景色setForeground(Color)組件名setName(String)尺寸setSize(Dimension)可見性setVisible(boolean)/ 50

容器類(Container)?容器類(Container)實際上是類的子類,因此容器類對象本身也是一個組件,具有組件的所有性質,另外還具有容納其它組件和容器的功能?容器類是一個類,包含了所有容器組件都必須具有的屬性和方法?容器類對象可使用方法添加組件241容器類型?Window、Frame、Dialog和FileDialog是邊框的容器?Panel和Applet是容器242邊框的容器?ScrollPane:可以自動處理滾動操作的

Window類?可自由停泊的窗口,即一個Window或Window的子類都不能作為組件用add()方法添加到其他容器內部,必須獨立存在,但可以包容其他組件?Window不能作為程序的容器?Window創建的窗口默認為見,可以利用方法顯示?Window缺省為布局管理器?Window可引發類的事件和事件243Frame類?Frame類是抽象類的子類?Frame一般用于Application程序的圖形用戶界面容器?Frame是所有窗口的容器,但是可‖,有外。244?Frame不能被其他容器所以被其他容器并彈出?Frame對象顯示效果是一個―邊框,且帶有和

Frame類?默認初始化為見的,可使用setVisible()方法使之變為可見?器,可使用認布局管理器為Frame對象默認布局管理方法改變其默方法方法方法設置245?向Frame窗口中添加組件使用?從Frame窗口中移出組件使用?利用和獲取標題方法和import java.awt.*;public class FrameExample{private Frame f;public FrameExample(){f = new Frame(” The blue Frame!“);}public void launchFrame(){f.setSize(300,200);f.setBackground(Color.blue);f.setVisible(true);}public static void main(String args[]){FrameExampleguiFE=new FrameExample();guiFE.launchFrame();}}246

Panel類?Panel類對象提供容納組件的空間?Panel類對象不同的布局管理器采用和所在容器Panel類繼承層次java.lang.ObjectComponentContainerPanel247248?Panel 放在Window、Frame或Applet等容器中?Panel類對象是一塊邊框的區域?可以向Panel類對象中放入基本組件

/ 50

import java.awt.*;public class FrameWithPanel{private Frame f;private Panel pan;public FrameWithPanel(Stringtitle){f = new Frame(title);pan = new Panel();}public void go(){f.setSize(200,200);f.setBackground(Color.yellow);f.setLayout(null);pan.setSize(100,100);pan.setBackground(Color.red);f.add(pan);f.setVisible(true);}public static void main(Stringargs[]){FrameWithPanelfwp=new FrameWithPanel(”Framewith Panel“);fwp.go();}249} 布局管理器?Java語言為了使生成的圖形用戶界面具有良好的性,提供了布局管理器這個工具來管理在容器中的布局,而不使用的方式?每個容器布局管理器,當容器需要對某個組件進行定位或判斷其大小尺寸時,就會調用其對應的布局管理器250

布局管理器?FlowLayout:?BorderLayout:?GridLayout:?CardLayout:?GridBagLayout:251類默認的布局管理器類默認的布局管理器FlowLayout布局管理器設置布局管理器命令setLayout(newFlowLayout(intalign,inthgap, intvgap))?align:設置對齊方式?FlowLayout.LEFT?FlowLayout.RIGHT?FlowLayout.CENTER缺省是居中?hgap/vgap:水平間距/垂直間距,缺省值為5252

import java.awt.*;public class FlowExample{private Frame f;private Button b1;private Button b2;private Button b3;public FlowExample(){f = new Frame(”FlowLayout“);b1 = new Button(”Button1“);b2 = new Button(”b2“);b3 = new Button(”thethridButton“);}public void go(){f.setLayout(newFlowLayout());f.add(b1);f.add(b2);f.add(b3);f.setSize(100,100);// f.pack();f.setVisible(true);}public static void main(Stringargs[]){FlowExamplefe= new FlowExample();fe.go();}}FlowLayout的構造方法?new FlowLayout(FlowLayout.RIGHT,20,15);?new FlowLayout(FlowLayout.LEFT);?new FlowLayout();253254

BorderLayout布局管理器?將整個容器的布局劃分成東、西、南、北、中五個區域,組件只能被添加到指定的區域?如不指定組件的加入部位,則默認加入到區域?每個區域只能加入組件,如果加入多個組件,則。?是Frame類的默認布局管理器255BorderLayout布局管理器BorderLayout構造方法new BorderLayout()new BorderLayout(inthgap,intvgap)加入組件add(button, BorderLayout.align)256

/ 50

import java.awt.*;public class BorderExample{private Frame f;private Button bn, bs, bw, be, bc;public BorderExample(){f = new Frame(”BorderLayout“);bn= new Button(”NORTH“);bs= new Button(”SOUTH“);bw= new Button(”WEST“);be = new Button(”EAST“);bc= new Button(”CENTER“);}public void go(){f.add(bn, BorderLayout.NORTH);// f.add(bn, ”North“);f.add(bs, BorderLayout.SOUTH);f.add(bw, BorderLayout.WEST);f.add(be, BorderLayout.EAST);f.add(bc, BorderLayout.CENTER);f.setSize(200,200);f.setVisible(true);}public static void main(Stringargs[]){BorderExamplebe = new BorderExample();257be.go();}}GridLayout布局管理器?在GridLayout構造方法中指定分割的行數和列數new GridLayout(3,4);setLayout(newGridLayout(introws, intcols));258 import java.awt.*;public class LayoutExample{private Frame f;private Panel p;private Button bw, bc, bfile, bhelp;public LayoutExample(){f = new Frame(”GUIExample 3“);bw= new Button(”West“);bc= new Button(”Workspace region“);bfile= new Button(”File“);bhelp= new Button(”Help“);}public void go(){f.add(bw, BorderLayout.WEST);f.add(bc, BorderLayout.CENTER);p = new Panel();p.add(bfile);p.add(bhelp);f.add(p, BorderLayout.NORTH);f.pack();f.setVisible(true);}public static void main(Stringargs[]){LayoutExamplele = new LayoutExample();260le.go()}}

import java.awt.*;public class GridExample{private Frame f;private Button b1, b2, b3, b4, b5, b6;public GridExample(){f = new Frame(”GridExample“);b1 = new Button(”1“);b2 = new Button(”2“);b3 = new Button(”3“);b4 = new Button(”4“);b5 = new Button(”5“);b6 = new Button(”6“);}public void go(){f.setLayout(new GridLayout(3,2));f.add(b1);f.add(b2);f.add(b3);f.add(b4);f.add(b5);f.add(b6);f.pack();f.setVisible(true);}public static void main(Stringargs[]){GridExamplege= new GridExample();ge.go();}}多布局實例259

事件?事件(Event)事件事件不只是針對Windows應用程序,多數控制和監視程序都是程序任何一個程序外部發生的事情,如開關關閉、溫度到達了預先設置好的值,都可以注冊成為事件在Java中,可以在自己的程序中創建事件,用一部分其他代碼標志一些值得注意的事情發生。但是,我們所要關注的事件類型是在與程序交互過程中發生的261262?事件源(Event source)?事件處理者(Event handler)

import java.awt.*;public class ButtonEvent{private Frame f;private Button b;public ButtonEvent(){f = new Frame(”ButtonEvent“);b = new Button(”PressMe!“);b.setActionCommand(”ButtonPressed“);}public void go(){b.addActionListener(newButtonHandler());f.add(b,”Center“);f.pack();f.setVisible(true);}public static void main(Stringargs[]){ButtonEventbe = new ButtonEvent();be.go();}}import java.awt.event.*;public class ButtonHandlerimplements ActionListener{public void actionPerformed(ActionEvente){System.out.println(”Actionoccurred“);System.out.println(”Button'scommand is: “ + e.getActionCommand());}}263264

/ 50

事件代理?Java GUI設計中,通過式對所關注的事件源進行監控的方事件類?類,它們都是接或間接子類?EventObject類的getSource()方法包中定義了多個事件類的直?注冊監聽器時應指明該監聽器監控的事件種類?當事件源發生了某種類型的事件時,只觸發事先已就該種事件類型的監聽器265?AWTEvent類的getID()方法266

Java事件分類java.awt.event包KeyEvent監聽器接口?java.awt.event包中定義了十一個監聽器接口,每個接口內部包含了若干處理相關事件的抽象方法?通常每個事件類都有一個與之相對應,而事件類中的每個具體事件類型都有一個具體的與之相對應,當具體事件發生時,這個事件將被封裝成一個事件類的作為實際參數傳遞給與之對應的具體方法,由這個具體方法負責響應并處理發生的事件268java.util.EventObjectjava.awt.AWTEventActionEventAdjustmentEventComponentEventItemEventTextEventContainerEventInputEventFocusEventWindowEventPaintEventMouseEvent267

事件類型ActionEventItemEvent監聽器接口ActionListenerItemListener監聽器接口中的方法actionPerformed(ActionEvent)itemStateChanged(ItemEvent)mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)mouseDragged(MouseEvent)mouseMoved(MouseEvent)keyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)focusGained(FocusEvent)focusLost(FocusEvent)事件類型監聽器接口監聽器接口中的方法AdjustmentEventAdjustmentListeneradjustmentValueChanged(AdjustmentEvent)componentMoved(ComponentEvent)ComponentEventComponentListenercomponentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)windowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)MouseEventMouseListenerMouseEventMouseMotionListenerWindowEventWindowListenerKeyEventFocusEventKeyListenerFocusListenerContainerEvent269ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)TextListenertextValueChanged(TextEvent)270TextEvent

import java.awt.*;import java.awt.event.*;public class TwoListenerimplements MouseMotionListener,MouseListener{private Frame f;private TextFieldtf;public TwoListener(){f = new Frame(”Twolisteners example“);tf= new TextField(20);}public void go(){Label label= new Label(”Clickand drag the mouse“);f.add(label, ”North“);f.add(tf, ”South“);f.addMouseMotionListener(this);f.addMouseListener(this);f.setSize(300, 200);f.setVisible(true);272}多重監聽器?一般情況下,事件源可以產生多種不同類型的事件,因而可以注冊(觸發)多種不同類型的監聽器?一個事件源組件上可以注冊監聽器,針對同一個事件源的同一種事件也可以注冊監聽器,一個監聽器可以被注冊到的事件源上271

/ 50

}public void mouseDragged(MouseEvente){String s = ”Mouse dragging:X=“ + e.getX()+ ” Y=“ + e.getY();tf.setText(s);} public void mouseEntered(MouseEvente){String s = ”The mouse entered“;tf.setText(s);}public void mouseExited(MouseEvente){String s = ”The mouse has left the building“;tf.setText(s);}public void mouseMoved(MouseEvente){ }public void mousePressed(MouseEvente){ }public void mouseClicked(MouseEvente){ }public void mouseReleased(MouseEvente){ }public static void main(Stringargs[]){TwoListenertwo = new TwoListener();two.go();}事件適配器類?為簡化編程,針對大多數事件監聽器接口定義了相應的類,即事件適配器類?在適配器類中,實現了相應監聽器接口中所有的方法,但不做任何事情在定義監聽器類時就可以繼承事件適配器類,并只所需要的方法?適配器類實現了相應監聽器接口,但所有方法體都是的273274

事件類型ActionEventWindowEventMouseEventMouseEventKeyEventFocusEvent監聽器接口ActionListenerWindowListenerMouseListenerMouseMotionListenerKeyListenerFocusListener------適配器類事件適配器用法import java.awt.*;import java.awt.event.*;public class MouseClickHandlerextends MouseAdapter{public void mouseClicked(MouseEvente){……}}WindowAdapterMouseAdapterMouseMotionAdapterKeyAdapterFocusAdapter275276

import java.awt.*;import java.awt.event.*;class W1 extends Frame implements WindowListener{W1(){super(”Window1“);setSize(350,200);setVisible(true);addWindowListener(this);}public void windowClosing(WindowEvente){System.exit(0);}public void windowOpened(WindowEvente){}public void windowClosed(WindowEvente){}public void windowIconified(WindowEvente){}public void windowDeiconified(WindowEvente){}public void windowActivated(WindowEvente){}public void windowDeactivated(WindowEvente){}public static void main(Stringargs[]){new W1();}}窗口?利用事件監聽器接口創建窗口?利用事件適配器類創建窗口–采用內部類設計–采用匿名類設計創建窗口一277278

import java.awt.*;import java.awt.event.*;import java.awt.*;import java.awt.event.*;創建窗口二class W2 extends Frame {W2(){super(”Window2“);setSize(350,200);setVisible(true);addWindowListener(newWin());}public static void main(Stringargs[]){new W2();}}創public class W3 {public static void main(Stringargs[]){Frame f=new Frame(”Window3“);建f.setSize(350,200);窗f.setVisible(true);f.addWindowListener(newWindowAdapter(){public void windowClosing(WindowEvente){口System.exit(0);三}});}}280class Win extends WindowAdapter{public void windowClosing(WindowEvente){System.exit(0);}}279

/ 50

Label 標簽類?用于在屏幕上輸出一行文本或提示信息?構造方法public Label();public Label(Stringstr);public Label(Stringstr,intalignment);對齊方式:Label.LEFTLabel.CENTERLabel.RIGHTButton 按鈕類?用于觸發特定動作?構造方法:public Button();public Button(Stringlabel);?方法:public String getLabel();public void setLabel(Stringlabel);?常用方法public String getText();public void setText(Stringstr);281public void setAlignment(intalignment);282

TextField文本框類?一個單行文本框,接收鍵盤輸入的信息?構造方法:public TextField();public TextField(intcolumns);public TextField(Strings);public TextField(Strings,intcolumns);?方法:public void setEchochar(charc);public void setEditable(booleanb);283Checkbox復選框類?常用方法–getState()方法返回復選框選中狀態,選中為true,否則為false–setState()方法設置復選框選中狀態?事件響應–當用戶點擊復選框使其選中狀態發生變化時就會引發ItemEvent類的選擇事件284

Graphics類Graphics類是AWT的一個子類,包含圖形方法,用于繪制圖形和進行簡單的圖像處理,并可以設計動畫?畫直線在點(x1, y1)和點(x2, y2)之間畫直線void drawLine(intx1,int y1,int x2,int y2);Graphics類?畫矩形void drawRect(intx,inty,intwidth,intheight);void fillRect(intx,inty,intwidth,intheight);以當前顏色繪制實心矩形void drawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight);繪制圓角矩形285286

Graphics類Graphics類提供了在屏幕的指定位置上繪制字符串、字符和字節的方法public void drawString(Stringstring,intx,inty)public void drawChars(charchars[ ],intoffset,intnumber,intx,inty)public void drawBytes(bytebytes[ ],intoffset,intnumber,intx,inty)1.坐標點(x,y)與要繪制的字符串string、字符數組chars[ ]和字節數組bytes[ ]的坐下角相對應2.參數offset是數組的起始下標3.參數number是要繪制的元素個數287Font 類Font類設置所要顯示文字的字體、大小和位置構造方法:Font(String name,intstyle,intsize)?字符名稱name指字體?字符風格style是指字的外觀:正常字體Font.PLAIN、黑體Font.BOLD、斜體Font.ITALIC?字體大小size以點(point)來衡量,1point為1/72英寸?使用Graphics類的方法void setFont(Fontfont)設置字體288

/ 50

Color 類?Color類將顏色按照RGB標準格式進行封裝,該格式中紅、綠、藍三原色的取值范圍都是0~255?構造方法public Color(intr, intg, intb)public Color(intr, intg, intb, inta)a為透明度參數對話框(Dialog)?構造方法:public Dialog(Dialogowner)public Dialog(Dialogowner,Stringtitle)public Dialog(Dialogowner,Stringtitle,booleanmodal)public Dialog(Frameowner)public Dialog(Frameowner,booleanmodal)public Dialog(Frameowner,Stringtitle)public Dialog(Frameowner,Stringtitle,booleanmodal)例如:Button b = new Button(”Test“);Color c = new Color(200, 170, 90);Color d = new Color(200, 170, 90, 120);b.setBackground(c)289owner對話框的所有者;title對話框的標題;modal模式選擇,默認為true模式對話框,即打開后必須做出相應的對話框290

文件對話框(FileDialog)構造方法:public FileDialog(FrameParent)創建菜單1.首先創建一個對象,并將其置于一個可容納菜單的容器中2.創建一個或多個們添加到先前創建的對象,并將它對象中public FileDialog(FrameParent,Stringtitle)public FileDialog(FrameParent,Stringtitle,intmode)3.創建一個或多個對象或對象,再將其加入到各對象中291292

import java.awt.*;public class Menu3{public static void main(String[] args){Frame f = new Frame(”Menu“);MenuBarmb= new MenuBar();f.setMenuBar(mb);Menu m1 = new Menu(”File“);Menu m2 = new Menu(”Edit“);Menu m3 = new Menu(”Help“);mb.add(m1);mb.add(m2);mb.setHelpMenu(m3);Menu m4 = new Menu(”Format“);MenuItemmi1 = new MenuItem(”New“);MenuItemmi2 = new MenuItem(”Save“,new MenuShortcut('s'));MenuItemmi3 = new MenuItem(”Load“);CheckboxMenuItemmi4 = new CheckboxMenuItem(”Show“);MenuItemmi5 = new MenuItem(”Quit“);m1.add(m4);m1.add(mi1);m1.add(mi2);m1.add(mi3);m1.add(mi4);m1.addSeparator();m1.add(mi5);MenuItemmi41 = new MenuItem(”FormatA“);MenuItemmi42 = new MenuItem(”FormatB“);m4.add(mi41);m4.add(mi42);f.setSize(220,240);f.setVisible(true);293}}Applet類?Applet類存于包中,是的子類?Applet是使用Java語言編寫的一段代碼,是在中運行的,必須創建一個文件,通過編寫語言代碼告訴瀏覽器載入何種Applet以及如何運行294

Applet類繼承關系java.lang.Objectjava.awt.Componentjava.awt.Containerjava.awt.Paneljava.applet.Applet295Applet工作原理?編譯好的文件保存在特定的文件的URL,可以通過方法獲得play(getDocumentBase(), ”spacemusic.au“);308

在Applet中播放聲音(AudioClip)AudioClip中的方法–play()–loop()–stop()AudioClip聲音對象例如:public AudioClipgetAudioClip(URLurl)public AudioClipgetAudioClip(URLurl, String name)AudioClipsound;sound= getAudioClip(getDocumentBase(),”gong.au“);309Applet與URLjava.包中定義了一個URL類,用于描述網絡上某一資源的地址。Applet有兩個方法可以返回URL對象1.getDocumentBase()2.getCodeBase()310

流的概念第9講Java網絡程序設計及相關技術流式輸入輸出與文件處理流是指在計算機的輸入與輸出之間運動的數據的序列?輸入流:代表從外設流入計算機的數據序列,只能從流中讀取數據,而不能向其寫出數據?輸出流:代表從計算機流向外設的數據序列,只能從流中寫入數據,而不能從中讀取數據312311

/ 50

輸入輸出流類包中定義了多個流類型(類或抽象類)來實現輸入/輸出功能類FileOutputStreamInputStreamWriterReaderRandomAccessFile字符流和字節流按處理數據的單位劃分,Java支持兩種基本的流類型: 字符流和字節流字節流InputStreamOutputStream字符流ReaderWriter說明該類對象表示通向一個用于輸入或者輸出的文件路徑,或者通向一個目錄的路徑字節流式輸出操作的基礎類字節流式輸入操作的基礎類字符流式輸出操作的基礎類字符流式輸入操作的基礎類對隨機訪問文件提供支持的類313輸入流輸出流314

InputStream類InputStream類是抽象類java.lang.Objectjava.io.InputStreamjava.io.FileInputStreamjava.io.PipedInputStreamjava.io.ObjectInputStreamjava.io.SequenceInputStreamjava.io.ByteArrayInputStreamjava.io.StringBufferInputStreamjava.io.FilterInputStream315InputStream類read方法?abstract intread()?intread(byte[] b)?intread(byte[] b, intoff, intlen)316

InputStream類?read()方法是方法,為了讓繼承InputStream類的子類可以針對不同的外部設備定義不同的read()方法?Java規定read()方法必須配合處理機制來使用,所以使用read()方法時,必須加入來執行例外處理,或利用來執行錯誤控制317InputStream類?public long skip(longn)?public void mark(intreadlimit)?public void reset()?public void close()318

OutputStream類OutputStream類是抽象類java.lang.Objectjava.io.OutputStreamjava.io.FileOutputStreamjava.io.PipedOutputStreamjava.io.ByteArrayOutputStreamjava.io.FilterOutputStreamjava.io.ObjectOutputStream319OutputStream類write方法?abstract void write(intb)?void write(byte[] b)?void write(byte[] b, intoff, intlen)320

/ 50

Reader類ReaderBufferReaderCharArrayReaderFilterReaderInputStreamReaderStringReader321Reader類read方法?intread()?intread(char[] cbuf)?abstract intread(char[] cbuf, intoff, intlen)322

Reader類?void close()?booleanready()?long skip(longn)?void mark(intreadAheadLimit)?void reset()323Writer類WriterBufferWriterCharArrayWriterFilterWriterOutputStreamWriterPrintWriterPipedWriterStringWriter324

Writer類Writer類?當數據傳送到流的時候Unicode字符會被自動轉換成本地計算機使用的編碼?字符輸出流用于向一個文件中寫入文本內容,或者把數據的字符串表示形式寫入文件325write方法–void write(intc)–void write(char[] cArray)–abstract void write(char[] cArray,intoff, intlen)–void write(Stringstr)–void write(Stringstr, intoff, intlen)326

節點流和處理流?節點流數據輸入輸出流?實現在數據源和程序之間加入數據過濾處理,將原始數據加入了數據類型處理功能?數據輸入輸出流DataInputStream和DataOutputStream分別是過濾輸入輸出流FilterInputStream和FilterOutputStream的子類?數據輸入輸出流DataInputStream和DataOutputStream分別實現了DataInput和DataOutput的接口,允許對不同數據類型進行讀寫操作327328?處理流

/ 50

DataInputStream類DataInputStream方法?????????byte readByte()booleanreadBoolean()long readLong()char readChar()double readDouble()float readFloat()short readshort()intreadInt()String readLine()329DataOutputStream類DataOutputStream方法?void writeByte(byte)?void writeBoolean(boolean)?void writeLong(long)?void writeChar(char)?void writeDouble(double)?void writeFloat(float)?void writeshort(short)?void writeInt(int)?void writeBytes(String)?void writeChars(String)330

緩沖輸入輸出流流式輸入與輸出方法在一個操作中一般只允許把很少量的數據如一個字符或者字節寫入或者讀出。這樣傳送數據效率低。若一個流配有一個緩沖區,則稱為緩沖流。一個緩沖區就是專門用于把發送到一個外部設備或者從一個外部設備讀出的數據集合起來的一塊內存可以使用BufferedInputStream類和BufferedOutputStream類為輸入輸出流添加一個緩沖區331將文件內容讀入一個帶緩沖的流的步驟1.用要寫入的文件名和路徑生成一個File類型的對象2.用該File類型的對象作為FileInputStream類的一個實參生成與特定物理文件相對應的輸入節點流對象3.將這個流對象傳遞給BufferedInputStream類對象,使其帶有緩沖區4.將BufferedInputStream類對象傳遞給用來讀入數據的流對象DataInputStream對象332

將一個帶緩沖的流寫入一個文件的步驟1.用要寫入的文件名和路徑生成一個File類型的對象2.用該File類型的對象作為FileOutputStream類的一個實參生成與特定物理文件相對應的節點流對象3.將這個流對象傳遞給BufferedOutputStream類對象,使其帶有緩沖區4.將BufferedOutputStream類對象傳遞給用來寫入數據的流對象DataOutputStream對象333import java.io.*;public class NodeStreamTest{public static void main(String[] args){try {FileReaderinput = new FileReader(args[0]);FileWriteroutput = new FileWriter(args[1]);char[] buffer = new char[128];intcharsRead;charsRead= input.read(buffer);while(charsRead!=-1){output.write(buffer, 0, charsRead);charsRead= input.read(buffer);}input.close();output.close();} catch(IOExceptione){System.out.println(e);}}}334

import java.io.*;public class BufferedStreamTest{public static void main(String[] args){try {FileReaderinput = new FileReader(args[0]);BufferedReaderbufInput= new BufferedReader(input);FileWriteroutput = new FileWriter(args[1]);BufferedWriterbufOutput= new BufferedWriter(output);String line = bufInput.readLine();while(line!= null){bufOutput.write(line, 0, line.length());bufOutput.newLine();line = bufInput.readLine();}bufInput.close();bufOutput.close();} catch(IOExceptione){ ……}}}335文件(File)?File 對象表示的是通向硬盤上的一個實際文件或者目錄的路徑,而不是一個流。可以生成表示通向相關文件或者目錄的路徑的對象?Java.io.File文件類提供獲取文件基本信息,以及其它與文件相關的操作336

/ 50

方法說明文件(File)?new File(Stringstr)?new File(Filef ,String str)?new File(Stringstr1,String str2)例如:File myFile=new File(”F:/java/myFile1.java“);File myDir=new File(”F:/java“);File myDir=new File(”F:/java“);File myFile=new File(myDir,”myFile1.java“);File myFile=new File(”F:/java“ ,”myFile1.java“);337getName()返回一個String對象,包含該文件名,沒有路徑;對于表示一個目錄的File對象,則指返回目錄名getPath()list()返回一個包含File對象路徑的String對象,其中包含文件名或路徑名如果當前File對象表示一個目錄,返回一個包含該目錄成員名字的String數組;如果當前File對象是一個文件,返回null如果當前對象表示一個目錄,返回File對象數組,對應該目錄中的文件和目錄;如果當前對象不是一個目錄或出現I/O錯誤,返回null返回一個long類型值,指出當前File對象所表示的文件的字節長度;如果當前對象是一個目錄,則返回0返回當前File對象的一個String表示,當一個File對象與一個String對象進行連接操作時,將自動被調用338listFiles()length()toString()

?構造方法:隨機存取文件類(RandomAccessFile)?要想隨機訪問一個文件必須使用RandomAccessFile類?隨機訪問文件不是一個流,因此不能緩沖存儲?RandomAccessFile類定義了所有讀操作都通過DataInput提供,在DataOutput中定義了所有寫操作,即實現了與這兩個接口3391.RandomAccessFile(Filefile, Stringmode)2.RandomAccessFile(Stringname, Stringmode)訪問模式(mode):r:文件必須事先存在,只對文件進行讀取rw:先寫文件后讀文件,如文件不存在則建立常用方法???longgetFilePointer();void seek(long pos);long length();340

import java.io.*;public class RandomAccessFileExample{public static void main(Stringarg[]){try{RandomAccessFileraf= newRandomAccessFile(”testRand.txt“,”rw“);for(inti=0;i<10;i++)raf.writeDouble(i*1.1);raf.close();raf=new RandomAccessFile(”testRand.txt“,”rw“);raf.seek(6*8);raf.writeDouble(55.50);raf.close();raf=new RandomAccessFile(”testRand.txt“,”r“);for(inti=0;i<10;i++)System.out.println(i+”:“+raf.readDouble());raf.close();}catch(FileNotFoundExceptione){System.out.println(e);}catch(IOExceptione){System.out.println(e);}341}}流類CharArrayReaderCharArrayWriterByteArrayInputStreamMemoryByteArrayOutputStreamStringReaderStringWriterStringBufferInputStreamPipedReaderPipedWriterPipePipedInputStreamPipedOutputStreamFileReaderFileWriterFileFileInputStreamFileOutputStreamI/O功能從/向內存數組讀寫數據從/向內存字符串讀寫數據實現管道的輸入和輸出統稱為文件流。對文件進行讀、寫操作342

I/OObjectSerializationDataConversionPrinting流類ObjectInputStreamObjectOutputStreamDataInputStreamDataOutputStreamPrintWriterPrintStreamBufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream功能對象的輸入、輸出讀、寫基本數據類型包含方便的打印方法在讀入或寫出時,對數據進行緩存,以減少I/O的次數。343344程序?程序是一段靜態的代碼,它是應用軟件執行的藍本Buffering

/ 50

進程?進程是程序的,它對應了從代碼、執行到執行完畢的一個完整過程,這個過程也是進程本身從的過程?作為執行藍本的同一段程序,可以被多次加載到系統的內存區域分別執行,形成不同的進程345線程?線程是?線程是比進程?一個生多個的順序控制流的執行單位程在其執行過程中,可以產程,形成多條執行線索?每個線程有它自身的產生、存在和消亡的過程346

?每個進程都有程切換的開銷的代碼和數據空間,進。Java主線程每個Java程序都有一個缺省的主線程?Application的主線程是main()方法執行的線索?Applet的主線程是指瀏覽器加載并執行Java小程序348?同一類線程代碼和數據空間,每個線程有的運行棧和程序計數器(PC),線程切換的開銷。?多進程?多線程347

Java線程?要想實現多線程,必須在主線程中創建新的線程對象?Java的線程是通過的類來實現的包中創建阻塞解除調度就緒狀態運行狀態線程狀態與生命周期阻塞狀態導致阻塞的事件終止?將一個虛擬的CPU,封裝在Thread類,每個線程的代碼通過Thread類和虛擬的CPU打交道,而Java虛擬機占用一個程,同時運行許多虛擬的CPU,多個虛擬的CPU間的協調不需要人為編碼349350

1.創建狀態(new)?創建一個新的線程?新線程處于創建狀態,具有相應的內存空間和其他資源,但是沒有真正執行它,因此系統并不為此線程分配CPU資源3512.可運行狀態(Runnable)?創建線程之后,如要執行,則需對線程進行登記,并為它分配CPU系統資源,這些工作通過start()方法來完成?此時線程不一定正在運行,是否運行由Java的運行系統來協調決定。各種不同操作系統協調這些線程的方式是不同的352

/ 50

3.阻塞狀態(Blocked)就是一個線程因為人為或系統原因必須讓出CPU并暫時停止運行,以后還可以恢復運行的狀態4.終止狀態(Dead)自然終止:正常運行完成了run()方法的全部工作后終止異常終止:線程被提前強制性終止,如調用了一個stop()方法等353354

線程調動與優先級Java線程?每個線程都是通過某個特定Thread 對象所對應的方法run()來完成其操作的,方法run()稱為線程體?Java多線程系統會給每個線程自動分配一個線程的優先級,任務較緊急重要的線程,其優先級就較高?在線程排隊時,優先級高的線程可以排在較前的位置,能優先享用處理器資源;而優先級較低的線程則只能等前面高優先級線程執行完畢后才能獲得處理器資源355356

線程的優先級?線程的優先級用數字來表示,范圍從1到10,一個線程的缺省優先級是5 Thread.MIN_PRIORITY= 1Thread.MAX_PRIORITY= 10Thread.NORM_PRIORITY= 5線程的調度?Java提供一個線程調度器來監控程序啟動后進入就緒狀態的所有線程?線程調度器按照線程的優先級決定應調度哪些線程來執行357358?獲得或設置線程對象的優先級intgetPriority();void setPriority(intnewPriority);

創建線程:繼承Thread類實現多線程Java實現多線程的兩種途徑–創建Thread線程類的子類–在用戶自定義類中實現Runnable接口359?通過繼承java.lang包中的Thread類來創建自己的線程對象,該繼承類重寫Thread類中的run()方法?Thread類的構造方法public Thread()public Thread(Runnabletarget)public Thread(Stringname)public Thread(ThreadGroupgroup, Runnabletarget);public Thread(ThreadGroupgroup, String name);360

/ 50

public class MyThreadextends Thread {inti;public void run(){i = 1;while(true){System.out.println(”MyThread: “ + i++);if(i == 50)break;}}public static void main(Stringargs[]){Thread t = new MyThread();t.start();inti = 1;while(true){System.out.println(”MainThread: “ + i++);if(i == 50)break;}}}361創建線程:實現Runnable接口通過創建Runnable接口的實現類對象作為一個線程的目標對象,這種方法用Runnable目標對象初始化Thread類,由目標對象來提供run()方法362

public class TestThread{public static void main(Stringargs[]){inti=1;MyRunnermr= new MyRunner();Thread t = new Thread(mr);t.start();while(true){System.out.println(”MainThread: “ + i++);if(i == 50)break;}}}class MyRunnerimplements Runnable{inti;public void run(){i = 1;while(true){System.out.println(”MyThread: “ + i++);if(i == 50)break;}}}兩種創建線程方法的比較直接繼承Thread類–不能再從其他類繼承–編寫簡單,可以直接操縱線程實現Runnable接口–可以將CPU、代碼和數據分開,形成清晰模型–還可以從其他類繼承–保持程序風格的一致性363364

?start()方法:啟動線程對象,啟動線程是使線程進入到就緒(可運行)狀態,并不一定立即開始執行該線程?sleep()方法:線程暫時休眠,讓出處理器資源?stop()方法:強制終止某線程的生命周期365方法isAlive()getPriority()setPriority()Thread.sleep()wait()notify()/notifyAll()功能判斷線程是否還―活‖著,即線程是否還未終止獲得線程的優先級數值設置線程的優先級數值將當前線程暫時休眠可指定時間當前線程進入對象的wait pool喚醒對象的wait pool中的一個/所有等待線程366

多線程間的協調與配合?線程同步?線程死鎖class Stack{inti = 0;char[ ] data = new char [10];public void push(char c){data[i] = c;i ++;}public char pop(){i--;return data[i];}}367368

/ 50

線程同步?避免多個線程對同一資源的訪問?引入管程(類似于進程信號量)?每個被同步資源都對應一個管程,首先占用這個資源的線程同時擁有了該資源的管程,在它完成操作釋放管程前,其他欲訪問同一資源的線程只能等候管程,從而實現了線程對資源的獨占369互斥鎖?每個對象都對應于一個可稱為―互斥鎖‖的標記(即系統在運行時分配給該對象一個管程),并保證在任一時刻,只能有一個線程訪問該對象,可保證共享數據操作的完整性?關鍵字synchronized來與對象的互斥鎖聯系?當某個對象用synchronized修飾時,表明該對象在任一時刻只能由一個線程訪問370

class Stack{inti = 0;char[ ] data = new char [10];public void push(char c){synchronized(this){data[i] = c;i++;}}public char pop(){synchronized(this){i--;return data[i];}}}}371同步?synchronized 除了象上面放在對象前面限制一段代碼的執行外,還可以放在方法聲明中,表示整個方法為同步方法public synchronized void push(charc){ …}?如果synchronized用在類聲明中,則表明該類中所有方法都是同步方法public synchronized class Stack{ …}372

死鎖?在多線程競爭使用多資源的程序中,如果A線程正等待B線程所占用的資源(具有的互斥鎖、管程),而B線程也在等待A線程占用的資源?此時哪個線程都不能繼續運行,而哪個線程都無法運行完成同步程序塊373線程交互?java.lang.Object類中定義了wait()、notify()和notifyAll()三個方法?wait()方法使當前正在執行的線程暫時掛起,進入阻塞狀態,放棄當前占用的管程,在管程隊列中等待?notify()方法從管程隊列中選擇優先級最高的一個被掛起的線程,喚醒它,使其占用該管程及相關資源374

class SyncStack{ private intindex = 0;private char []data = new char[10];public synchronized void push(charc){while(index== data.length){try{this.wait();} catch(InterruptedExceptione){ }}this.notify();data[index] = c;index++;}public synchronized char pop(){while(index==0){try{ this.wait();} catch(InterruptedExceptione){ }}this.notify();index--;return data[index];375}}傳輸控制協議TCP?TCP是一個基于連接的協議,可在兩臺相連計算機之間提供可靠的數據流?HTTP、FTP、Telnet都是基于點對點通信的TCP協議377 47 / 50

網絡連接?當程序需要建立網絡連接時,必須有一臺機器運行一個程序,隨時等候連接,而另一端的程序則對其發出連接請求?兩個程序連接前必須達成一致,即由Client端負責初始化連接,而Server端隨時等候請求378網絡連接?當程序建立網絡連接時,需要知道IP地址或主機名(由32bit點分十進制數表示),還需要一個端口號(由16bit十進制數表示)?連接到正確主機后,需要通過端口號確認連接該端口所對應數據?只有Client端和Server端指定連接地址一致時連接才會建立379

Socket?兩個Java應用程序可通過一個雙向的網絡通信連接實現數據交換,這個雙向鏈路的一端稱為一個socket(套接字)?socket(套接字)通常用來實現Client/ Server連接Socket?java.net包中定義的兩個socket類Socket和ServerSocket,分別用來實現雙向連接的Client和Server端?建立連接時所需的尋址信息–遠程計算機的計算機名或IP地址–試圖連接的端口號381380

Socket通信模型服務器ServerSocket(port#)ServerSocket.accept()利用socket和服務器交互?雙向通信要在服務器端和客戶機端分別編程并分別運行?服務器端首先要建立一個ServerSocket,以指定端口號并監聽客戶機的請求,還要建立一個Socket用來和客戶機通信?客戶機端要建立套接到同一個端口的Socket以便和服務器通信382383客戶機Socket(host,port#)Socket()OutputStreamInputStreamSocket.close()OutputStreamInputStreamSocket.close()

網絡編程的基本步驟1.創建socket2.將特定的輸入/輸出流連接到打開的socket3.按照一定的協議對socket進行讀/寫操作4.關閉socket384ServerSocket構造方法ServerSocket(intport)ServerSocket(intport, intcount)?port 指連接端口號?count 指服務器所能支持的最大連接數385

/ 50

Socket類的構造方法Socket(InetAddressaddress, intport)Socket(InetAddressaddress, intport, booleanstream)Socket(Stringhost, intport)Socket(Stringhost, intport, booleanstream)客戶端Socket的建立Socket socket;try{socket = new Socket(”127.0.0.1“,2000);}catch(IOExceptione){//…}386387

InetAddress類?用來區分計算機網絡中的不同計算機并對其尋址?常用方法–getHostName()–getLocalHost()服務器端Socket的建立ServerSocketserver = null;try {server=new ServerSocket(2000);}catch(IOExceptione){ //…}Socket socket=null;try {socket=server.accept();}catch(IOExceptione){ //…}388389

打開輸入/輸出流PrintStreamos;os= new PrintStream(new BufferedOutputStream(socket.getOutputStream()));DataInputStreamis=new DataInputStream(socket.getInputStream());關閉Socketos.close();is.close();socket.close();390391

URL?URL統一資源定位器,表示Internet上某一資源的地址?URL組成包括:協議名:資源名?URL舉例http://392URL類構造方法?public URL(Stringspec)URL u1 = new URL(”http://online.btvu.org/“);?public URL(URL context, String spec)URL u2 = new URL(u1, ”index.html“);?public URL(Stringprotocol, String host, String file)URL u3 = new URL(”http“, ”online.btvu.org“, ”index.html“);?public URL(String protocol, String host, intport, String file)URL u4 = new URL(”http“, ” online.btvu.org“, 80,”index.html");393 49 / 50

下載java自學心得word格式文檔
下載java自學心得.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    程序員自學之路——Java方向

    程序員自學之路——Java方向 Unix/Linux操作系統Unix開發環境 Unix操作系統概述、Unix文件系統、Unix的Kernel和Shell、遠程登錄的原理、用戶管理命令、基本文件和目錄操作......

    自學心得

    自學心得 我很榮幸參加了海南大學環植學院第八期入黨積極分子培訓班。首先作為一名入黨積極分子,我深知要成為一名合格黨員,必須具備三個基本條件:1)要有堅定的共產主義信念。 2......

    java實習心得

    經過為期8周的Java實習,感觸很深,收獲也很大,對自己的缺點也有了很多的認識,回首本學期的JAVA學習,重點還是在學習概念,關于類型、變量、接口、輸入輸出流、分析異常,后期實習主要......

    Java培訓心得

    Java培訓心得 通過這次培訓讓我獲得不同的收獲,感受頗多,受益匪淺。讓我從一個對Java一知半解。在這里,首先,我要感謝尚學堂為我提供了這么一個良好的學習環境,其次,要感謝我的授......

    JAVA實驗報告心得

    北京聯合大學 信息學院 “面向對象程序設計”課 程上機實驗報告題 目: java上機實驗心得體會姓名(學號):專 業: 計算機科學與技術編 制 時 間: 2012年12月19日版 本: 1.0.0 指......

    學習JAVA心得

    學習JAVA心得 (2007-07-10 17:44:52) 經常看到有人問怎么學JAVA,無數的問題其實都已經是討論很多編了,我學習JAVA5年,真正覺得有感覺是2003的時候,這么長時間以來有一些想法,寫出......

    小組自學心得

    小組自學心得 今天,我們小組在小組長的組織下自學了《黨章》、《胡錦濤總書記在福建考察時講話精神》、《十七屆五中全會》、《關于在黨的基層組織和黨員中深入開展創先爭優......

    黨課自學心得

    自學心得 這次黨課學習使我對黨的性質、指導思想、基本理論和基礎知識有了更全面更深層次的理解,入黨動機得到了進一步的端正,同時也增強了自身的時代使命感和歷史責任感。 通......

主站蜘蛛池模板: 一本久道久久综合久久爱| 欧洲精品色在线观看| 国产区精品系列在线观看| 成人免费ā片在线观看| 国产亚洲精品线观看k频道| 狠狠爱无码一区二区三区| 日本免费不卡的一区视频| 日韩精品无码区免费专区| 亚洲日韩看片无码超清| 成人做爰www网站视频下载| 日韩免费一区二区三区高清| 国产精品无码素人福利免费| 婷婷俺也去俺也去官网| 国产亚洲欧美日韩一区图片| 国产极品视觉盛宴| 亚洲精品国产第一综合99久久| 无码欧美成人AAAA三区在线| 国产午夜鲁丝无码拍拍| 丁香花在线影院观看在线播放| 亚洲热线99精品视频| 欧美巨大黑人极品精男| 国产免费一区二区三区在线观看| 欧美伊人久久大香线蕉综合| 3d动漫精品啪啪一区二区| 狠狠色狠狠色综合久久蜜芽| 国产日产欧产精品精品首页| 国产在线永久视频| 亚洲顶级裸体av片| 在线观看国产成人av片| 日韩av一区二区精品不卡| 国产成人精品一区二区秒拍| 国产精品第一区揄拍| 欧美亚洲日本国产综合在线美利坚| 爽到高潮无码视频在线观看| 色欲久久久中文字幕综合网| 亚洲av中文无码乱人伦在线播放| r级无码视频在线观看| 亚洲爆乳无码精品aaa片蜜桃| 一本一道波多野结衣av黑人| 国产成人精品久久综合| 变态拳头交视频一区二区|