Java語言環(huán)境白皮書 - 為你講解Java設(shè)計者心中Java的模樣

引自:https://www.oracle.com/technetwork/java/index-136113.html

Java設(shè)計理念1:Simple and Farmiliar

【Java語言特性】

  • 原生數(shù)據(jù)類型


    image.png
  • 算術(shù)和關(guān)系運算符 - 沒有unsigned關(guān)鍵字农尖,所以需要<<<或者>>>來做位移運算; + 用于表示字符串拼接

  • 數(shù)組 - 初始化數(shù)組時并未創(chuàng)建數(shù)組元素的對象。

  • 字符串 - String(immutable), StringBuffer(mutable可修改)

  • 多層break - 不支持goto,但是支持continue,break,以及l(fā)abel block

  • 內(nèi)存管理和垃圾回收 - Java去掉了C/C++的指針、分配和回收內(nèi)存等機制,采用系統(tǒng)自動分配和回收內(nèi)存的方式來避免掉指針機制帶來的諸多系統(tǒng)問題,比如內(nèi)存沖突、內(nèi)存溢出、性能低下等款慨。 Java的內(nèi)存管理基于對象 和對對象的引用。Java機制中內(nèi)存管理模塊會監(jiān)控對對象的引用谬莹,如果對象沒有任何引用了檩奠,其內(nèi)存空間桩了,就會被自動回收。

  • 后臺垃圾回收機制
    Java運行時埠戳,會啟動一個低優(yōu)先級的線程來進行自動的垃圾回收

  • 線程同步機制 - 在系統(tǒng)API層面支持多線程編程井誉,屏蔽底層操作系統(tǒng)的差異。

【與C/C++不同】

C/C++中被摒棄的特性

  • header文件及其中的define和typedefs
  • structures和Unions(復(fù)雜結(jié)構(gòu)體)- 用class代替之
  • Enums
  • Functions - class method代替之
  • 多繼承 - interface代替之
  • goto語句 - 多層break和continue代替之
  • 運算符重載
  • 自動的強制轉(zhuǎn)換 - 比例float賦值給int乞而,不會做丟失精度的自動轉(zhuǎn)換送悔,而是報編譯錯誤慢显。
  • 指針

Java設(shè)計理念2:Object Oriented

Object Oriented并不是包治百病的神藥爪模。
它只是解決了Procedure Oriented不能解決的一些問題。

編程語言必須至少具有如下4個特征荚藻,才能稱為是面向?qū)ο蟮?/p>

  • 封裝性 - 具體的實現(xiàn)方式是可隱藏的屋灌,并且是可以模塊化。
  • 多態(tài) - 同一個消息应狱,發(fā)送到不同的對象共郭,可以有不同的處理方式。
  • 繼承 - 通過定義新的對象可以繼續(xù)原有對象的屬性和行為疾呻,以獲得代碼的重用性
  • 動態(tài)綁定 - 對于任何的對象除嘹,無論它是來自于網(wǎng)絡(luò)任何地方,即使并不知道對象具體的類型岸蜗,都可以發(fā)送消息給這個對象尉咕。

如何理解對象?
對象是對現(xiàn)實世界中事物的特征和行為的一種抽象和建模。
一切東西都可以抽象成一個對象璃岳,以及該對象的屬性和行為年缎。
人有高矮胖瘦等屬性,也有走铃慷、停单芜、工作、休息等等行為犁柜。

對象的基本概念

  • 類 - 類中定義了同一類對象的屬性(成員變量)和狀態(tài)(成員方法)洲鸠。 成員變量在實例創(chuàng)建時會copy作為實例的屬性,也就是每個實例都可以有不同的屬性取值馋缅。類本身并不是對象扒腕,更像是建對象的模板。就像是依據(jù)房子的同一個設(shè)計稿建好多個房子股囊。
  • 實例化一個對象 - new ClassName();
  • 構(gòu)造函數(shù) - 實例化對象時袜匿,class的構(gòu)造函數(shù)會被自動調(diào)用
  • 成員方法和消息機制 - 通過成員方法及適當?shù)臋?quán)限控制,對象之前可以傳遞消息
  • 類的finalize方法 - 在對象被回收之前會被調(diào)用(避免使用)
  • 子類 - 重用原有代碼的一種方式稚疹。Java去掉了C++里的多繼承(如果兩父類有相同的屬性居灯,在子類里會保存兩份屬性)祭务,只支持單繼承。
  • 接口 - 本質(zhì)上是對相同動作的抽象怪嫌,允許相同動作里做不同的實現(xiàn)义锥。
    只定義方法,不實現(xiàn)岩灭;允許某個類實現(xiàn)多個接口 => 好處:盡可能多地代碼重用拌倍,又可以避免多繼承時的混亂和系統(tǒng)問題

  • 權(quán)限控制

level 作用域
public any objects
protected 子類
private within this class
friendly(不指定時默認) 當前package

  • 好處1. 需要相互訪問或者具有類似功能的類和接口定義在一個單元里。比如I/O相關(guān)的類都定義在java.io包里噪径。
    好處2. 包內(nèi)有類可以互相訪問柱恤,類的具體實現(xiàn)可以對包外的類不可見。

  • 類變量和類方法
    對類的所有實例共享的變量和方法找爱,用static來定義梗顺。

  • 抽象方法
    對屬性和方法的抽象,不提供具體實現(xiàn)车摄。

Java設(shè)計理念3:Architecture Neutral, Portable and Robust

分布式計算背景下要求軟件可以無縫遷移到各種軟硬件系統(tǒng)上寺谤。而且不能靠引入支持各種系統(tǒng)的二進制包的方式,來解決這個問題吮播。另外分布式系統(tǒng)里的各個結(jié)點都要保證高可靠性变屁。

  • Architecture Neutral: java通過引入與平臺無關(guān)的字節(jié)碼,和JRE(運行時環(huán)境包含解析器)來把字節(jié)碼解析成具體系統(tǒng)上可以運行的機器碼意狠,這樣就避免了Java代碼開發(fā)過程中需要考慮不同底層平臺的差異粟关。

  • Portable
    引入平臺無關(guān)的字節(jié)碼,和在不同平臺上解釋執(zhí)行字節(jié)碼的JRE摄职,解決了平臺中立問題的同時誊役,也提供了可移植性。
    另外一方面可移植性體現(xiàn)在谷市,Java對各種基本數(shù)據(jù)類型指定了標準的大小蛔垢,不論采用哪種底層平臺,基本數(shù)據(jù)類型所占的位數(shù)是固定的迫悠,這樣就避免了C/C++里int在一個系統(tǒng)上可以運行鹏漆,另一個系統(tǒng)上出錯的問題。

image.png
  • Robust

Java沒有采用C/C++不嚴格的編譯器檢查创泄,而是在編譯期做了非常嚴格充分的語義檢查艺玲。所以可以提前發(fā)現(xiàn)原本只能在運行期發(fā)現(xiàn)的程序問題。

而且Java與C/C++最大的不同是Java使用真正的數(shù)組和字符串鞠抑,而非指針饭聚,也就是說解釋器可以檢查數(shù)組和字符串的索引。避免內(nèi)存改寫或者是內(nèi)存沖突搁拙。

Java設(shè)計理念4:Interpreted and Dynamic

Java類在需要的時候才會被加載秒梳,而且可以加載從網(wǎng)絡(luò)上下載的類法绵。所以大大提高了動態(tài)擴展性。

另外C++在程序運行之前酪碘,有一些對象己經(jīng)在分配了內(nèi)存朋譬。而Java中只有在運行時,才會實際分配對象的內(nèi)存兴垦。一定程序上減少了C++的Fragile Base Class問題徙赢。

Java設(shè)計理念5:Secure

Java compiler和java runtime設(shè)計了對于錯誤代碼設(shè)計了很多層防范措施,也就是所謂java的安全模型(secure model)探越。

  • Java compiler最出色的一個保護機制狡赐,就是內(nèi)存分配和引用的模型。
    第一點:不同于C/C++在編譯期扶关,就設(shè)計了對象在內(nèi)存中的具體存放阴汇。Java在運行期才會進行內(nèi)存分配。
    另一點:不同于C/C++在內(nèi)存地址內(nèi)會引用另一塊內(nèi)存地址节槐。Java沒有指針,編譯好的java代碼拐纱,通過symbolic handles來引用內(nèi)存铜异,這些handles之后會被jrm 解析器解析成真正的內(nèi)存地址。
    也就是說java中內(nèi)存的分配和引用完全是由JRM來處理的秸架。
    Java程序員無法像c/c++程序員一樣揍庄,有辦法偽裝或者制造對于內(nèi)存的指針。
    這不應(yīng)該被理解成對程序員的限制东抹,而是一種能夠保護系統(tǒng)安全和健壯的好處蚂子。

  • Class Loader的安全檢查

java運行過程中需要用到的類文件,這些文件可能來自于本地文件系統(tǒng)或者是網(wǎng)絡(luò)中缭黔。
加載這些文件時食茎,首先會由字節(jié)碼校驗器(bytecode verifier)來檢查這些被引用的類是否是安全的。然后再由字節(jié)碼加載器(bytecode loader)來進一步檢查馏谨。

java字節(jié)碼運行一個線程所需要的環(huán)境别渔,會被抽象成一系列的類,這些類按照來源不同惧互,被拆分成多個命名空間哎媚。本地文件系統(tǒng)的類放一個命名空間,來源于網(wǎng)絡(luò)的在另一個命名空間喊儡。

  • 字節(jié)碼校驗流程

即使java代碼本身遵守了java的規(guī)則拨与,但是它引入的外部代碼,不會被java compiler信任艾猜。而是會把它交給bytecode verificationfuc校驗該代碼是否格式正確买喧,保證它遵守基本的規(guī)則:
(1). 沒有偽造指針
(2). 沒有違反訪問權(quán)限控制
(3). 它引用的對象攀甚,都被正確使用

  • [ ] java代碼編譯、運行流程圖
image.png
  • java網(wǎng)絡(luò)包里的安全機制

java network包支持多種網(wǎng)絡(luò)協(xié)議以及網(wǎng)絡(luò)訪問控制:

  • [ ] 拒絕所有的網(wǎng)絡(luò)訪問
  • [ ] 只允許訪問當前代碼的來源主機
  • [ ] 如果代碼來源于防火墻外岗喉,只允許訪問防火墻外的網(wǎng)絡(luò)
  • [ ] 允許訪問所有網(wǎng)絡(luò)

Java設(shè)計理念6:Multithreading

  • 線程安全的意思是秋度,實現(xiàn)功能時始終考慮到要支持多線程執(zhí)行。

  • 多線程編程最大難點在于不能確認什么時候獲得到你需要的鎖钱床,以及什么時候可以釋放它荚斯。死鎖是多線程編程中常見的情況。

  • java語言中的線程
    Java支持多線程查牌,可以有效提升交互式應(yīng)用的性能事期。比如一個應(yīng)用需要在滑動頁面時播放音樂、下載文字纸颜、并且播放動畫兽泣,那么它就可以使用多線程,每個線程負責一項工作胁孙,并行進行唠倦。

Java提供一個Thread類,封裝了線程的創(chuàng)建涮较、執(zhí)行稠鼻、停止等行為控制。

Java的線程同步機制是基于傳統(tǒng)的監(jiān)控和條件變量方式狂票。

線程的具體執(zhí)行方式取決于java解析器(interpreter)運行的平臺候齿,有些支持時間分片的系統(tǒng)上,線程是采用時間分片的方式運行的(不考慮線程的優(yōu)先級闺属,每個線程都運行一定時間 額度)慌盯。
在不支持時間分片的系統(tǒng)上,線程還是按照優(yōu)先級來調(diào)度執(zhí)行掂器。對于這種情況亚皂,計算密集的線程需要考慮定時yield(),來給其他線程運行的機會唉匾。

  • 線程同步

Java通過支持定義Thread對象以及在運行時支持多線程運行孕讳,實現(xiàn)了從語法層面支持多線程。在語言層面 巍膘,被定義為synchronized的成員函數(shù)不會被并發(fā)執(zhí)行厂财。這類的函數(shù)通過monitors的控制,來保證其中定義的變量不會出現(xiàn)不一致的情況峡懈。 每一個類和實例化的變量都會被分配自己的monitor璃饱。

Java通過分配及釋放monitor的方式,保證同一時刻肪康,被標成synchronized的方法中只有一個會被執(zhí)行荚恶。

Best Practise: 保持一個對象是線程安全的撩穿,需要在可能修改它的實例變量的所有方法上加注synchronized

Java中的monitor是re-entrant(允許重復(fù)獲取),即使一個線程己經(jīng)擁有一個monitor, 如果它需要的話谒撼,它還需要獲得重復(fù)這個monitor食寡。 避免了因為己經(jīng)占有monitor,而導(dǎo)致的死鎖廓潜。

  • 多線程支持

Java對于多線程的支持是語法層面的,使得程序員更容易開發(fā)出線程安全的多線程程序辩蛋。

【Java設(shè)計理念7:High Performance】
本章解答兩個問題呻畸,其一,java語言的性能如何悼院? 其二伤为, 與其他語言相比,java的性能怎么樣据途?

  • Java語言的性能
    在個人電腦上Java語言本身創(chuàng)建對象绞愚、實例化對象、調(diào)用其他對象的方法昨凡,以及運行同步成員函數(shù)的性能大致如下:


    image.png

其性能能夠符合大多數(shù)程序的需求爽醋。

對于其他高性能程序來說,可以在Java運行的機器上便脊,通過just in time compiler(瞬時編譯機制)來快速翻譯成機器碼,進行運行光戈。對于常規(guī)的由編譯器和動態(tài)加載器組成的java環(huán)境來說哪痰,JIT compiler就像在動態(tài)加載器里的機器碼生成器, 即在動態(tài)加載時久妆,把字節(jié)碼直接編譯成機器碼晌杰。

由字節(jié)碼轉(zhuǎn)換出的機器碼,性能大致與C和C++相同筷弦。

  • Java與其他語言的性能比較


    image.png
  • Java的好處: 快速構(gòu)建可靠原型

動態(tài)語言比如TCL, Lisp或者SmallTalk因為開發(fā)出的程序非常健壯(不必擔心破壞內(nèi)存)肋演,經(jīng)常被用來構(gòu)建原型。

相類似的烂琴,Java也非常適合用來構(gòu)建原型爹殊,原因有兩點:

  1. Java也因為其垃圾回收機制, 使得程序員不需要考慮太多內(nèi)存的分配與回收的細節(jié)奸绷。

  2. 不同于TCL/Lisp/SmallTalk提供了豐富的語義梗夸,使得你不需要太早做決定?(TBD)号醉, Java要求你必須做明確的決定反症,在編譯期辛块,會檢查所有的方法調(diào)用是否正確。也就是說你在運行期铅碍,不用擔心方法調(diào)用失敗润绵。

Java設(shè)計理念8:Java系統(tǒng)package

Java系統(tǒng)包含很多工具類以方便程序員來開發(fā)適合不同平臺的應(yīng)用程序。
主要的包包括:
[1]. 基礎(chǔ)包 - java.lang
[2]. 工具包 - java.util
[3]. 抽象窗口工具包 - java.awt

  • java語言基礎(chǔ)類 - java.lang

    【1】系統(tǒng)相關(guān):System, Runtime, Process
    【2】基礎(chǔ)數(shù)據(jù)類型的封裝類:Byte, Short, Integer, Long, Float, Double, Character, Boolean, 額外的Number抽象類
    【3】注解:SupressWarning, Override, Depercated, Inherited, Native, Repeatable, Retention, Target
    【4】接口:AutoClosable, Runnable, Comparable, Interable, Readable, Cloneable
    【5】字符串處理:String, StringBuffer, StringBuilder, StringCoding
    【6】JMX管理: MemoryMXBean
    【7】錯誤和異常處理:Throwable, Error, Exception 及相關(guān)子類
    【8】其他重要的類: Class, Object, Math
    【9】反射相關(guān)類:Method, Construnctor...
    【10】引用相關(guān)類:Reference, WeakReference, SoftReference, ReferenceQueue, PhantomReference, FinalReference
    【11】instrument包:Instrumentation, ClassFileTransformer

  • Java輸入輸出類 - java.io

  • Java工具類 - java.util

    【1】數(shù)據(jù)結(jié)構(gòu)
    【2】function包-函數(shù)式編程
    【3】Stream包 - 流編程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胞谈,一起剝皮案震驚了整個濱河市尘盼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呜魄,老刑警劉巖悔叽,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爵嗅,居然都是意外死亡,警方通過查閱死者的電腦和手機睹晒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門趟庄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伪很,你說我怎么就攤上這事戚啥。” “怎么了锉试?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵猫十,是天一觀的道長。 經(jīng)常有香客問我呆盖,道長拖云,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任应又,我火速辦了婚禮宙项,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘株扛。我一直安慰自己尤筐,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布洞就。 她就那樣靜靜地躺著盆繁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奖磁。 梳的紋絲不亂的頭發(fā)上改基,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼秕狰。 笑死稠腊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鸣哀。 我是一名探鬼主播架忌,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼我衬!你這毒婦竟也來了叹放?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挠羔,失蹤者是張志新(化名)和其女友劉穎井仰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體破加,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡俱恶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年戒幔,在試婚紗的時候發(fā)現(xiàn)自己被綠了募判。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡飒赃,死狀恐怖锭环,靈堂內(nèi)的尸體忽然破棺而出聪全,到底是詐尸還是另有隱情,我是刑警寧澤辅辩,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布难礼,位于F島的核電站,受9級特大地震影響玫锋,放射性物質(zhì)發(fā)生泄漏鹤竭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一景醇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吝岭,春花似錦三痰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至幕帆,卻和暖如春获搏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背失乾。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工常熙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纬乍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓裸卫,卻偏偏與公主長得像仿贬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墓贿,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容