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