淺談Java特性
學習Java有幾個月了,記錄下此時的體會與總結。結合Java體系結構、JVM原理和JDK原始碼,談談我對Java的理解及其特性的分析。
Java語言特性
SUN公司對Java的描述:
“Java is a simple,object-oriented, distributed,
interpreted, robust, secure, architecture neutral, portable,
high-performance, multihreaded, and dynamic language”.
Java語言最初是面向嵌入式系統開發的語言,其主要是為了滿足“一次編譯,到處執行”的需求。眾所周知,Java具有健壯性、安全性、平臺無關性、可移植性、面向物件等特性。隨著網路技術的發展,分散式的大量應用,Java語言逐漸發展出面向網路
簡易性
較之C/C++,Java簡單且好用,它拋棄了指標、操作符過載、類多繼承、自動強制型別轉換。
不支援操作符過載
Java中僅有的兩個操作符過載為String的+ 和+=
檢視String的註釋,發現Java為其提供特殊支援,+操作會轉化為StringBuilder或StringBuffer,呼叫append方法完成。
* The Java language provides special support for the string
* concatenation operator ( + ), and for conversion of
* other objects to strings. String concatenation is implemented
* through the {@code StringBuilder}(or {@code StringBuffer})
* class and its {@code append} method.
不支援指標
- Java沒有顯式地使用指標
- JVM由C++實現,其操作可能涉及指標操作
- JVM呼叫native方法可能涉及指標操作
不支援類的多繼承
- 此處放到面向物件特性講
不支援自動強制型別轉換
- 使用強制型別轉換的時候要加上強制型別轉換符()
- 自動型別轉換:型別要相容且目標型別要大於源型別
- boolean不允許任何型別的轉換
- 類資料型別不允許轉換(同族可以)
boolean型別較為特殊
- 編譯成位元組碼時用int或byte表示
- JVM中,0表示false;非零表示true;
- boolean用int操作
- boolean陣列用byte陣列訪問
int i = 0;
char c = 'a';
int x = c;//使用自動型別轉換
byte b1 = i;//使用自動強制型別轉換,錯誤
byte b2 = (byte)i;//使用顯式強制型別轉換,正確
面向物件
說到面向物件,不得不說其三大特性:繼承、封裝和多型。其作用如複用性、耦合性在此不再贅述。
繼承
- Java支援類的單繼承
- Java支援介面的多繼承,Java集合框架中許多體現
- 建立一個類若不顯式指明繼承關係,隱式繼承自Object
- 使用extends關鍵字,自動得到基類中所有域和方法(包括私有,但無法訪問)
- 基類包裝在子類的內部,這解釋為何先呼叫父類建構函式
多型
相同型別的引用變數,呼叫同一個方法呈現不同行為特徵。
過載&重寫
過載 靜態分派
靜態、私有、例項構造器、父類方法會在解析階段把符號引用轉化為直接引用重寫 動態分派
執行期根據實際型別方法執行分派
本質把常量池中類方法的符號引用解析到不同的直接引用上
重寫規則:兩同兩小一大
- 方法名,引數列表相同
- 返回型別和丟擲異常小於父類
- 訪問許可權大於父類
封裝
訪問控制符
- 外部類:public default abstract final修飾
- 內部類:所有
- 區域性內部類:相當於成員變數,無訪問控制修飾符
安全性&健壯性
內置於JVM的安全特性確保了Java語言的健壯性。但Java的分散式、面向網路特性會帶來安全問題,Java安全模型是一種擴充套件的內建安全模型,側重於保護使用者避免來自網路的惡意程式碼的侵害。強化其了健壯性,故一起分析。
類裝載器雙親委派模型
- 防止不可靠類代替信任類
- 通過包許可權控制不可靠類的活動範圍
class檔案檢驗器
- 即類載入驗證階段,在此不贅述
內置於JVM的安全特性
- 型別安全的引用轉換
- 自動垃圾回收
- 記憶體結構化訪問
1.無指標
2.class檔案裡無記憶體佈局資訊 - 陣列邊界檢查
- 物件引用檢查:引用非空
- 異常的結構化處理
安全管理器及Java API
程式碼簽名和認證
平臺無關性
平臺無關性來自於JVM、Java語言、class檔案、API的支援
JVM
- Java程式只需要與JVM互動,JVM通過API和主機互動
- 位元組碼指令集面向運算元棧而不是暫存器
Java語言
- 基本資料型別的值域和行為都是由語言自己定義的
class檔案
- 8位位元組為基礎單位的二進位制流
- 嚴格限制位元組碼儲存格式,與JVM無關
面向網路
Class檔案
- 將程式分割為各個Class檔案傳輸:動態連線與擴充套件特性
- 檔案格式緊湊,8位位元組為基礎,便於傳輸
RMI
- 遠端物件將會把自身的一個拷貝序列化後以Socket的形式傳輸給客戶端
序列化
- 物件可以被表示為一個位元組序列,便於儲存和傳輸
問題
面向網路:分散式傳輸效能、及安全問題
健壯性:垃圾收集器給記憶體管理和執行緒排程帶來問題
平臺無關性:API最小公分母問題
保密性:Java語言和class檔案聯絡緊密,class檔案包含過多資訊;混淆器