- 相關(guān)推薦
Java語言的特點和實現(xiàn)機制
Java使得語言聲明不依賴于實現(xiàn)的方面。例如,Java顯式說明每個基本數(shù)據(jù)類型的大小和它的運算行為(這些數(shù)據(jù)類型由Java語法描述)。下面是小編整理的關(guān)于Java語言的特點和實現(xiàn)機制,希望大家認真閱讀!
java語言定義:
Java是一種可以撰寫跨平臺應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計語言。
Java 技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺、科學(xué)超級計算機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。
組成:
Java由四方面組成:●Java編程語言,即語法!馢ava文件格式,即各種文件夾、文件的后綴。●Java虛擬機(JVM),即處理*.class文件的解釋器!馢ava應(yīng)用程序接口(Java API)。
Java分為三個體系,分別為Java SE(J2SE,Java2 Platform Standard Edition,標準版),JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企業(yè)版),Java ME(J2ME,Java 2 Platform Micro Edition,微型版)。
Java是功能完善的通用程序設(shè)計語言,可以用來開發(fā)可靠的、要求嚴格的應(yīng)用程序。
優(yōu)點:
指針: 任何一個學(xué)過C或者C++的人都知道指針的操作對于他們是很重要的,為什么,指針能夠支持內(nèi)存的直接操作,這樣的直接操作能夠帶來的是效率上的提高.但是任何一個東西都是有副作用的,指針給程序員帶了的混亂也是無可比擬的.對于一個不是很強勁的C程序員而言,指針是要命的(對我而言也是,我?guī)缀醪粫䦟慍代碼).而JAVA就為我們省去了這樣的麻煩,或者說JAVA完整的限制了對內(nèi)存的直接操作,讓程序員能夠安心去搞業(yè)務(wù)邏輯,而不用管自己后院的那堆內(nèi)存有沒有人來收拾.
垃圾回收: 其實垃圾回收也是JAVA對于內(nèi)存操作的限制之一,也大大解放了程序員的手腳.但是也正是這樣的一個內(nèi)存保姆的存在導(dǎo)致JAVA程序員在內(nèi)存上幾乎沒有概念...一個純粹的JAVA程序員對于內(nèi)存泄露這樣的問題是從來沒有概念的,因為他從來不用擔(dān)心,因為大多數(shù)情況下即便他大手大腳也不會有什么問題,這樣也就導(dǎo)致了JAVA一個很顯見的缺點,我們后面會講到. 這里我說點我想到的東西吧..其實JAVA并沒有讓程序員完全省心,他代辦的事情也僅僅是內(nèi)存罷了,其他資源的調(diào)用和釋放都還是需要程序員自己來關(guān)心的,比如數(shù)據(jù)庫,比如文件.當(dāng)然了,我們不能指望什么都吃現(xiàn)成的,總有東西是要自己做的吧.
平臺無關(guān)性的真正意義在于程序的可移植性高,能夠在多個平臺平滑遷移。這點就特別適合網(wǎng)絡(luò)應(yīng)用。
缺點:
1效率
這樣一個問題伴隨著JAVA的出身,一直困擾了我們可憐的JAVA寶寶很久,雖然他在自己長大成人以后不斷地修煉自己,來改變這個問題.但是先天的就是先天的,哎.....讓我說你什么好呢.....
1.1當(dāng)然首先就是內(nèi)存操作限制帶來安全的同時帶來的副面效果了.....
1.2 其次呢,就是面對對象的一個很重要的特點所帶來的——多態(tài),這個東西是娘胎里帶出來的,誰也沒辦法,而且這個因素的“后果很嚴重”(我等下會講我們的JAVA小朋友自己跟別人學(xué)了一招來解決這個問題)。但是不對啊,C++不也聲稱自己面對對象的嘛,這個問題他也有,你干嗎非說我呢?來自JAVA的聲辯。哈哈,這你就不如人C++圓滑了吧,人家的多態(tài)是編譯器編譯和連接時實現(xiàn)的,可你是運行時實現(xiàn)的,效率問題可見一斑了吧。
JAVA小朋友想了很久,想了一招。。。我已經(jīng)不記得他什么時候開始會這招了,但是他真的會,征對一些不會變化的程序,他就讓大家可以用預(yù)編譯來實現(xiàn)。其實這個事情也是C++真正做的。但是這樣的一個解決方案就屏蔽了動態(tài)創(chuàng)建和連接的能力。這里還需要說明的是,這樣的方法一般都運用在變化少而且對性能要求特別高的時候。畢竟如果不是面對大批量的處理和集中請求這樣的問題,我們的硬件應(yīng)該能滿足這樣的要求。
1。3平臺無關(guān)性帶來的。由于需要平臺無關(guān),所以JAVA是不能直接調(diào)用OS的API的,JAVA需要調(diào)用自己的API來隱式地調(diào)用OS的API,大家可想而知這樣的效果。多一層調(diào)用,必然多一層代碼需要加載到棧內(nèi)了。不過這個問題目前也有解決方案了吧。。。這個方面我不是很在行,只是看到一些資料而已,接觸太少。比如JNI(Java Native Interface)
2逆向編譯問題
確實是第一次聽說這樣的問題,天啊,沒接觸的東西還真的。這里就只能套書上的話了。
由于JAVA程序是動態(tài)連接的,從一個類到另外一個類的引用是符號化的。在靜態(tài)連接的可執(zhí)行程序中,類之間的只是直接的指針或者偏移量,。相反地,在JAVA class文件中,指向另一個類的引用通過字符串清楚地標明了所指向的類的名字。如果引用指向一個字段的話,這個字段的名字和描述符會被詳細說明。如果引用指向一個成員變量,這個成員變量的名字和描述符(方法的返回類型,方法參數(shù)的數(shù)量和類型)也會被詳細說明。
這有什么關(guān)系哦。。。。不過據(jù)說這樣就能通過逆向編譯一下子就把我原來的代碼給搞到了。。。那我寫了那么久不是太虧了嘛。。。這樣看來。。。產(chǎn)權(quán)問題咯(呼呼,上升到法律了。。。西西,我喜歡)
3 線程調(diào)度問題
關(guān)于線程調(diào)度,說老實話,我在學(xué)操作系統(tǒng)的時候,所有的線程問題都是在linux下用C去做的,原因第一是linux的線程API比較清晰,而且我受不了Windows的那些API的名構(gòu)造。第2就是因為我覺得Java雖然是一個總進程下的多線程,但是線程間的調(diào)度沒有非常的清晰,相比較而言,還不如直接調(diào)用操作系統(tǒng)的線程支持呢(雖然linux對線程級別支持也不是特別好,但是畢竟不是有包支持的嘛),記得當(dāng)初的哲學(xué)家饑餓問題我最后算是用JAVA調(diào)配出結(jié)果了,可是到最后我自己都暈了。這些都是我個人的看法,也很可能是一些偏見,至于別人書上專業(yè)的解釋是:由于為了能夠支持多種系統(tǒng)的不同的線程支持策略,JAVA只能采取這樣籠統(tǒng)而又松散的線程規(guī)范。
其實優(yōu)點和缺點是相對的,做過比較就知道,其實優(yōu)點和缺點有時候正是同一個因素帶來的.這也需要我們用唯物主義辨證原理來看待(我只是說唯物主義,沒有國籍的那種).更多的時候我們需要在我們所需要的東西和我們?yōu)榇诵枰冻龅拇鷥r間作出正確的trade off.(操作系統(tǒng)老師最喜歡說的詞).
優(yōu)劣勢:
java優(yōu)勢,是適合團隊開發(fā),軟件工程可以相對做到規(guī)范,這是一個很難比擬的優(yōu)勢。
java劣勢,是j2ee的架構(gòu)很完美,第一版軟件可以做滿意,但是很不適合互聯(lián)網(wǎng)模式的持續(xù)不斷修改;ヂ(lián)網(wǎng)軟件工程管理上的不足,持續(xù)的修修補補導(dǎo)致架構(gòu)的破壞。系統(tǒng)更新需要重啟web服務(wù),很難接受。
特點:
語言特點
Java 編程語言的風(fēng)格十分接近C、C++語言。Java是一個純粹的面向?qū)ο蟮某绦蛟O(shè)計語言,它繼承了 C++語言面向?qū)ο蠹夹g(shù)的核心。Java舍棄了C ++語言中容易引起錯誤的指針(以引用取代)、運算符重載(operator overloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對象所占據(jù)的內(nèi)存空間,使得程序員不用再為內(nèi)存管理而擔(dān)憂。在 Java 1.5 版本中,Java 又引入了泛型編程(Generic Programming)、類型安全的枚舉、不定長參數(shù)和自動裝/拆箱等語言特性。
Java 不同于一般的編譯執(zhí)行計算機語言和解釋執(zhí)行計算機語言。它首先將源代碼編譯成二進制字節(jié)碼(bytecode),然后依賴各種不同平臺上的虛擬機來解釋執(zhí)行字節(jié)碼。從而實現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺特性。不過,每次的執(zhí)行編譯后的字節(jié)碼需要消耗一定的時間,這同時也在一定程度上降低了 Java 程序的運行效率。
主要特征
Java語言是簡單的。Java語言的語法與C語言和C++語言很接近,使得大多數(shù)程序員很容易學(xué)習(xí)和使用Java。另一方面,Java丟棄了C++中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉(zhuǎn)換。特別地,Java語言不使用指針,并提供了自動的廢料收集,使得程序員不必為內(nèi)存管理而擔(dān)憂。
Java語言是面向?qū)ο蟮摹ava語言提供類、接口和繼承等原語,為了簡單起見,只支持類之間的單繼承,但支持接口之間的多繼承,并支持類與接口之間的實現(xiàn)機制(關(guān)鍵字為implements)。Java語言全面支持動態(tài)綁定,而C++語言只對虛函數(shù)使用動態(tài)綁定?傊,Java語言是一個純的面向?qū)ο蟪绦蛟O(shè)計語言。
Java語言是分布式的。Java語言支持Internet應(yīng)用的開發(fā),在基本的Java應(yīng)用編程接口中有一個網(wǎng)絡(luò)應(yīng)用編程接口(java net),它提供了用于網(wǎng)絡(luò)應(yīng)用編程的類庫,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(遠程方法激活)機制也是開發(fā)分布式應(yīng)用的重要手段。
Java語言是健壯的。Java的強類型機制、異常處理、廢料的自動收集等是Java程序健壯性的重要保證。對指針的丟棄是Java的明智選擇。Java的安全檢查機制使得Java更具健壯性。
Java語言是安全的。Java通常被用在網(wǎng)絡(luò)環(huán)境中,為此,Java提供了一個安全機制以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網(wǎng)絡(luò)下載的類具有一個安全防范機制(類ClassLoader),如分配不同的名字空間以防替代本地的同名類、字節(jié)代碼檢查,并提供安全管理機制(類SecurityManager)讓Java應(yīng)用設(shè)置安全哨兵。
Java語言是體系結(jié)構(gòu)中立的。Java程序(后綴為java的文件)在Java平臺上被編譯為體系結(jié)構(gòu)中立的字節(jié)碼格式(后綴為class的文件),然后可以在實現(xiàn)這個Java平臺的任何系統(tǒng)中運行。這種途徑適合于異構(gòu)的網(wǎng)絡(luò)環(huán)境和軟件的分發(fā)。
Java語言是可移植的。這種可移植性來源于體系結(jié)構(gòu)中立性,另外,Java還嚴格規(guī)定了各個基本數(shù)據(jù)類型的長度。Java系統(tǒng)本身也具有很強的可移植性,Java編譯器是用Java實現(xiàn)的,Java的運行環(huán)境是用ANSI C實現(xiàn)的。
Java語言是解釋型的。如前所述,Java程序在Java平臺上被編譯為字節(jié)碼格式,然后可以在實現(xiàn)這個Java平臺的任何系統(tǒng)中運行。在運行時,Java平臺中的Java解釋器對這些字節(jié)碼進行解釋執(zhí)行,執(zhí)行過程中需要的類在聯(lián)接階段被載入到運行環(huán)境中。
Java是高性能的。與那些解釋型的高級腳本語言相比,Java的確是高性能的。事實上,Java的運行速度隨著JIT(Just-In-Time)編譯器技術(shù)的發(fā)展越來越接近于C++。
Java語言是多線程的。在Java語言中,線程是一種特殊的對象,它必須由Thread類或其子(孫)類來創(chuàng)建。通常有兩種方法來創(chuàng)建線程:其一,使用型構(gòu)為Thread(Runnable) 的構(gòu)造子將一個實現(xiàn)了Runnable接口的對象包裝成一個線程,其二,從Thread類派生出子類并重寫run方法,使用該子類創(chuàng)建的對象即為線程。值得注意的是Thread類已經(jīng)實現(xiàn)了Runnable接口,因此,任何一個線程均有它的run方法,而run方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。Java語言支持多個線程的同時執(zhí)行,并提供多線程之間的同步機制(關(guān)鍵字為synchronized)。
Java語言是動態(tài)的。Java語言的設(shè)計目標之一是適應(yīng)于動態(tài)變化的環(huán)境。Java程序需要的類能夠動態(tài)地被載入到運行環(huán)境,也可以通過網(wǎng)絡(luò)來載入所需要的類。這也有利于軟件的升級。另外,Java中的類有一個運行時刻的表示,能進行運行時刻的類型檢查。
Java語言的優(yōu)良特性使得Java應(yīng)用具有無比的健壯性和可靠性,這也減少了應(yīng)用系統(tǒng)的維護費用。Java對對象技術(shù)的全面支持和Java平臺內(nèi)嵌的API能縮短應(yīng)用系統(tǒng)的開發(fā)時間并降低成本。Java的編譯一次,到處可運行的特性使得它能夠提供一個隨處可用的開放結(jié)構(gòu)和在多平臺之間傳遞信息的低成本方式。特別是Java企業(yè)應(yīng)用編程接口(Java Enterprise APIs)為企業(yè)計算及電子商務(wù)應(yīng)用系統(tǒng)提供了有關(guān)技術(shù)和豐富的類庫。
和C/C++的差異
熟悉C語言和C++語言的讀者一定想搞清楚這個問題,實際上,Java確實是從C語言和C++語言繼承了許多成份,甚至可以將Java看成是類C語言發(fā)展和衍生的產(chǎn)物。比如Java語言的變量聲明,操作符形式,參數(shù)傳遞,流程控制等方面和C語言,C++語言完全相同.盡管如此,Java和C語言,C++語言又有許多差別,主要表現(xiàn)在如下幾個方面:
(1) Java中對內(nèi)存的分配是動態(tài)的。它采用運算符new為每個對象分配內(nèi)存空間。而且,實際內(nèi)存還會隨程序運行情況而改變。程序運行中 Java系統(tǒng)自動對內(nèi)存進行掃描,對長期不用的空間作為”垃圾”進行收集,使得系統(tǒng)資源得到更充分地利用。按照這種機制,程序員不必關(guān)注內(nèi)存管理問題,這使Java程序的編寫變得簡單明了,并且避免了由于內(nèi)存管理方面的差錯而導(dǎo)致系統(tǒng)出問題。而C語言通過malloc()和free()這兩個庫函數(shù)來分別實現(xiàn)分配內(nèi)存和釋放內(nèi)存空間的,C++語言中則通過運算符operator new和operator delete來分配和釋放內(nèi)存。在C和C++中,程序員必須非常仔細地處理內(nèi)存的使用問題。一方面,如果對己釋放的內(nèi)存再作釋放或者對未曾分配的內(nèi)存作釋放,都會造成不可預(yù)料的后果;而另一方面,如果對長期不用的或不再使用的內(nèi)存不釋放,則會浪費系統(tǒng)資源,甚至因此造成資源枯竭。
(2) Java不在所有類之外定義全局變量,而是在某個類中定義一種公用靜態(tài)的變量來完成全局變量的功能。
(3) Java不用goto語句,而是用try-catch-finally異常處理語句來代替goto語句處理出錯的功能。Java中有g(shù)oto保留字,但它沒有任何效果,換句話說,我們不能使用goto來進行跳轉(zhuǎn)到某行。實際上,結(jié)構(gòu)化程序設(shè)計完全不需要goto語句即可完成各種流程,而goto語句的使用往往會使程序的可讀性降低,所以Java不允許goto跳轉(zhuǎn),Java中的標簽是為循環(huán)設(shè)計的是為了在多重循環(huán)中方便的使用break和coutinue而設(shè)計的。
(4) Java不支持頭文件,而C和C++語言中都用頭文件來聲明類、變量、函數(shù)等,這種采用頭文件的結(jié)構(gòu)使得系統(tǒng)的運行維護相當(dāng)繁雜。
(5) Java不支持宏定義,而是使用關(guān)鍵字final來定義常量,在C/C++中可以用宏定義來實現(xiàn)常量定義,這可能有害于程序的可維護性。
(6) Java對每種數(shù)據(jù)類型都分配固定長度。比如,在Java中,int類型總是32位的,而在C和C++中,對于不同的平臺,同一個數(shù)據(jù)類型分配不同的字節(jié)數(shù),同樣是int類型,在PC機中為二字節(jié)即16位,而在VAX-11中,則為32位.這使得C語言造成不可移植性,而Java則具有跨平臺性(平臺無關(guān)性)。
(7) 類型轉(zhuǎn)換不同。在C和C++中,可通過指針進行幾乎任意的類型轉(zhuǎn)換,常常帶來不安全性。而在Java中,運行時系統(tǒng)對對象的處理要進行類型相容性檢查,及早發(fā)現(xiàn)轉(zhuǎn)換錯誤。
(8) 沒有結(jié)構(gòu)和聯(lián)合。在C和C++中,結(jié)構(gòu)和聯(lián)合的所有成員均為公有,可能造成安全性問題。而Java中根本就不包含結(jié)構(gòu)和聯(lián)合,所有的內(nèi)容都封裝在類里面。
(9) Java不再使用指針。指針是C和C++中最靈活,也最容易產(chǎn)生錯誤的數(shù)據(jù)類型。由指針所進行的內(nèi)存地址操作常會造成不可預(yù)知的錯誤,同時通過指針對某個內(nèi)存地址進行顯式類型轉(zhuǎn)換后,可以訪問一個C++中的私有成員,從而破壞安全性。而Java對指針進行完全地控制,程序員不能直接進行任何指針操作。
(10)避免運行時平臺依賴。Java語言實現(xiàn)的庫可以在其它平臺的Java應(yīng)用程序中使用,而不像通常的C、C++等實現(xiàn)一樣,目標代碼依賴于特定的硬件體系結(jié)構(gòu)乃至操作系統(tǒng)等環(huán)境。
基本概念:
final類:為防止他人從你的類上派生新類,此類是不可擴展的。
多態(tài)類:在java中,對象變量是多態(tài)的。而java中不支持多重繼承。
抽象類:規(guī)定一個或多個抽象方法的類本身必須定義為abstract。
接口:Java中的接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現(xiàn),因此這些方法可以在不同的地方被不同的類實現(xiàn),而這些實現(xiàn)可以具有不同的行為(功能)。
Java中的每一個類都是從Object類擴展而來的。
object類中的equal和toString方法。
equal用于測試一個對象是否同另一個對象相等。
toString返回一個代表該對象的字符串,每一個類都會從Object類繼承該方法,有些類重寫了該方法,以便返回當(dāng)前狀態(tài)的正確表示。
(toString 方法是一個很重要的方法)
通用編程:任何類類型的所有值都可以同object類型的變量來代替。
封裝:就是把數(shù)據(jù)和行為結(jié)合起在一個包中,并對對象使用者隱藏數(shù)據(jù)的實現(xiàn)過程,一個對象中的數(shù)據(jù)叫他的實例字段(instance field)。
重載:當(dāng)多個方法具有相同的名字而含有不同的參數(shù)時,便發(fā)生重載。編譯器必須挑選出調(diào)用哪個方法。
重寫:在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。
數(shù)組列表:ArrayList動態(tài)數(shù)組列表,是一個類庫,定義在java.util包中,可自動調(diào)節(jié)數(shù)組的大小。
class類 object類中的getclass方法返回class類型的一個實例,程序啟動時包含在main方法的類會被加載,虛擬機要加載他需要的所有類,每一個加載的類都要加載它需要的類。
【Java語言的特點和實現(xiàn)機制】相關(guān)文章:
武術(shù)的特點和作用04-24
播音主持語言的特點09-01
JAVA認證基礎(chǔ)知識:基于反射機制的服務(wù)代理調(diào)用08-26
員工激勵機制的形式和原則07-07
播音主持的語言特點及語言風(fēng)格09-16
嬰兒睡眠的特點和表現(xiàn)04-04
拓展訓(xùn)練的特點和環(huán)節(jié)05-29
擒拿的特點和練習(xí)要決08-14