久久无码高潮喷水抽搐,极品馒头泬19p,久久人人爽精品玩人妻av,精品国产成人国产在线视,精品视频一区二区三区在线观看

最新更新最新專題

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

孫鑫java ppt下載

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

素材預(yù)覽

孫鑫java ppt

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

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

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

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

PPT分類(lèi)Classification

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

湘ICP備2024053236號(hào)-1