国产午夜福利在线观看红一片,久久精品国产再热青青青,又硬又粗又大一区二区三区视频,中文字幕乱码免费,久久超碰97文字幕 ,中国精学生妹品射精久久

最新更新最新專題

您的位置:首頁 > ppt下載 > PPT課件 > 課件PPT > 孫鑫java ppt

孫鑫java ppt下載

素材大小:
1 MB
素材授權(quán):
免費(fèi)下載
素材格式:
.ppt
素材上傳:
lipeier
上傳時間:
2020-01-08
素材編號:
249270
素材類別:
課件PPT

素材預(yù)覽

孫鑫java ppt

這是孫鑫java ppt,包括了Java的起源,我們?yōu)槭裁匆肑ava,Java跨平臺的原理,Java開發(fā)工具包(JDK)的下載,面向?qū)ο蟪绦蛟O(shè)計,一個簡單的例子等內(nèi)容,歡迎點(diǎn)擊下載。

孫鑫java ppt是由紅軟PPT免費(fèi)下載網(wǎng)推薦的一款課件PPT類型的PowerPoint.

Java技術(shù)與應(yīng)用 主講人:孫鑫 Java的起源 我們?yōu)槭裁匆肑ava 我們?yōu)槭裁匆肑ava 簡單的 Java最初是為對家用電器進(jìn)行集成控制而設(shè)計的一種語言,因此它必須簡單明了。Java語言的簡單性主要體現(xiàn)在三個方面: 1、Java的風(fēng)格類似于C++,因而C++程序員初次接觸Java語言,就會感到很熟悉。從某種意義上講,Java語言是C及C++語言的一個變種,因此,C++程序員可以很快地掌握J(rèn)ava編程技術(shù)。 2、Java摒棄了C++中容易引發(fā)程序錯誤的一些特性,如指針、結(jié)構(gòu)、枚舉以及內(nèi)存管理等。 3、Java提供了豐富的類庫,可以幫助我們很方便的開發(fā)Java程序。 我們?yōu)槭裁匆肑ava 面向?qū)ο蟮? 面向?qū)ο罂梢哉f是Java最重要的特性,所以它支持繼承、重載、多態(tài)等面向?qū)ο蟮奶匦。Java語言的設(shè)計是完全面向?qū)ο蟮模恢С诸愃艭語言那樣的面向過程的程序設(shè)計技術(shù)。 我們?yōu)槭裁匆肑ava 健壯的 Java致力于檢查程序在編譯和運(yùn)行時的錯誤。Java也是一種強(qiáng)類型的語言,其類型檢查比C++還要嚴(yán)格。類型檢查幫助我們檢查出許多開發(fā)早期出現(xiàn)的錯誤。Java自己負(fù)責(zé)內(nèi)存管理,提供了垃圾內(nèi)存回收機(jī)制,有效的避免了C++中最頭疼的內(nèi)存泄漏問題。 我們?yōu)槭裁匆肑ava 安全的 Java的安全性可從兩個方面得到保證。一方 面,在Java語言里,刪除了指針和釋放內(nèi)存等C++功能,避免了非法內(nèi)存操作。另一方面,通過Java的安全體系架構(gòu)來確保Java代碼的安全性。當(dāng)我們從網(wǎng)上下載Java代碼在本地執(zhí)行時,Java的安全架構(gòu)能確保惡意的代碼不能隨意訪問我們本地計算機(jī)的資源,例如:刪除文件,訪問本地網(wǎng)絡(luò)資源等操作都是被禁止的。 我們?yōu)槭裁匆肑ava 解釋的 Java代碼是解釋執(zhí)行的,我們使用Java編譯器將Java代碼編譯成字節(jié)碼,這是一種中間代碼,然后由Java解釋器解釋執(zhí)行。而C++程序是編譯執(zhí)行的,C++程序代碼被編譯為本地機(jī)器指令,然后執(zhí)行。 我們?yōu)槭裁匆肑ava 與平臺無關(guān)的 Java作為一種網(wǎng)絡(luò)語言,其源代碼被編譯成一種結(jié)構(gòu)中立的中間文件格式。只要有Java運(yùn)行系統(tǒng)的機(jī)器都能執(zhí)行這種中間代碼。Java源程序被編譯成一種與機(jī)器無關(guān)的字節(jié)碼格式,在Java虛擬機(jī)上運(yùn)行。 我們?yōu)槭裁匆肑ava 多線程的 Java語言的一個重要特性就是在語言級支持多線程的程序設(shè)計。多線程就好像我們做一張桌子,如果你一個人完成這張桌子—就好像單線程,那么你需要先做桌面,做完桌面后,再做4個桌子腿,如果現(xiàn)在有5個人來做桌子—在程序中開辟5個線程,其中1個人做桌面,另外4個人分別做4個桌子腿,那么這兩種方式效率的高低,相信大家都能區(qū)分出來。 我們?yōu)槭裁匆肑ava 動態(tài)的 Java的動態(tài)特性是其面向?qū)ο笤O(shè)計方法的擴(kuò)展。它允許程序動態(tài)地裝入運(yùn)行過程中所需要的類,這是我們采用C++語言進(jìn)行面向?qū)ο蟪绦蛟O(shè)計所無法實現(xiàn)的。在C++程序設(shè)計過程中,每當(dāng)在類中增加一個實例變量或一個成員函數(shù)后, 引用該類的所有子類都必須重新編譯,否則將導(dǎo)致程序崩潰。Java從以下幾個方面采取措施來解決這個問題。Java編譯器不是將對實例變量和成員函數(shù)的引用編譯為數(shù)值引用,而是將符號引用信息在字節(jié)碼中保存下來,傳遞給解釋器,再由解釋器在完成動態(tài)連接類后,將符號引用信息轉(zhuǎn)換為數(shù)值偏移量。一個在存儲器中生成的對象不在編譯過程中決定,而是延遲到運(yùn)行時由解釋器確定。這樣,對類中的變量和方法進(jìn)行更新時就不至于影響現(xiàn)存的代碼。 解釋執(zhí)行字節(jié)碼時,這種符號信息的查找和轉(zhuǎn)換過程僅在一個新的名字出現(xiàn)時才進(jìn)行一次,隨后代碼便可以全速執(zhí)行。在運(yùn)行時確定引用的好處是可以使用已被更新的類,而不必?fù)?dān)心會影響原有的代碼。如果程序連接了網(wǎng)絡(luò)中另一系統(tǒng)中的某一類,該類的所有者也可以自由地對該類進(jìn)行更新,而不會使任何引用該類的程序崩潰。Java還簡化了使用一個升級的或全新協(xié)議的方法。如果你的系統(tǒng)運(yùn)行Java程序時遇到了不知怎樣處理的程序,Java能自動下載你所需要的功能程序。 Java跨平臺的原理 Java的跨平臺是通過Java虛擬機(jī)(JVM)來實現(xiàn)的。 Java跨平臺的原理 Java源文件的編譯過程 Java應(yīng)用程序的開發(fā)周期包括編譯、下載、解釋和執(zhí)行幾個部分。Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼—字節(jié)碼。這一編譯過程同C/C++的編譯有些不同。當(dāng)C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬件平臺運(yùn)行而產(chǎn)生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉(zhuǎn)換為特定的內(nèi)存偏移量,以保證程序運(yùn)行。Java編譯器卻不將對變量和方法的引用編譯為數(shù)值引用,也不確定程序執(zhí)行過程中的內(nèi)存布局,而是將這些符號引用信息保留在字節(jié)碼中,由解釋器在運(yùn)行過程中創(chuàng)建內(nèi)存布局,然后再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。 Java跨平臺的原理 Java解釋器的執(zhí)行過程 運(yùn)行JVM字節(jié)碼的工作是由解釋器來完成的。解釋執(zhí)行過程分三步進(jìn)行:代碼的裝入、代碼的校驗和代碼的執(zhí)行。裝入代碼的工作由“類裝載器”(class loader)完成。類裝載器負(fù)責(zé)裝入運(yùn)行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調(diào)用的類。當(dāng)類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其它類。在本臺計算機(jī)上的所有類都在同一地址空間內(nèi),而所有從外部引進(jìn)的類,都有一個自己獨(dú)立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運(yùn)行效率,同時又保證它們與從外部引進(jìn)的類不會相互影響。當(dāng)裝入了運(yùn)行程序需要的所有類后,解釋器便可確定整個可執(zhí)行程序的內(nèi)存布局。解釋器為符號引用同特定的地址空間建立對應(yīng)關(guān)系及查詢表。通過在這一階段確定代碼的內(nèi)存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。 隨后,被裝入的代碼由字節(jié)碼校驗器進(jìn)行檢查。校驗器可發(fā)現(xiàn)操作數(shù)棧溢出,非法數(shù)據(jù)類型轉(zhuǎn)換等多種錯誤。通過校驗后,代碼便開始執(zhí)行了。 Java跨平臺的原理 Java字節(jié)碼的兩種執(zhí)行方式 1、即時編譯方式:解釋器先將字節(jié)碼編譯成機(jī)器碼,然后再執(zhí)行該機(jī)器碼。 2、解釋執(zhí)行方式:解釋器通過每次解釋并執(zhí)行一小段代碼來完成Java字節(jié)碼程 序的所有操作。   通常采用的是第二種方法。由于JVM規(guī)格描述具有足夠的靈活性,這使得將字節(jié)碼翻譯為機(jī)器代碼的工作具有較高的效率。對于那些對運(yùn)行速度要求較高的應(yīng)用程序,解釋器可將Java字節(jié)碼即時編譯為機(jī)器碼,從而很好地保證了Java代碼的可移植性和高性能。 Java跨平臺的原理 JVM規(guī)格描述 JVM的設(shè)計目標(biāo)是提供一個基于抽象規(guī)格描述的計算機(jī)模型,為解釋程序開發(fā)人員提供很好的靈活性,同時也確保Java代碼可在符合該規(guī)范的任何系統(tǒng)上運(yùn)行。JVM對其實現(xiàn)的某些方面給出了具體的定義,特別是對Java可執(zhí)行代碼,即字節(jié)碼(Bytecode)的格式給出了明確的規(guī)格。這一規(guī)格包括操作碼和操作數(shù)的語法和數(shù)值、標(biāo)識符的數(shù)值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。這些定義為JVM解釋器開發(fā)人員提供了所需的信息和開發(fā)環(huán)境。Java的設(shè)計者希望給開發(fā)人員以隨心所欲使用Java的自由。 JVM是為Java字節(jié)碼定義的一種獨(dú)立于具體平臺的規(guī)格描述,是Java平臺獨(dú)立性的基礎(chǔ)。 Java跨平臺的原理 Java程序執(zhí)行與C/C++程序執(zhí)行的對比分析 如果把Java源程序想象成我們的C++源程序,Java源程序編譯后生成的字節(jié)碼就相當(dāng)于C++源程序編譯后的80x86的機(jī)器碼(二進(jìn)制程序文件),JVM虛擬機(jī)相當(dāng)于80x86計算機(jī)系統(tǒng),Java解釋器相當(dāng)于80x86CPU。在80x86CPU上運(yùn)行的是機(jī)器碼,在Java解釋器上運(yùn)行的是Java字節(jié)碼。 Java解釋器相當(dāng)于運(yùn)行Java字節(jié)碼的“CPU”,但該“CPU”不是通過硬件實現(xiàn)的,而是用軟件實現(xiàn)的。Java解釋器實際上就是特定的平臺下的一個應(yīng)用程序。只要實現(xiàn)了特定平臺下的解釋器程序,Java字節(jié)碼就能通過解釋器程序在該平臺下運(yùn)行,這是Java跨平臺的根本。當(dāng)前,并不是在所有的平臺下都有相應(yīng)Java解釋器程序,這也是Java并不能在所有的平臺下都能運(yùn)行的原因,它只能在已實現(xiàn)了Java解釋器程序的平臺下運(yùn)行。 Java開發(fā)工具包(JDK)的下載 下載網(wǎng)址:http://java.sun.com Java的面向?qū)ο缶幊?主講人:孫鑫 面向?qū)ο缶幊谈攀?簡單的說,面向?qū)ο缶幊蹋∣bject Oriented Programming,簡稱OOP)描述的是對象之間的相互作用。 面向?qū)ο缶幊膛c面向過程編程的區(qū)別: 過程化程序設(shè)計先確定算法,再確定數(shù)據(jù)結(jié)構(gòu);面向?qū)ο缶幊滔却_定數(shù)據(jù)結(jié)構(gòu),再確定運(yùn)算。 面向過程編程的程序員,習(xí)慣于建立數(shù)據(jù)結(jié)構(gòu)存放數(shù)據(jù)并定義方法(函數(shù))來操作數(shù)據(jù);面向?qū)ο缶幊痰某绦騿T則構(gòu)造一個對象模型,將數(shù)據(jù)與方法組織在一起。 對象 對象的狀態(tài) 對象的行為 我們可以把現(xiàn)實世界的事物抽象成對象。 對象一般都有兩個特征:狀態(tài)(state)和行為(behavior)。 軟件的對象概念是由現(xiàn)實世界對象抽象而來 。把現(xiàn)實世界對象的狀態(tài)保存在軟件對象的變量中;現(xiàn)實世界對象的行為通過軟件對象的方法(函數(shù))來實現(xiàn)。 類和對象 把相似的對象劃歸成一個類。 在軟件中,類,就是一個模板,它定義了通用于一個特定種類的所有對象的狀態(tài)(變量)和行為(方法)。 類是創(chuàng)建對象的模板,對象是類的實例。 面向?qū)ο蟪绦蛟O(shè)計 從程序設(shè)計的角度看,類是面向?qū)ο蟪绦蛑凶罨镜某绦騿卧。類實質(zhì)上定義的是一種數(shù)據(jù)類型,這種數(shù)據(jù)類型就是對象類型 。所以我們可以使用類名稱來聲明對象變量。 聲明對象變量之后,還不能使用對象。必須用運(yùn)算符new創(chuàng)建對象實體之后,才能使用對象。 面向?qū)ο缶幊痰碾y點(diǎn) 掌握面向?qū)ο蟮睦щy之處在于思路的轉(zhuǎn)換。 我們通常習(xí)慣于考慮解決問題的方法,而不是考慮將問題抽象成對象再去解決它。 一個簡單的例子 編寫一個駕駛汽車的方法 面向過程的程序設(shè)計: 編寫一個方法,void drivecar(); 面向?qū)ο蟮某绦蛟O(shè)計: 將一輛汽車看成一個對象,將所有汽車對象的共性抽取出來,設(shè)計一個類Car,類中有一個方法void drive(),用Car這個類實例化一個具體的對象car,調(diào)用:car.drive()。 類的構(gòu)造方法 構(gòu)造方法的名字和類名相同,并且沒有返回值。 構(gòu)造方法主要用于為類的對象定義初始化狀態(tài)。 我們不能直接調(diào)用構(gòu)造方法,必須通過new關(guān)鍵字來自動調(diào)用,從而創(chuàng)建類的實例。 Java的類都要求有構(gòu)造方法,如果沒有定義構(gòu)造方法,Java編譯器會為我們提供一個缺省的構(gòu)造方法,也就是不帶參數(shù)的構(gòu)造方法。 new關(guān)鍵字的作用 為對象分配內(nèi)存空間。 引起對象構(gòu)造方法的調(diào)用。 為對象返回一個引用。 缺省構(gòu)造方法 方法的重載(overload) 特殊變量this this變量代表對象本身 當(dāng)類中有兩個同名變量,一個屬于類(類的成員變量),而另一個屬于某個特定的方法(方法中的局部變量),使用this區(qū)分成員變量和局部變量。 使用this簡化構(gòu)造函數(shù)的調(diào)用。 特殊變量this 關(guān)于實例方法和實例數(shù)據(jù)成員的進(jìn)一步說明 一個類所有的實例(對象)調(diào)用的成員方法在內(nèi)存中只有一份拷貝,盡管在內(nèi)存中可能有多個對象,而數(shù)據(jù)成員在類的每個對象所在內(nèi)存中都存在著一份拷貝。this變量允許相同的實例方法為不同的對象工作。每當(dāng)調(diào)用一個實例方法時,this變量將被設(shè)置成引用該實例方法的特定的類對象。方法的代碼接著會與this所代表的對象的特定數(shù)據(jù)建立關(guān)聯(lián)。 關(guān)鍵字static 靜態(tài)方法和靜態(tài)變量是屬于某一個類,而不屬于類的對象。 靜態(tài)方法和靜態(tài)變量的引用直接通過類名引用。 在靜態(tài)方法中不能調(diào)用非靜態(tài)的方法和引用非靜態(tài)的成員變量。反之,則可以。 可以用類的對象obj去調(diào)用靜態(tài)的方法method(),如:obj.method()。 常量的定義 使用關(guān)鍵字final定義常量,例如: final double PI=3.1415926; 作為一種約定,在定義常量時,通常采用大寫形式。 final常量可以在聲明的同時賦初值,也可以在構(gòu)造函數(shù)中賦初值。 為了節(jié)省內(nèi)存,我們通常將常量聲明為靜態(tài)的(static)。 類的繼承 理解繼承是理解面向?qū)ο蟪绦蛟O(shè)計的關(guān)鍵。 在Java中,通過關(guān)鍵字extends繼承一個已有的類,被繼承的類稱為父類(超類,基類),新的類稱為子類(派生類)。 在Java中,不允許多繼承。 方法的覆蓋(override) 在子類中定義一個與父類同名、返回類型、參數(shù)類型均相同一個方法,稱為方法的覆蓋。 覆蓋發(fā)生在子類與父類之間。 特殊變量super 特殊變量super,提供了對父類的訪問。 可以使用super訪問父類被子類隱藏的變量或覆蓋的方法。 每個子類構(gòu)造方法的第一條語句,都是隱含地調(diào)用super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時候就會報錯。 多態(tài)性 通過覆蓋父類的方法來實現(xiàn),在運(yùn)行時根據(jù)傳遞的對象引用,來調(diào)用相應(yīng)的方法。 面向?qū)ο蟮某绦蛟O(shè)計 問題:求一個長方形的周長和面積。 以面向過程的程序設(shè)計方式思考: 1、確定長方形周長和面積的算法。 2、編寫兩個方法(函數(shù))分別計算長方形的周長和面積。 3、求周長的方法(函數(shù))和求面積的方法(函數(shù))需要兩個參數(shù),分別是長方形的長和寬。 面向過程的程序設(shè)計代碼: class Rectangle { static int perimeter(int length,int width) { return 2*(length+width); } static int area(int length,int width) { return length*width; } public static void main(String[] args) { System.out.println("perimeter = “ + Rectangle.perimeter(5,4)); System.out.println("area = “ + Rectangle.area(5,4)); } } 面向?qū)ο蟮某绦蛟O(shè)計 問題:求一個長方形的周長和面積。 以面向?qū)ο蟮某绦蛟O(shè)計方式思考: 1、一個長方形可以看成一個長方形對象。 2、一個長方形對象有兩個狀態(tài)(長和寬)和兩個行為(求周長和求面積)。 3、將所有長方形的共性抽取出來,設(shè)計一個長方形類。 4、通過長方形對象的行為,就可以求出某個具體的長方形對象的周長和面積。 面向?qū)ο蟮某绦蛟O(shè)計 Demo Lesson3 主講人:孫鑫 主要內(nèi)容 包 類的說明符 方法的說明符 對象的銷毀(垃圾內(nèi)存回收的演示) 接口 內(nèi)部類和匿名內(nèi)部類 異常處理 包(package) 為了便于管理大型軟件系統(tǒng)中數(shù)目眾多的類,解決類命名沖突的問題,Java引入了包(package)。 包(package) package語句必須是文件中的第一條語句。也就是說,在package語句之前,除了空白和注釋之外不能有任何語句。 如果不加package語句,則指定為缺省包或無名包。 包對應(yīng)著文件系統(tǒng)的目錄層次結(jié)構(gòu)。 在package語句中,用“.”來指明包(目錄)的層次。 編譯并生成包 在當(dāng)前目錄下生成包 javac –d . Test.java 在指定目錄下生成包 javac –d E:\JavaLesson Test.java import語句 引入包中的類。 import java.io.File; 引入整個包。 import java.io.*; 在同一包中的類可以互相引用,無需import語句。 類的說明符 類的訪問說明符 (1)public (2)default(不加訪問說明符時) 類的其它修飾符 (1)final (2)abstract 方法的說明符 方法的訪問說明符 (1)public (2)protected (3)default(不加訪問說明符時) (4)private 方法的其它修飾符 (1)static (2)final (3)abstract (4)native (5)synchronized 方法的訪問控制 方法的訪問控制 方法的訪問控制 方法的訪問控制 方法的訪問控制 final方法 為了確保某個函數(shù)的行為在繼承過程中保持不變,并且不能被覆蓋(overridden),可以使用final方法。 為了效率上的考慮,將方法聲明為final,讓編譯器對此方法的調(diào)用進(jìn)行優(yōu)化。要注意的是:編譯器會自行對final方法進(jìn)行判斷,并決定是否進(jìn)行優(yōu)化。通常在方法的體積很小,而我們確實不希望它被覆蓋時,才將它聲明為final。 class中所有的private和static方法自然就是final。 抽象方法和抽象類 在類中沒有方法體的方法,就是抽象方法。 含有抽象方法的類,即為抽象類。 如果一個子類沒有實現(xiàn)抽象基類中所有的抽象方法,則子類也成為一個抽象類。 我們可以將一個沒有任何抽象方法的類聲明為abstract,避免由這個類產(chǎn)生任何的對象。 構(gòu)造方法、靜態(tài)方法、私有方法、final方法不能被聲明為抽象的方法。 native方法 native方法是用戶在Java中可以使用,但不能編寫的方法。 JNI(Java Native Interface),它允許Java虛擬機(jī)(JVM)內(nèi)部運(yùn)行的Java代碼能夠與用其它編程語言(如C、C++、匯編語言)編寫的應(yīng)用程序和庫進(jìn)行互操作。 JNI最大的好處是它沒有對底層Java虛擬機(jī)的實現(xiàn)施加任何限制,因此,Java虛擬機(jī)廠商可以在不影響虛擬機(jī)其它部分的情況下添加對JNI的支持。程序員只需編寫一種版本的本地(Native)應(yīng)用程序和庫,就能夠與所有支持JNI的Java虛擬機(jī)協(xié)同工作。 JNI可以理解為Java和本地應(yīng)用程序之間的中介。 接口 接口中所有的方法都是public abstract。 在接口中聲明方法時,不能使用native、static 、final 、synchronized 、private 、protected等修飾符。 和public類一樣,public接口也必須定義在與接口同名的文件中。 接口 接口中可以有數(shù)據(jù)成員,這些成員默認(rèn)都是public static final。 接口 一個接口可以繼承自另一個接口。 Java中不允許類的多繼承,但允許接口的多繼承。 接口 在Java中,一個類可以實現(xiàn)多個接口。 一個類在繼承另外一個類的同時,可以實現(xiàn)多個接口。 內(nèi)部類 在一個類中定義另外一個類,這個類就叫做內(nèi)部類或內(nèi)置類 (inner class) 。 內(nèi)部類可以讓我們將邏輯上相關(guān)的一組類組織起來,并由外部類(outer class)來控制內(nèi)部類的可見性。 當(dāng)我們建立一個inner class時,其對象就擁有了與外部類對象之間的一種關(guān)系,這是通過一個特殊的this reference形成的,使得內(nèi)部類對象可以隨意的訪問外部類中所有的成員。 內(nèi)部類 在方法中定義的內(nèi)部類,如果要訪問方法中定義的本地變量或方法的參數(shù),則變量必須被聲明final。 內(nèi)部類可以聲明為private或protected;還可以聲明為abstract或final。 內(nèi)部類可以聲明為static的,但此時就不能再使用外部類的非static的成員變量和非static的成員方法; 非static的內(nèi)部類中的成員不能聲明為static的,只有在頂層類或static的內(nèi)部類中才可聲明static成員。 內(nèi)部類 我們?yōu)槭裁词褂脙?nèi)部類 1、在內(nèi)部類(inner class)中,可以隨意的訪問外部類的成員,這可以讓我們更好地組織管理我們的代碼,增強(qiáng)代碼的可讀性。 2、內(nèi)部類可以用于創(chuàng)建適配器類,適配器類是用于實現(xiàn)接口的類。使用內(nèi)部類來實現(xiàn)接口,可以更好地定位與接口關(guān)聯(lián)的方法在代碼中的位置。 3、內(nèi)部類的更多用法。 異常類的層次結(jié)構(gòu) 異常處理 打開一個不存在的文件、網(wǎng)絡(luò)連接中斷、數(shù)組下標(biāo)越界、正在加載的類文件丟失等都會引發(fā)異常。 Java中的異常類定義了程序中遇到的輕微的錯誤條件。 Java中的錯誤類定義了程序中不能恢復(fù)的嚴(yán)重錯誤條件。如內(nèi)存溢出、類文件格式錯誤等。這一類錯誤由Java運(yùn)行系統(tǒng)處理,不需要我們?nèi)ヌ幚怼?異常處理 Java程序在執(zhí)行過程中如出現(xiàn)異常,會自動生成一個異常類對象,該異常對象將被提交給Java運(yùn)行時系統(tǒng),這個過程稱為拋出(throw)異常。 當(dāng)Java運(yùn)行時系統(tǒng)接收到異常對象時,會尋找能處理這一異常的代碼并把當(dāng)前異常對象交給其處理,這一過程稱為捕獲(catch)異常。 如果Java運(yùn)行時系統(tǒng)找不到可以捕獲異常的方法,則運(yùn)行時系統(tǒng)將終止,相應(yīng)的Java程序也將退出。 try/catch/finally語句。 異常處理 對于RuntimeException,通常不需要我們?nèi)ゲ东@,這類異常由Java運(yùn)行系統(tǒng)自動拋出并自動處理。 如果父類中的方法拋出多個異常,則子類中的覆蓋方法要么拋出相同的異常,要么拋出異常的子類,但不能拋出新的異常(注:構(gòu)造方法除外)。 我們可以在方法聲明時,聲明一個不會拋出的異常,Java編譯器就會強(qiáng)迫方法的使用者對異常進(jìn)行處理。這種方式通常應(yīng)用于abstract base class和interface中。 Java編程規(guī)范 package的命名 package 的名字由全部小寫的字母組成,例如:cn.mybole。 class和interface的命名 class和interface的名字由大寫字母開頭而其他字母都小寫的單詞組成,例如:Person,RuntimeException。 class變量的命名 變量的名字用一個小寫字母開頭,后面的單詞用大寫字母開頭,例如:index,currentImage。 class方法的命名 方法的名字用一個小寫字母開頭,后面的單詞用大寫字母開頭,例如:run(),getBalance()。 static final變量的命名 static final變量的名字所有字母都大寫,并且能表示完整含義。例如:PI,PASSWORD。 參數(shù)的命名 參數(shù)的名字和變量的命名規(guī)范一致。 數(shù)組的命名 數(shù)組應(yīng)該總是用這樣的方式來命名:byte[] buffer。 附:JVM 規(guī)格描述 JVM定義了控制Java代碼解釋執(zhí)行和具體實現(xiàn)的五種規(guī)格 JVM指令系統(tǒng) JVM寄存器 JVM棧結(jié)構(gòu) JVM碎片回收堆 JVM存儲區(qū) 附:JVM 規(guī)格描述 JVM指令系統(tǒng) JVM指令系統(tǒng)同其他計算機(jī)的指令系統(tǒng)極其相似。Java指令也是由操作碼和操作數(shù)兩部分組成。操作碼為8位二進(jìn)制數(shù),操作數(shù)緊隨在操作碼的后面,其長度根據(jù)需要而不同。操作碼用于指定一條指令操作的性質(zhì)(在這里我們采用匯編符號的形式進(jìn)行說明),如iload表示從存儲器中裝入一個整數(shù),anewarray表示為一個新數(shù)組分配空間,iand表示兩個整數(shù)的“與”,ret用于流程控制,表示從對某一方法的調(diào)用中返回。當(dāng)長度大于8位時,操作數(shù)被分為兩個以上字節(jié)存放。JVM采用了“big endian”的編碼方式來處理這種情況,即高位bits存放在低字節(jié)中。這同 Motorola及其他的RISC CPU采用的編碼方式是一致的,而與Intel采用的“little endian ”的編碼方式即低位bits存放在低位字節(jié)的方法不同。   Java指令系統(tǒng)是以Java語言的實現(xiàn)為目的設(shè)計的,其中包含了用于調(diào)用方法和監(jiān)視多線程系統(tǒng)的指令。 附:JVM 規(guī)格描述 JVM寄存器 所有的CPU均包含用于保存系統(tǒng)狀態(tài)和處理器所需信息的寄存器組。如果虛擬機(jī)定義較多的寄存器,便可以從中得到更多的信息而不必對;騼(nèi)存進(jìn)行訪問,這有利于提高運(yùn)行速度。然而,如果虛擬機(jī)中的寄存器比實際CPU的寄存器多,在實現(xiàn)虛擬機(jī)時就會占用處理器大量的時間來用常規(guī)存儲器模擬寄存器,這反而會降低虛擬機(jī)的效率。針對這種情況,JVM只設(shè)置了4個最為常用的寄存器。它們是:   pc程序計數(shù)器   optop操作數(shù)棧頂指針   frame當(dāng)前執(zhí)行環(huán)境指針   vars指向當(dāng)前執(zhí)行環(huán)境中第一個局部變量的指針 所有寄存器均為32位。pc用于記錄程序的執(zhí)行。optop,frame和vars用于記錄指向Java棧區(qū)的指針。 附:JVM 規(guī)格描述 JVM棧結(jié)構(gòu) 作為基于棧結(jié)構(gòu)的計算機(jī),Java棧是JVM存儲信息的主要方法。當(dāng)JVM得到一個Java字節(jié)碼應(yīng)用程序后,便為該代碼中一個類的每一個方法創(chuàng)建一個棧框架,以保存該方法的狀態(tài)信息。每個?蚣馨ㄒ韵氯愋畔ⅲ   局部變量   執(zhí)行環(huán)境   操作數(shù)棧 局部變量用于存儲一個類的方法中所用到的局部變量。vars寄存器指向該變量表中的第一個局部變量。   執(zhí)行環(huán)境用于保存解釋器對Java字節(jié)碼進(jìn)行解釋過程中所需的信息。它們是:上次調(diào)用的方法、局部變量指針和操作數(shù)棧的棧頂和棧底指針。執(zhí)行環(huán)境是執(zhí)行一個方法的控制中心。例如:如果解釋器要執(zhí)行iadd(整數(shù)加法),首先要從frame寄存器中找到當(dāng)前執(zhí)行環(huán)境,而后便從執(zhí)行環(huán)境中找到操作數(shù)棧,從棧頂彈出兩個整數(shù)進(jìn)行加法運(yùn)算,最后將結(jié)果壓入棧頂。 操作數(shù)棧用于存儲運(yùn)算所需操作數(shù)及運(yùn)算的結(jié)果。 附:JVM 規(guī)格描述 JVM碎片回收堆 Java類的實例(對象)所需的存儲空間是在堆上分配的。解釋器具體承擔(dān)為類實例分配空間的工作。解釋器在為一個實例分配完存儲空間后,便開始記錄對該實例所占用的內(nèi)存區(qū)域的使用。一旦對象使用完畢,便將其回收到堆中。 在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放內(nèi)存。對內(nèi)存進(jìn)行釋放和回收的工作是由Java運(yùn)行系統(tǒng)承擔(dān)的。這允許Java運(yùn)行系統(tǒng)的設(shè)計者自己決定碎片回收的方法。在SUN公司開發(fā)的Java解釋器和Hot Java環(huán)境中,碎片回收用后臺線程的方式來執(zhí)行。這不但為運(yùn)行系統(tǒng)提供了良好的性能,而且使程序設(shè)計人員擺脫了自己控制內(nèi)存使用的風(fēng)險。 附:JVM 規(guī)格描述 JVM存儲區(qū) JVM有兩類存儲區(qū):常量緩沖池和方法區(qū)。常量緩沖池用于存儲類名稱、方法和字段名稱以及串常量。方法區(qū)則用于存儲Java方法的字節(jié)碼。對于這兩種存儲區(qū)域具體實現(xiàn)方式在JVM規(guī)格中沒有明確規(guī)定。這使得Java應(yīng)用程序的存儲布局必須在運(yùn)行過程中確定,依賴于具體平臺的實現(xiàn)方式。 Lesson4 主講人:孫鑫 主要內(nèi)容 Java的常用包 “==”和“equals”的用法 基本數(shù)據(jù)類型與引用類型 String和StringBuffer 對象的克。╟lone) 數(shù)組的相關(guān)操作 封裝類 Runtime類與Process類 Class類 設(shè)計模式 Java的常用包 java.applet:包含一些用于創(chuàng)建Java小應(yīng)用程序的類。 java.awt:包含一些用于編寫與平臺無關(guān)的圖形界面(GUI)應(yīng)用程序的類。 java.io:包含一些用作輸入輸出(I/O)處理的類。 java.lang:包含一些Java語言的基本類與核心類,如String、Math、Integer、System和Runtime,提供常用的功能,這個包中的所有類是被隱式導(dǎo)入的。 java.net:包含用于建立網(wǎng)絡(luò)連接的類,與java.io同時使用完成與網(wǎng)絡(luò)有關(guān)的讀寫。 java.util:包含一些實用工具類和數(shù)據(jù)結(jié)構(gòu)類。 “==”和“equals”的用法 在Java中,boolean、byte、short、int、long、char、float、double這八種是基本數(shù)據(jù)類型,其余的都是引用類型。 “==”是比較兩個變量的值是否相等,“equals”是比較兩個對象變量所代表的對象的內(nèi)容是否相等。 對象的內(nèi)存分配圖 String和StringBuffer String str=“abc”; int i=3; float f=4.5f; char ch='a'; boolean b=true; System.out.println(str + i + f + ch + b); 針對String的“+”和“+=”,是Java中唯一被重載的操作符;在Java中,不允許程序員重載操作符。 String和StringBuffer String類對象一個常量對象。 String str=“abc”; str=“def”; 在處理大量字符串的程序中,我們通常用StringBuffer來替代String。 數(shù)組的內(nèi)存分配圖 基本數(shù)據(jù)類型一維數(shù)組內(nèi)存分配 數(shù)組的內(nèi)存分配圖 基本數(shù)據(jù)類型一維數(shù)組內(nèi)存分配 對象數(shù)組的內(nèi)存分配 對象數(shù)組的內(nèi)存分配 對象數(shù)組的內(nèi)存分配 函數(shù)的調(diào)用 在Java中,傳參時,都是以傳值的方式進(jìn)行。 對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝;對于引用類型,傳遞的引用的拷貝。 函數(shù)的調(diào)用 函數(shù)的調(diào)用 對象的克隆(clone) 為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法。 在派生類中覆蓋基類的clone()方法,并聲明為public。 在派生類的clone()方法中,調(diào)用super.clone()。 在派生類中實現(xiàn)Cloneable接口。 對象的克隆(clone) 為什么我們在派生類中覆蓋Object的clone()方法時,一定要調(diào)用super.clone()呢?在運(yùn)行時刻,Object中的clone()識別出你要復(fù)制的是哪一個對象,然后為此對象分配空間,并進(jìn)行對象的復(fù)制,將原始對象的內(nèi)容一一復(fù)制到新對象的存儲空間中。 數(shù)組的相關(guān)操作 在Java中,所有的數(shù)組都有一個缺省的屬性length,用于獲取數(shù)組中元素的個數(shù)。 數(shù)組的復(fù)制:System.arraycopy()。 數(shù)組的排序:Arrays.sort()。 在已排序的數(shù)組中查找某個元素:Arrays.binarySearch()。 封裝類 針對八種基本數(shù)據(jù)類型定義的相應(yīng)的引用類型-封裝類。 Class類 在Java中,每個class都有一個相應(yīng)的Class對象。也就是說,當(dāng)我們編寫一個類,編譯完成后,在生成的.class文件中,就會產(chǎn)生一個Class對象,用于表示這個類的類型信息。 獲取Class實例的三種方式: (1)利用對象調(diào)用getClass()方法獲取該對象的Class實例; (2)使用Class類的靜態(tài)方法forName(),用類的名字獲取一個Class實例; (3)運(yùn)用.class的方式來獲取Class實例,對于基本數(shù)據(jù)類型的封裝類,還可以采用.TYPE來獲取相對應(yīng)的基本數(shù)據(jù)類型的Class實例。 Class類 在運(yùn)行期間,如果我們要產(chǎn)生某個類的對象,Java虛擬機(jī)(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據(jù)類的名稱找到.class文件并加載它。一旦某個類型的Class對象已被加載到內(nèi)存,就可以用它來產(chǎn)生該類型的所有對象。 newInstance() 調(diào)用類中缺省的構(gòu)造方法。 Runtime類和Process類 每一個Java程序都有一個Runtime類的單一實例。 通過Runtime.getRuntime()獲取Runtime類的實例。 Runtime類是使用單例模式的一個例子。 設(shè)計模式 在我們進(jìn)行程序設(shè)計時,逐漸形成了一些典型問題和問題的解決方案,這就是軟件模式。 每一個模式描述了一個在我們程序設(shè)計中經(jīng)常發(fā)生的問題,以及該問題的解決方案。 當(dāng)我們碰到模式所描述的問題,就可以直接用相應(yīng)的解決方法去解決這個問題,這就是設(shè)計模式。 設(shè)計模式 單例(Singleton)模式 (1)一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例,這個類稱為單例類。 (2)單例類的一個最重要的特點(diǎn)是類的構(gòu)造方法是私有的,從而避免了外部利用構(gòu)造方法直接創(chuàng)建多個實例。 單例類的實現(xiàn) Lesson5 多線程 主講人:孫鑫 程序、進(jìn)程和線程 程序是計算機(jī)指令的集合,它以文件的形式存儲在磁盤上。 進(jìn)程:是一個程序在其自身的地址空間中的一次執(zhí)行活動。 進(jìn)程是資源申請、調(diào)度和獨(dú)立運(yùn)行的單位,因此,它使用系統(tǒng)中的運(yùn)行資源;而程序不能申請系統(tǒng)資源,不能被系統(tǒng)調(diào)度,也不能作為獨(dú)立運(yùn)行的單位,因此,它不占用系統(tǒng)的運(yùn)行資源。 線程:是進(jìn)程中的一個單一的連續(xù)控制流程。一個進(jìn)程可以擁有多個線程。 線程又稱為輕量級進(jìn)程,它和進(jìn)程一樣擁有獨(dú)立的執(zhí)行控制,由操作系統(tǒng)負(fù)責(zé)調(diào)度,區(qū)別在于線程沒有獨(dú)立的存儲空間,而是和所屬進(jìn)程中的其它線程共享一個存儲空間,這使得線程間的通信遠(yuǎn)較進(jìn)程簡單。 單線程程序與多線程程序 Java對多線程的支持 Java在語言級提供了對多線程程序設(shè)計的支持。 實現(xiàn)多線程程序的兩種方式: (1)從Thread類繼承; (2)實現(xiàn)Runnable接口。 Java對多線程的支持 Java運(yùn)行時系統(tǒng)實現(xiàn)了一個用于調(diào)度線程執(zhí)行的線程調(diào)度器,用于確定某一時刻由哪一個線程在CPU上運(yùn)行。 在java技術(shù)中,線程通常是搶占式的而不需要時間片分配進(jìn)程(分配給每個線程相等的CPU時間的進(jìn)程)。搶占式調(diào)度模型就是許多線程處于可以運(yùn)行狀態(tài)(等待狀態(tài)),但實際上只有一個線程在運(yùn)行。該線程一直運(yùn)行到它終止進(jìn)入可運(yùn)行狀態(tài)(等待狀態(tài)),或者另一個具有更高優(yōu)先級的線程變成可運(yùn)行狀態(tài)。在后一種情況下,低優(yōu)先級的線程被高優(yōu)先級的線程搶占,高優(yōu)先級的線程獲得運(yùn)行的機(jī)會。 Java線程調(diào)度器支持不同優(yōu)先級線程的搶先方式,但其本身不支持相同優(yōu)先級線程的時間片輪換。 Java運(yùn)行時系統(tǒng)所在的操作系統(tǒng)(例如:Windows2000)支持時間片的輪換,則線程調(diào)度器就支持相同優(yōu)先級線程的時間片輪換。 線程的同步 The code segments within a program that access the same object from separate, concurrent threads are called “critical sections”。 同步的兩種方式:同步塊和同步方法 每一個對象都有一個監(jiān)視器,或者叫做鎖。 同步方法利用的是this所代表的對象的鎖。 每個class也有一個鎖,是這個class所對應(yīng)的Class對象的鎖。 線程的死鎖 哲學(xué)家進(jìn)餐的問題 線程1鎖住了對象A的監(jiān)視器,等待對象B的監(jiān)視器,線程2鎖住了對象B的監(jiān)視器,等待對象A的監(jiān)視器,就造成了死鎖。 wait、notify、notifyAll 每一個對象除了有一個鎖之外,還有一個等待隊列(wait set),當(dāng)一個對象剛創(chuàng)建的時候,它的對待隊列是空的。 我們應(yīng)該在當(dāng)前線程鎖住對象的鎖后,去調(diào)用該對象的wait方法。 當(dāng)調(diào)用對象的notify方法時,將從該對象的等待隊列中刪除一個任意選擇的線程,這個線程將再次成為可運(yùn)行的線程。 當(dāng)調(diào)用對象的notifyAll方法時,將從該對象的等待隊列中刪除所有等待的線程,這些線程將成為可運(yùn)行的線程。 wait和notify主要用于producer-consumer這種關(guān)系中。 線程的狀態(tài) 線程的終止 設(shè)置一個flag變量。 結(jié)合interrupt()方法。 Java Language Specification 網(wǎng)址:http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html Lesson6 集合類 主講人:孫鑫 集合框架中的接口 集合框架中的接口 Collection:集合層次中的根接口,JDK沒有提供這個接口直接的實現(xiàn)類。 Set:不能包含重復(fù)的元素。SortedSet是一個按照升序排列元素的Set。 List:是一個有序的集合,可以包含重復(fù)的元素。提供了按索引訪問的方式。 Map:包含了key-value對。Map不能包含重復(fù)的key。SortedMap是一個按照升序排列key的Map。 集合框架中的實現(xiàn)類 ArrayList ArrayList:我們可以將其看作是能夠自動增長容量的數(shù)組。 利用ArrayList的toArray()返回一個數(shù)組。 Arrays.asList()返回一個列表。 迭代器(Iterator) 給我們提供了一種通用的方式來訪問集合中的元素。 迭代器的工作原理 Collections類 排序:Collections.sort() (1)自然排尋(natural ordering ); (2)實現(xiàn)比較器(Comparator)接口。 取最大和最小的元素:Collections.max()、Collections.min()。 在已排序的List中搜索指定的元素:Collectons.binarySearch()。 LinkedList LinkedList是采用雙向循環(huán)鏈表實現(xiàn)的。 利用LinkedList實現(xiàn)棧(stack)、隊列(queue)、雙向隊列(double-ended queue )。 數(shù)據(jù)結(jié)構(gòu) 一般將數(shù)據(jù)結(jié)構(gòu)分為兩大類:線性數(shù)據(jù)結(jié)構(gòu)和非線性數(shù)據(jù)結(jié)構(gòu)。線性數(shù)據(jù)結(jié)構(gòu)有線性表、棧、隊列、串、數(shù)組和文件;非線性數(shù)據(jù)結(jié)構(gòu)有樹和圖。 線性表 線性表的邏輯結(jié)構(gòu)是n個數(shù)據(jù)元素的有限序列: (a1, a2 ,a3,…an) n為線性表的長度(n≥0),n=0的表稱為空表。 數(shù)據(jù)元素呈線性關(guān)系。必存在唯一的稱為“第一個”的數(shù)據(jù)元素;必存在唯一的稱為“最后一個”的數(shù)據(jù)元素;除第一個元素外,每個元素都有且只有一個前驅(qū)元素; 除最后一個元素外,每個元素都有且只有一個后繼元素。 所有數(shù)據(jù)元素在同一個線性表中必須是相同的數(shù)據(jù)類型。 線性表 線性表按其存儲結(jié)構(gòu)可分為順序表和鏈表。用順序存儲結(jié)構(gòu)存儲的線性表稱為順序表;用鏈?zhǔn)酱鎯Y(jié)構(gòu)存儲的線性表稱為鏈表。 將線性表中的數(shù)據(jù)元素依次存放在某個存儲區(qū)域中,所形成的表稱為順序表。一維數(shù)組就是用順序方式存儲的線性表。 鏈表 單向鏈表 鏈表 鏈表 循環(huán)鏈表 鏈表 雙向循環(huán)鏈表 棧 棧(Stack)也是一種特殊的線性表,是一種后進(jìn)先出(LIFO)的結(jié)構(gòu)。 棧是限定僅在表尾進(jìn)行插入和刪除運(yùn)算的線性表,表尾稱為棧頂(top),表頭稱為棧底(bottom)。 棧的物理存儲可以用順序存儲結(jié)構(gòu),也可以用鏈?zhǔn)酱鎯Y(jié)構(gòu)。 隊列 隊列(Queue)是限定所有的插入只能在表的一端進(jìn)行,而所有的刪除都在表的另一端進(jìn)行的線性表。 表中允許插入的一端稱為隊尾(Rear),允許刪除的一端稱為隊頭(Front)。 隊列的操作是按先進(jìn)先出(FIFO)的原則進(jìn)行的。 隊列的物理存儲可以用順序存儲結(jié)構(gòu),也可以用鏈?zhǔn)酱鎯Y(jié)構(gòu)。 ArrayList和LinkedList的比較 ArrayList底層采用數(shù)組完成,而LinkedList則是以一般的雙向鏈表(double-linked list)完成,其內(nèi)每個對象除了數(shù)據(jù)本身外,還有兩個 引用,分別指向前一個元素和后一個元素。 如果我們經(jīng)常在List的開始處增加元素,或者在List中進(jìn)行插入和刪除操作,我們應(yīng)該使用LinkedList,否則的話,使用ArrayList將更加快速。 HashSet 實現(xiàn)Set接口的hash table(哈希表),依靠HashMap來實現(xiàn)的。 我們應(yīng)該為要存放到散列表的各個對象定義hashCode()和equals()。 散列表 散列表又稱為哈希表。散列表算法的基本思想是: 以結(jié)點(diǎn)的關(guān)鍵字為自變量,通過一定的函數(shù)關(guān)系(散列函數(shù))計算出對應(yīng)的函數(shù)值,以這個值作為該結(jié)點(diǎn)存儲在散列表中的地址。 當(dāng)散列表中的元素存放太滿,就必須進(jìn)行再散列,將產(chǎn)生一個新的散列表,所有元素存放到新的散列表中,原先的散列表將被刪除。在Java語言中,通過負(fù)載因子(load factor)來決定何時對散列表進(jìn)行再散列。例如:如果負(fù)載因子是0.75,當(dāng)散列表中已經(jīng)有75%的位置已經(jīng)放滿,那么將進(jìn)行再散列。 負(fù)載因子越高(越接近1.0),內(nèi)存的使用效率越高,元素的尋找時間越長。負(fù)載因子越低(越接近0.0),元素的尋找時間越短,內(nèi)存浪費(fèi)越多。 HashSet類的缺省負(fù)載因子是0.75。 TreeSet TreeSet是依靠TreeMap來實現(xiàn)的。 TreeSet是一個有序集合,TreeSet中元素將按照升序排列,缺省是按照自然順序進(jìn)行排列,意味著TreeSet中元素要實現(xiàn)Comparable接口。 我們可以在構(gòu)造TreeSet對象時,傳遞實現(xiàn)了Comparator接口的比較器對象。 HashSet和TreeSet的比較 HashSet是基于Hash算法實現(xiàn)的,其性能通常都優(yōu)于TreeSet。我們通常都應(yīng)該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。 HashMap HashMap對key進(jìn)行散列。 keySet()、values()、entrySet()。 TreeMap TreeMap按照key進(jìn)行排序。 HashMap和TreeMap的比較 和Set類似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的時候,才使用TreeMap。 Java1.0/1.1的集合類 Vector:用ArrayList代替Vector。 Hashtable:用HashMap代替Hashtable。 Satck:用LinkedList代替Stack。 Properties Lesson7 I/O 主講人:孫鑫 File類 一個File類的對象,表示了磁盤上的文件或目錄。 File類提供了與平臺無關(guān)的方法來對磁盤上的文件或目錄進(jìn)行操作。 流式I/O 流(Stream)是字節(jié)的源或目的。 兩種基本的流是:輸入流(Input Stream)和輸出流(Output Stream)?蓮闹凶x出一系列字節(jié)的對象稱為輸入流。而能向其中寫入一系列字節(jié)的對象稱為輸出流。 流的分類 節(jié)點(diǎn)流:從特定的地方讀寫的流類,例如:磁盤或一塊內(nèi)存區(qū)域。 過濾流:使用節(jié)點(diǎn)流作為輸入或輸出。過濾流是使用一個已經(jīng)存在的輸入流或輸出流連接創(chuàng)建的。 InputStream 三個基本的讀方法 abstract int read() :讀取一個字節(jié)數(shù)據(jù),并返回讀到的數(shù)據(jù),如果返回-1,表示讀到了輸入流的末尾。 int read(byte[] b) :將數(shù)據(jù)讀入一個字節(jié)數(shù)組,同時返回實際讀取的字節(jié)數(shù)。如果返回-1,表示讀到了輸入流的末尾。 int read(byte[] b, int off, int len) :將數(shù)據(jù)讀入一個字節(jié)數(shù)組,同時返回實際讀取的字節(jié)數(shù)。如果返回-1,表示讀到了輸入流的末尾。off指定在數(shù)組b中存放數(shù)據(jù)的起始偏移位置;len指定讀取的最大字節(jié)數(shù)。 其它方法 long skip(long n) :在輸入流中跳過n個字節(jié),并返回實際跳過的字節(jié)數(shù)。 int available() :返回在不發(fā)生阻塞的情況下,可讀取的字節(jié)數(shù)。 void close() :關(guān)閉輸入流,釋放和這個流相關(guān)的系統(tǒng)資源。 void mark(int readlimit) :在輸入流的當(dāng)前位置放置一個標(biāo)記,如果讀取的字節(jié)數(shù)多于readlimit設(shè)置的值,則流忽略這個標(biāo)記。 void reset() :返回到上一個標(biāo)記。 boolean markSupported() :測試當(dāng)前流是否支持mark和reset方法。如果支持,返回true,否則返回false。 java.io包中 InputStream的類層次 OutputStream 三個基本的寫方法 abstract void write(int b) :往輸出流中寫入一個字節(jié)。 void write(byte[] b) :往輸出流中寫入數(shù)組b中的所有字節(jié)。 void write(byte[] b, int off, int len) :往輸出流中寫入數(shù)組b中從偏移量off開始的len個字節(jié)的數(shù)據(jù)。 其它方法 void flush() :刷新輸出流,強(qiáng)制緩沖區(qū)中的輸出字節(jié)被寫出。 void close() :關(guān)閉輸出流,釋放和這個流相關(guān)的系統(tǒng)資源。 java.io包中 OutputStream的類層次 基本的流類 FileInputStream和FileOutputStream 節(jié)點(diǎn)流,用于從文件中讀取或往文件中寫入字節(jié)流。如果在構(gòu)造FileOutputStream時,文件已經(jīng)存在,則覆蓋這個文件。 BufferedInputStream和BufferedOutputStream 過濾流,需要使用已經(jīng)存在的節(jié)點(diǎn)流來構(gòu)造,提供帶緩沖的讀寫,提高了讀寫的效率。 DataInputStream和DataOutputStream 過濾流,需要使用已經(jīng)存在的節(jié)點(diǎn)流來構(gòu)造,提供了讀寫Java中的基本數(shù)據(jù)類型的功能。 PipedInputStream和PipedOutputStream 管道流,用于線程間的通信。一個線程的PipedInputStream對象從另一個線程的PipedOutputStream對象讀取輸入。要使管道流有用,必須同時構(gòu)造管道輸入流和管道輸出流。 Java I/O庫的設(shè)計原則 Java的I/O庫提供了一個稱做鏈接的機(jī)制,可以將一個流與另一個流首尾相接,形成一個流管道的鏈接。這種機(jī)制實際上是一種被稱為Decorator(裝飾)設(shè)計模式的應(yīng)用。 通過流的鏈接,可以動態(tài)的增加流的功能,而這種功能的增加是通過組合一些流的基本功能而動態(tài)獲取的。 我們要獲取一個I/O對象,往往需要產(chǎn)生多個I/O對象,這也是Java I/O庫不太容易掌握的原因,但在I/O庫中Decorator模式的運(yùn)用,給我們提供了實現(xiàn)上的靈活性。 I/O流的鏈接 Reader和Writer Java程序語言使用Unicode來表示字符串和字符。 Reader和Writer這兩個抽象類主要用來讀寫字符流。 java.io包中Reader的類層次 java.io包中Writer的類層次 字符集的編碼 ASCII(American Standard Code for Information Interchange,美國信息互換標(biāo)準(zhǔn)代碼),是基于常用的英文字符的一套電腦編碼系統(tǒng)。我們知道英文中經(jīng)常使用的字符、數(shù)字符號被計算機(jī)處理時都是以二進(jìn)制碼的形式出現(xiàn)的。這種二進(jìn)制碼的集合就是所謂的ASCII碼。每一個ASCII碼與一個8位(bit)二進(jìn)制數(shù)對應(yīng)。其最高位是0,相應(yīng)的十進(jìn)制數(shù)是0-127。如,數(shù)字“0”的編碼用十進(jìn)制數(shù)表示就是48。另有128個擴(kuò)展的ASCII碼,最高位都是1,由一些制表符和其它符號組成。ASCII是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)。 GB2312:GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字符集-基本集》。主要用于給每一個中文字符指定相應(yīng)的數(shù)字,也就是進(jìn)行編碼。一個中文字符用兩個字節(jié)的數(shù)字來表示,為了和ASCII碼有所區(qū)別,將中文字符每一個字節(jié)的最高位置都用1來表示。 GBK:為了對更多的字符進(jìn)行編碼,國家又發(fā)布了新的編碼系統(tǒng)GBK(GBK的K是“擴(kuò)展”的漢語拼音第一個字母)。在新的編碼系統(tǒng)里,除了完全兼容GB2312 外,還對繁體中文、一些不常用的漢字和許多符號進(jìn)行了編碼。 ISO-8859-1:是西方國家所使用的字符編碼集,是一種單字節(jié)的字符集 ,而英文實際上只用了其中數(shù)字小于128的部分。 字符集的編碼 Unicode:這是一種通用的字符集,對所有語言的文字進(jìn)行了統(tǒng)一編碼,對每一個字符都用2個字節(jié)來表示,對于英文字符采取前面加“0”字節(jié)的策略實現(xiàn)等長兼容。如 “a” 的ASCII碼為0x61,UNICODE就為0x00,0x61。 UTF-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集標(biāo)準(zhǔn)的一個超集)。一個7位的ASCII碼值,對應(yīng)的UTF碼是一個字節(jié)。如果字符是0x0000,或在0x0080與0x007f之間,對應(yīng)的UTF碼是兩個字節(jié),如果字符在0x0800與0xffff之間,對應(yīng)的UTF碼是三個字節(jié)。 RandomAccessFile RandomAccessFile類同時實現(xiàn)了DataInput和DataOutput接口,提供了對文件隨機(jī)存取的功能,利用這個類可以在文件的任何位置讀取或?qū)懭霐?shù)據(jù)。 RandomAccessFile類提供了一個文件指針,用來標(biāo)志要進(jìn)行讀寫操作的下一數(shù)據(jù)的位置。 對象序列化 將對象轉(zhuǎn)換為字節(jié)流保存起來,并在日后還原這個對象,這種機(jī)制叫做對象序列化。 將一個對象保存到永久存儲設(shè)備上稱為持續(xù)性。 一個對象要想能夠?qū)崿F(xiàn)序列化,必須實現(xiàn)Serializable接口或Externalizable接口。 對象序列化 當(dāng)一個對象被序列化時,只保存對象的非靜態(tài)成員變量,不能保存任何的成員方法和靜態(tài)的成員變量。 如果一個對象的成員變量是一個對象,那么這個對象的數(shù)據(jù)成員也會被保存。 如果一個可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操作將會失敗,并且會拋出一個NotSerializableException。我們可以將這個引用標(biāo)記為transient,那么對象仍然可以序列化。 總結(jié) InputStream和OutputStream:字節(jié)流的輸入輸出。 Reader和Writer:字符流的輸入輸出。 流的鏈接(Java I/O庫的設(shè)計原則) Java圖形界面編程 主講人:孫鑫 AWT AWT(Abstract Window Toolkit),抽象窗口工具包,SUN公司提供的用于圖形界面編程(GUI)的類庫。基本的AWT庫處理用戶界面元素的方法是把這些元素的創(chuàng)建和行為委托給每個目標(biāo)平臺上(Windows、Unix、Macintosh等)的本地GUI工具進(jìn)行處理。例如:如果我們使用AWT在一個Java窗口中放置一個按鈕,那么實際上使用的是一個具有本地外觀和感覺的按鈕。這樣,從理論上來說,我們所編寫的圖形界面程序能運(yùn)行在任何平臺上,做到了圖形界面程序的跨平臺運(yùn)行。 布局管理器 容器里組件的位置和大小是由布局管理器來決定的。容器對布局管理器的特定實例保持一個引用。當(dāng)容器需要定位一個組件時,它將調(diào)用布局管理器來完成。當(dāng)決定一個組件的大小時,也是如此。 在AWT中,給我們提供了五種布局管理器:BorderLayout FlowLayout GridLayout CardLayout GridBagLayout 布局管理器 我們可以通過設(shè)置空布局管理器,來控制組件的大小和位置。調(diào)用setLayout(null)。 在設(shè)置空布局管理器后,必須對所有的組件調(diào)用setLocation(),setSize()或setBounds(),將它們定位在容器中。 網(wǎng)絡(luò)編程 主講人:孫鑫 計算機(jī)網(wǎng)絡(luò) 計算機(jī)網(wǎng)絡(luò)是相互連接的獨(dú)立自主的計算機(jī)的集合,最簡單的網(wǎng)絡(luò)形式由兩臺計算機(jī)組成。 兩臺計算機(jī)通過網(wǎng)絡(luò)進(jìn)行通信 IP地址 IP網(wǎng)絡(luò)中每臺主機(jī)都必須有一個惟一的IP地址; IP地址是一個邏輯地址; 因特網(wǎng)上的IP地址具有全球唯一性; 32位,4個字節(jié),常用點(diǎn)分十進(jìn)制的格式表示,例如:192.168.0.16 協(xié)議 為進(jìn)行網(wǎng)絡(luò)中的數(shù)據(jù)交換(通信)而建立的規(guī)則、標(biāo)準(zhǔn)或約定。(=語義+語法+規(guī)則) 不同層具有各自不同的協(xié)議。 網(wǎng)絡(luò)的狀況 多種通信媒介——有線、無線…… 不同種類的設(shè)備——通用、專用…… 不同的操作系統(tǒng)——Unix、Windows …… 不同的應(yīng)用環(huán)境——固定、移動…… 不同業(yè)務(wù)種類——分時、交互、實時…… 寶貴的投資和積累——有形、無形…… 用戶業(yè)務(wù)的延續(xù)性——不允許出現(xiàn)大的跌宕起伏。 它們互相交織,形成了非常復(fù)雜的系統(tǒng)應(yīng)用環(huán)境。 網(wǎng)絡(luò)異質(zhì)性問題的解決 網(wǎng)絡(luò)體系結(jié)構(gòu)就是使這些用不同媒介連接起來的不同設(shè)備和網(wǎng)絡(luò)系統(tǒng)在不同的應(yīng)用環(huán)境下實現(xiàn)互操作性,并滿足各種業(yè)務(wù)需求的一種粘合劑,它營造了一種“生存空間” —— 任何廠商的任何產(chǎn)品、以及任何技術(shù)只要遵守這個空間的行為規(guī)則,就能夠在其中生存并發(fā)展。 網(wǎng)絡(luò)體系結(jié)構(gòu)解決異質(zhì)性問題采用的是分層方法 —— 把復(fù)雜的網(wǎng)絡(luò)互聯(lián)問題劃分為若干個較小的、單一的問題,在不同層上予以解決。 就像我們在編程時把問題分解為很多小的模塊來解決一樣。 ISO/OSI七層參考模型 OSI(Open System Interconnection)參考模型將網(wǎng)絡(luò)的不同功能劃分為7層。 ISO/OSI七層參考模型 通信實體的對等層之間不允許直接通信。 各層之間是嚴(yán)格單向依賴。 上層使用下層提供的服務(wù) — Service user; 下層向上層提供服務(wù) — Service provider。 對等通信示例 對等層通信的實質(zhì) 對等層實體之間虛擬通信。 下層向上層提供服務(wù),實際通信在最底層完成。 OSI各層所使用的協(xié)議 應(yīng)用層:遠(yuǎn)程登錄協(xié)議Telnet、文件傳輸協(xié)議FTP、 超文本傳輸協(xié)議HTTP、域名服務(wù)DNS、簡單郵件傳輸協(xié)議SMTP、郵局協(xié)議POP3等。 傳輸層:傳輸控制協(xié)議TCP、用戶數(shù)據(jù)報協(xié)議UDP。 TCP:面向連接的可靠的傳輸協(xié)議。 UDP:是無連接的,不可靠的傳輸協(xié)議。 網(wǎng)絡(luò)層:網(wǎng)際協(xié)議IP、Internet互聯(lián)網(wǎng)控制報文協(xié)議ICMP、Internet組管理協(xié)議IGMP。 數(shù)據(jù)封裝 一臺計算機(jī)要發(fā)送數(shù)據(jù)到另一臺計算機(jī),數(shù)據(jù)首先必須打包,打包的過程稱為封裝。 封裝就是在數(shù)據(jù)前面加上特定的協(xié)議頭部。 數(shù)據(jù)封裝 OSI參考模型中,對等層協(xié)議之間交換的信息單元統(tǒng)稱為協(xié)議數(shù)據(jù)單元(PDU,Protocol Data Unit)。 OSI參考模型中每一層都要依靠下一層提供的服務(wù)。 為了提供服務(wù),下層把上層的PDU作為本層的數(shù)據(jù)封裝,然后加入本層的頭部(和尾部)。頭部中含有完成數(shù)據(jù)傳輸所需的控制信息。 這樣,數(shù)據(jù)自上而下遞交的過程實際上就是不斷封裝的過程。到達(dá)目的地后自下而上遞交的過程就是不斷拆封的過程。由此可知,在物理線路上傳輸?shù)臄?shù)據(jù),其外面實際上被包封了多層“信封”。 但是,某一層只能識別由對等層封裝的“信封”,而對于被封裝在“信封”內(nèi)部的數(shù)據(jù)僅僅是拆封后將其提交給上層,本層不作任何處理。 TCP/IP模型 TCP/IP起源于美國國防部高級研究規(guī)劃署(DARPA)的一項研究計劃——實現(xiàn)若干臺主機(jī)的相互通信。 現(xiàn)在TCP/IP已成為Internet上通信的工業(yè)標(biāo)準(zhǔn)。 TCP/IP模型包括4個層次: 應(yīng)用層 傳輸層 網(wǎng)絡(luò)層 網(wǎng)絡(luò)接口 TCP/IP與OSI參考模型的對應(yīng)關(guān)系 端口 端口是一種抽象的軟件結(jié)構(gòu)(包括一些數(shù)據(jù)結(jié)構(gòu)和I/O緩沖區(qū))。應(yīng)用程序通過系統(tǒng)調(diào)用與某端口建立連接(binding)后,傳輸層傳給該端口的數(shù)據(jù)都被相應(yīng)的進(jìn)程所接收,相應(yīng)進(jìn)程發(fā)給傳輸層的數(shù)據(jù)都通過該端口輸出。 端口用一個整數(shù)型標(biāo)識符來表示,即端口號。端口號跟協(xié)議相關(guān),TCP/IP傳輸層的兩個協(xié)議TCP和UDP是完全獨(dú)立的兩個軟件模塊,因此各自的端口號也相互獨(dú)立,端口通常稱為協(xié)議端口(protocol port) ,簡稱端口。 端口使用一個16位的數(shù)字來表示,它的范圍是0~65535,1024以下的端口號保留給預(yù)定義的服務(wù)。例如:http使用80端口。 套接字(socket)的引入 為了能夠方便的開發(fā)網(wǎng)絡(luò)應(yīng)用軟件,由美國伯克利大學(xué)在Unix上推出了一種應(yīng)用程序訪問通信協(xié)議的操作系統(tǒng)調(diào)用socket(套接字)。socket的出現(xiàn),使程序員可以很方便地訪問TCP/IP,從而開發(fā)各種網(wǎng)絡(luò)應(yīng)用的程序。 隨著Unix的應(yīng)用推廣,套接字在編寫網(wǎng)絡(luò)軟件中得到了極大的普及。后來,套接字又被引進(jìn)了Windows等操作系統(tǒng)中。Java語言也引入了套接字編程模型。 基于TCP的socket編程 基于UDP的socket編程 URL與URI URL(Uniform Resource Locator ),通用資源定位符。http://www.mybole.com.cn/index.asp就是一個URL。 URI(Uniform Resource Identifier),通用資源標(biāo)識符。 URI純粹是個符號結(jié)構(gòu),用于指定構(gòu)成Web資源的字符串的各個不同部分。URL是一種特殊類型的URI,它包含了用于查找某個資源的足夠信息。其它的URI,例如:mailto:myoble@mybole.com.cn則不屬于定位符,因為它里面不存在根據(jù)該標(biāo)識符來查找的任何數(shù)據(jù)。這種URI稱為URN(通用資源名)。 在Java庫中,URI類不包含用于訪問通用資源標(biāo)識符設(shè)定的任何方法,它的唯一作用是進(jìn)行分析。相反,URL類則可以打開到達(dá)資源的一個字符串。kNq紅軟基地

孫鑫c++ppt:這是孫鑫c++ppt,包括了C++的標(biāo)準(zhǔn)輸入輸出流,C++的特性,類的繼承訪問特性,類型轉(zhuǎn)換,F(xiàn)ish對象內(nèi)存布局,引用和指針變量的內(nèi)存模型,VC++程序編譯鏈接原理與過程等內(nèi)容,歡迎點(diǎn)擊下載。

PPT分類Classification

Copyright:2009-2024 紅軟網(wǎng) rsdown.cn 聯(lián)系郵箱:rsdown@163.com

湘ICP備2024053236號-1