




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、.第第0909章章 平臺無關(guān)語言平臺無關(guān)語言 使用平臺無關(guān)語言的需求 腳本語言 Java語言.9.1 使用平臺無關(guān)語言的需求使用平臺無關(guān)語言的需求 高級程序設(shè)計語言本應(yīng)是平臺無關(guān)的 在高級語言中,數(shù)據(jù)、控制流等都是抽象的。 源程序經(jīng)過編譯生成的目標碼是與本地機緊密相關(guān)的。表現(xiàn)在: 基本類型定義與及其字長相關(guān); 各機指令集不一,操作效果相當,實現(xiàn)過程有微小的差別; 同一語言在相同編譯和執(zhí)行環(huán)境下,同一程序執(zhí)行速度不一(硬件差異,優(yōu)化次數(shù)); 已采用增加可移植手段。 設(shè)預(yù)定義環(huán)境(包)Ada; 分出頭文件 - 宏 - 編譯文件C;. 單主機時代,需要解決的主要問題是高級語言程序可移植性,以減少應(yīng)用
2、程序的開發(fā)費用,縮短開發(fā)周期。這時對平臺無關(guān)性的要求不是十分迫切。. 局域網(wǎng)時代,需要在局域網(wǎng)內(nèi)實現(xiàn)信息共享,有協(xié)作計算需求。 網(wǎng)絡(luò)協(xié)議棧實現(xiàn)了數(shù)據(jù)的平臺無關(guān); 以文件共享形式實現(xiàn); 客戶/服務(wù)器模式,程序可以不共享; 只要局域網(wǎng)內(nèi)使用相同或相互兼容的平臺,也可以實現(xiàn)程序的共享。. Internet時代,對資源共享提出了新的要求: 局域網(wǎng)的規(guī)模和結(jié)構(gòu)是可控制的;但是,沒有任何個人和機構(gòu)可以控制Internet的構(gòu)成。 Internet/Intranet包含各種類型計算機,是資源共享的平臺。不論用戶使用的是什么類型的計算機和操作系統(tǒng),都可以瀏覽網(wǎng)絡(luò)上的信息,使用網(wǎng)絡(luò)中的資源。 Wide Web)
3、是Internet上最廣泛的信息發(fā)布/瀏覽方式。與FTP等以往的方式相比較,WWW具有較強的動態(tài)性和交互性,需要完成復(fù)雜的應(yīng)用(如電子商務(wù)等)因此,共享資源不但包括數(shù)據(jù),也應(yīng)包括程序。這就需要一種平臺無關(guān)的語言。 激烈的競爭迫使軟件生產(chǎn)者不斷降低開發(fā)成本,縮短開發(fā)周期。平臺無關(guān)語言使開發(fā)者不需要為一個軟件開發(fā)多個操作系統(tǒng)的版本,減少了開發(fā)費用和時間。. 平臺無關(guān)語言的實現(xiàn): 傳送源代碼 將源代碼傳送到目標機,先經(jīng)過編譯,生成目標機代碼,再執(zhí)行。前提是必須有不同平臺的編譯器,這種情況往往在編譯時缺乏源代碼原有的環(huán)境信息(全程量),且只能先編譯存入目標碼再運行。局域網(wǎng)時代服務(wù)器已經(jīng)做過了。要實時運
4、行只能是解釋(也要求有完整的信息)型語言。 傳送目標代碼 只有在相同或相互兼容的平臺之間才可以實現(xiàn)。如在Windows NT/9x組成的局域網(wǎng)中,可以在一臺機器上調(diào)用執(zhí)行其它機器上的應(yīng)用程序。 傳送中間代碼 中間代碼由源代碼經(jīng)過編譯生成。中間代碼經(jīng)過優(yōu)化。中間代碼傳送到目標機上由解釋器解釋執(zhí)行。Java語言使用的是這種方式。.9.2 腳本語言腳本語言 腳本語言的概述: 描述性語言(4GL); 直接解釋執(zhí)行; 操作系統(tǒng)界面語言的擴大泛shell; 輔助開發(fā)(不是設(shè)計,但引用內(nèi)部過程、函數(shù)、對象);. 常見的腳本語言有: 頁面描述類:TELEX、Postscript、HTML、VPML; 場景描述
5、類:JavaScript、VBScript/ActiveX腳本、LotusScript(Lotus公司的Notes群件產(chǎn)品中的腳本語言).9.2.1 HTML(Hyper-Text Markup Language) 用于描述Web主頁,為所有OS上的瀏覽器所識; 設(shè)計編排多媒體主頁(包括正文字體、圖形、動畫); 以超文本方式使用,可以鏈接任何網(wǎng)址上的各種多媒體文檔,包括普通正文、HTML文檔、GIF圖形、TIFF圖形;XBM位圖、JPEG圖形、Postscript文件、AIFF聲音、AU聲音、QuickTime影片、MPEG影片;. 標簽。以尖括號括出的成對或單個標簽給出頁面編排信息。 文檔編
6、排、引用描述:一個HTML文檔文檔簡介信息文檔內(nèi)容標題鏈接名第i層編排此前為一段由此換行產(chǎn)生一個視窗寬度的水平分行符. 字符格式 邏輯描述:已定義單詞重點詞書或電影主題一段源代碼由此鍵入狀態(tài)信息特別強調(diào) 物理描述:此處黑體此處斜體此處打字機體. 內(nèi)聯(lián)圖形 其它標簽 列表:表項表項 (無號) (有號) 表項測試此表表項 (定義表) 預(yù)定義格式正文:此段文本格式已定 作者地址: . 擴展引用: 嵌入Java: 嵌入其它描述語言: .9.2.2 JavaScript語言 HTML語言是靜態(tài)的,動態(tài)性和交互性不強。于是,Netscape公司開發(fā)了JavaScript(與之對應(yīng)是Microsoft公司的
7、VBScript),擴充HTML文檔的功能。 Javascript嵌入在HTML文本中,由瀏覽器解釋執(zhí)行。.以下是一個HTML文本中嵌入JavaScript的例子:function welcome() var s = “Hello world!”; document.write(s); /document是是HTML文檔對象文檔對象 /函數(shù)的定義函數(shù)的定義 welcome() / 函數(shù)的調(diào)用函數(shù)的調(diào)用這個例子將在瀏覽器中顯示“ Hello world!”字符串?!癲ocument”是HTML文檔對象,使用它的write方法可以在文檔中寫入文本。. JavaScript有以下特點: 與C、Jav
8、a相似的語法,如常規(guī)的變量、表達式、函數(shù)和控制語句等。 弱類型。有數(shù)字、布爾、字符串和空值類型。變量的確切類型取決于所賦給它數(shù)據(jù)的類型。 基于對象。把瀏覽器和HTML文檔中的元素看作對象,對象有各自的屬性。例如,瀏覽器對象是已被預(yù)定義的Navigator;HTML頁面是document對象。程序員可以使用的對象及其屬性是已經(jīng)被瀏覽器定義和生成的,不能定義新的類和對象。因此,是基于對象而不是面向?qū)ο蟮摹?事件驅(qū)動。定義了一組系統(tǒng)、鼠標事件。可以通過事件激活定義好的函數(shù)。 在客戶端使用的小語言.一個統(tǒng)計HTML文檔中超鏈接個數(shù)的程序: for(var i=0; idocument.links.le
9、ngth; i+) document.write(link+(i+1)+: +document.linksi.href+); document.write(There are +document.links.length+ links.);其中,其中,document是整個是整個HTML頁面對象;頁面對象;links是是document對象對象中的超鏈接對象數(shù)組,中的超鏈接對象數(shù)組,length、href又是又是links的屬性,分別的屬性,分別表示鏈接的數(shù)目、鏈接的內(nèi)容表示鏈接的數(shù)目、鏈接的內(nèi)容.該HTML在瀏覽器中的顯示如下圖所示:.9.3 Java語言9.3.1 Java是C+的網(wǎng)絡(luò)應(yīng)用
10、的擴充和改造 保留了高級語言的主要機制 與C+基本相同的字符集、標識符、關(guān)鍵字、運算符、特殊符號 比C+更加強化類型。增加了布爾類型,只保留數(shù)組類型;使用真正的類型轉(zhuǎn)換(C+中的類型轉(zhuǎn)換是“偽”的,目的是為了通過編譯器的檢查;Java中的類型轉(zhuǎn)換在運行時真正發(fā)生,如果不能轉(zhuǎn)換,系統(tǒng)會拋出異常) 保留聲明、作用域、變量、表達式、語句、三種結(jié)構(gòu)化控制; 保留并增強C+的異常;. 與C+相似的面向?qū)ο髾C制:類作為特殊類型、構(gòu)造函數(shù)、初始化序列、實例變量、this/super、方法的覆蓋與重載、成員可見性。 取消了C+不利于網(wǎng)絡(luò)應(yīng)用的機制: 指針。以對象引用代替指針; 取消頭文件和預(yù)處理器(宏與機器相
11、關(guān)); C+中原有冗余:struct、union都被類代替; 不支持模板,動態(tài)束定功能可實現(xiàn); 取消typedef; 不支持運算符重載;.9.3.2 平臺無關(guān)性的解決 編譯解釋執(zhí)行。Java語言實現(xiàn)平臺無關(guān)的關(guān)鍵是使用了“編譯-解釋”執(zhí)行方式。Java源代碼經(jīng)過編譯,稱為Java字節(jié)代碼(byte-code)。Java虛擬機(VM)是字節(jié)代碼的解釋器。JavaVM是用軟件構(gòu)造的一個虛擬計算機,它由虛擬的寄存器、內(nèi)存、堆棧等;字節(jié)代碼就是這臺虛擬計算機的指令。所有操作系統(tǒng)上的JavaVM執(zhí)行一致的指令,這樣,就屏蔽了各個平臺之間的差異(如下圖所示)。.Java字節(jié)代碼JavaVM forWind
12、owsJavaVM forSolarisJavaVM forMac OSWindowsSolarisMac OSJava虛擬機是平臺無關(guān)性的關(guān)鍵在不同的操作系統(tǒng)上有不同的Java虛擬機,向上有一致的接口(虛擬機的指令字節(jié)代碼),向下針對不同的操作系統(tǒng)有不同的實現(xiàn)方式。. 即時編譯(JIT: Just-in-Time Compile)。使用即時編譯是為了提高Java程序的執(zhí)行效率,是對Java解釋器的改進。即時編譯在虛擬機解釋執(zhí)行Java字節(jié)代碼時發(fā)生。當虛擬機第一次調(diào)用某個方法時,不再直接解釋這個方法的字節(jié)代碼,而是用即時編譯器將這個方法的字節(jié)代碼編譯成為本機目標代碼,然后執(zhí)行這些目標代碼。即
13、時編譯不是將整個類的字節(jié)代碼進行一次性編譯,而是只編譯正在執(zhí)行的函數(shù),“邊執(zhí)行,邊編譯”。. 小程序(applet)的傳遞運行方式 小程序是可以在Web瀏覽器中執(zhí)行的Java程序; Web瀏覽器中有一個Java虛擬機,和瀏覽器一起構(gòu)成小程序的運行環(huán)境; 瀏覽器根據(jù)HTML文檔中的標志,從指定的URL下載小程序的類字節(jié)碼(.class文件),裝入到Java虛擬機中運行; 小程序的出現(xiàn)提高了Web頁面的交互性和動態(tài)性,使瀏覽器能夠完成更加復(fù)雜的應(yīng)用。 Java虛擬機有內(nèi)置的類裝入機制,從文件系統(tǒng)或網(wǎng)絡(luò)中下載類代碼,然后在虛擬機中運行。瀏覽器下載運行小程序只是一個特例,這種機制可以被所有Java應(yīng)用
14、程序使用。.9.3.3 Java為應(yīng)用增加的新特性 兩層封裝:包類 “包”是一組功能相近或聯(lián)系緊密的類的集合,同一個包中的類之間有比較大的訪問權(quán)限。包是一種對語言進行擴充的機制。Java的核心類庫主要由以下幾個包組成: java.lang - 基本類庫 java.io - 讀、寫流,文件,管道 - 網(wǎng)絡(luò) java.awt - 界面、窗口. java.applet - 小程序類 java.util - 通用工具:向量表、哈希表、棧 “類”與C+的基本相同。Java只有單繼承,類庫呈樹狀結(jié)構(gòu),所有類都是java.lang.Object類的子類。. 增加了接口(interface)的機制。 接口是一
15、種特殊的類,在接口中只有函數(shù)的聲明,而沒有函數(shù)的具體定義(與C+的純虛類相似)。接口可以繼承,但不能直接由接口生成對象; 以類實現(xiàn)(implements)接口,即在類中定義所有接口中聲明的函數(shù)。我們可以把一個接口看成某種功能的規(guī)定,實現(xiàn)了接口,就是實現(xiàn)了某種功能。類的繼承和接口的實現(xiàn)是多態(tài)的基礎(chǔ)。. 以接口實現(xiàn)多態(tài)。接口將函數(shù)的聲明和實現(xiàn)分離,允許幾個類同時享有一個接口。調(diào)用者不需要了解接口的具體實現(xiàn),以統(tǒng)一的方式使用這些類的對象。下面是一個簡單的例子:interface Drawer public void draw();/ 定義接口class Circular implements Dra
16、wer . . . public void draw()畫一個圓; / 類Circular實現(xiàn)了Drawer接口.class Rectangle implements Drawer . . . public void draw()畫一個矩形; / 類Rectangle實現(xiàn)了Drawer接口class User void paint(Drawer drawer)drawer.draw(); . . .public static void main() Circular c = new Circular(); Rectangle r = new Rectangle(); User user = n
17、ew User(); user.paint(c);/ 畫圓 user.paint(r);/ 畫方 / End of class Useruser對象的paint方法使用統(tǒng)一的方式調(diào)用對象c和r的draw方法,產(chǎn)生不同的結(jié)果。.接口實現(xiàn)多態(tài)示意圖:. 以接口實現(xiàn)多繼承。一個類可以實現(xiàn)多個接口,間接實現(xiàn)多繼承,同時不影響類的繼承結(jié)構(gòu)。Object類 B類 A類 B B類 AA接口C繼承繼承繼承繼承實現(xiàn)實現(xiàn)接口D實現(xiàn)類接口實現(xiàn). 以synchronized控制模塊的同步 Java使用監(jiān)控器(Monitor)作為線程同步的機制。每一個對象都有一個監(jiān)控器與之相對應(yīng)??梢杂胹ynchronized關(guān)鍵字請
18、求得到某個對象的監(jiān)控器。在任何時刻,只能有一個線程可以擁有某個對象的監(jiān)控器。如果有多個線程申請某個對象的監(jiān)控器,系統(tǒng)會阻塞這些線程。如果監(jiān)控器的使用者釋放了監(jiān)控器的擁有權(quán),系統(tǒng)就會喚醒某個申請該監(jiān)控器的阻塞線程。. 增加了修飾符 final:變量或函數(shù)不能被重新賦值或定義。final變量就是常量;final方法是不能被子類覆蓋的方法 native:本地方法聲明,其定義放在本地庫中 abstract:抽象方法/類。抽象方法是只有聲明而沒有定義的方法;含有抽象方法的類必須聲明為抽象類 transient:被聲明為transient的變量不能在網(wǎng)絡(luò)中傳遞. 增強對象性 所有的基本數(shù)據(jù)類型都有與之對應(yīng)
19、的類:int java.lang.Integershort java.lang.Shortlong java.lang.Longchar java.lang.Characterbyte java.lang.Bytefloat java.lang.Floatdouble java.lang.Doubleboolean java.lang.Boolean. 數(shù)組也是一種對象。用new語句創(chuàng)建,且有l(wèi)ength屬性; 沒有獨立存在的全局變量、函數(shù)。程序完全由對象和類組成,甚至入口函數(shù)main也必須從屬于某個類; 對象引用。所有非基本數(shù)據(jù)類型變量都是對象的引用。與指針相比,引用只能訪問對象,不能訪問內(nèi)
20、存地址。比較 MyClass a; 這個聲明語句: 在C+中將生成一個對象,名為a 在Java中只有一個對象的引用a,它不指向任何對象,只有再通過a = new MyClass()才能創(chuàng)建一個對象.再比較 MyClass myObject;/Java還要執(zhí)行myObject = new MyClass(); myObject = otherObject; 在C+中,myObject始終指向聲明時分配的存儲區(qū),賦值語句的效果只是將otherObject的值拷貝給myObject對象 在Java中,myObject和otherObject將成為同一個對象的引用,如下圖所示。對象myObjectMy
21、Object myObject = new MyObject();myObjectotherObject對象對象myObject = otherObject;. 支持多線程編程 線程的狀態(tài)初始態(tài):線程對象被創(chuàng)建但沒有被運行時的狀態(tài);運行態(tài):線程對象被啟動,進入CPU的調(diào)度隊列,開始執(zhí)行另外的運行線索;阻塞態(tài):線程對象由于某種原因,不能繼續(xù)執(zhí)行,CPU不再為它分配時間片。但是,這時的線程仍然是有生命的,一旦條件滿足,它能夠再次進入運行態(tài),繼續(xù)執(zhí)行剩余的任務(wù);死亡態(tài):線程執(zhí)行完任務(wù),或者被強行結(jié)束。進入死亡態(tài)后,該線程不能再次返回運行態(tài)。.Java線程狀態(tài)的轉(zhuǎn)化:Java的線程也是對象,由java
22、.lang.Thread類繼承而來。Thread類中有run方法,子類線程覆蓋這個方法,將需要執(zhí)行的語句填入run方法中。這樣,當該線程被啟動時,它會自動執(zhí)行run方法中的語句。. 線程原語。java.lang.Thread類中有如下方法:start / stop:啟動和停止線程suspend / resume:懸掛和恢復(fù)線程sleep:使線程睡眠join:等待其它線程的停止interrupt:喚醒被阻塞的或是睡眠的線程yield:讓出CPU時間,使其它線程執(zhí)行. wait / notify (等待-喚醒)原語wait和notify方法是所有Java對象父類:java.lang.Object類
23、的方法。當一個線程擁有一個對象的監(jiān)控器(通過synchronized關(guān)鍵字)時,它可以調(diào)用該對象的wait或notify方法。 調(diào)用wait方法,該線程將放棄該對象的監(jiān)控器,并且被阻塞,直到其它線程調(diào)用了該對象的notify方法喚醒它為止。 調(diào)用notify方法,該線程將喚醒某個由于等待(調(diào)用了wait方法)而被阻塞的線程,將該對象的監(jiān)控器交給它,使其恢復(fù)執(zhí)行。. 以下是利用Java實現(xiàn)的生產(chǎn)者-消費者問題:import java.util.*;public class CPVector pool; /Vector是可以存儲任何對象的表.這里 / 當作產(chǎn)品池.int product = 0;p
24、ublic static int EMPTY = 0;public static int FULL = 25; public static void main(String args)CP cp = new CP();Consumer consumer = new Consumer(cp);Producer producer = new Producer(cp);consumer.start();/啟動線程,使其運行它的run函數(shù)producer.start();.public CP()pool = new Vector();/CP類的構(gòu)造函數(shù)類的構(gòu)造函數(shù).public synchronize
25、d void produce()try if(pool.size() = FULL)pool.wait(); product+; /produce a product. pool.addElement(new Integer(product);/put the product into the pool. System.out.println(Produce: + product); if(pool.size() = EMPTY + 1)pool.notify();catch(InterruptedException e).public synchronized void consume()t
26、ry int i = pool.size(); if(i = EMPTY)pool.wait(); System.out.println(Consume: + pool.firstElement().toString(); pool.removeElementAt(0); if(pool.size() = FULL - 1)pool.notify();catch(InterruptedException e) /End of class CP.CP類以監(jiān)控器的方式來管理產(chǎn)品池。它封裝了數(shù)據(jù)對象產(chǎn)品池,和操縱該對象的方法生產(chǎn)(produce)和消費(consume)方法,并且通過Java的同步機
27、制對這些方法的并發(fā)性進行控制。.以下是消費者類Consumerclass Consumer extends ThreadCP cp;public Consumer(CP cp)super();this.cp = cp;public void run()/線程的執(zhí)行函數(shù)while(true) cp.consume();/調(diào)用監(jiān)控器的consume方法 Thread.sleep(1000);/模擬做其它工作的時間 / End of class Consumer.以下是生產(chǎn)者類Producerclass Producer extends ThreadCP cp;public Producer(CP
28、cp)super();this.cp = cp;/ 構(gòu)造函數(shù)public void run()while(true) duce();/調(diào)用監(jiān)控器的produce方法 Thread.sleep(200);/模擬做其它工作的時間. 線程通信有以下幾種方式:共享對象管道流異地線程之間可以通過socket或RMI進行通信以下是一個利用管道流(PipedStream)進行線程之間通信的例子。.import java.io.*;public class CommThreadspublic static void main(String args)/ 生成一個單向管道流PipedInputStr
29、eam in = new PipedInputStream();PipedOutputStream out = new PipedOutputStream(in);Thread sender = new Sender(out);Thread receiver = new Receiver(in);sender.start(); / 啟動發(fā)送者線程receiver.start(); / 啟動接收者線程.class Receiver extends ThreadPipedInputStream in;public Receiver(PipedInputStream in)super();this.in = in;/ 得到管道流對象public void run()StringBuffer sBuffer = new StringBuffer();int b = 0;while(b != -1)/如果b=-1,表明已經(jīng)讀完 b = in.read();/從管道中讀取信息 if(b != -1) sBuffer.append(char)b);System.out.println(Receiver: + sBuffer.toString();/ 輸出得到的消息.class Sender extends ThreadPipedOutputStr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國番茄醬市場前景深度監(jiān)測與未來消費戰(zhàn)略發(fā)展分析報告
- 2025至2030中國電動打磨機行業(yè)市場占有率及投資前景評估規(guī)劃報告
- 2025至2030中國環(huán)氧增塑劑行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資風(fēng)險報告
- 心理輔導(dǎo)與殘疾人餐具使用技巧的結(jié)合教育
- 教育技術(shù)安全性評估與風(fēng)險管理策略
- 貨車清洗培訓(xùn)課件大全
- 商業(yè)決策中的心理學(xué)個性化學(xué)習(xí)路徑設(shè)計的重要性
- 抖音商戶助播突發(fā)狀況反應(yīng)能力制度
- 全球鈾礦資源分布2025年核能產(chǎn)業(yè)市場前景與挑戰(zhàn)研究報告
- 公交優(yōu)先戰(zhàn)略2025年城市交通擁堵治理的公共交通服務(wù)質(zhì)量評價體系報告
- 2025年高考軍隊院校征集和招錄人員政治考核表(原表)
- 鋼筋桁架式樓板施工方案鋼筋混凝土
- 碾壓式土石壩構(gòu)造設(shè)計
- 利樂灌裝保養(yǎng)執(zhí)行
- (高清版)JGJ340-2015建筑地基檢測技術(shù)規(guī)范
- 法人委托書范本
- 磁化率的測定
- 法院機關(guān)差旅費管理規(guī)定
- 新修改《工會法》重點解讀PPT
- 基于MATLAB牛頭刨床仿真分析畢業(yè)設(shè)計
- 虹鱒魚養(yǎng)殖項目可行性研究報告寫作范文
評論
0/150
提交評論