引自: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)上出錯的問題。
- 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代碼編譯、運行流程圖
- 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)建原型爹殊,原因有兩點:
Java也因為其垃圾回收機制, 使得程序員不需要考慮太多內(nèi)存的分配與回收的細節(jié)奸绷。
不同于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包 - 流編程