1. 程式人生 > >淺談Java特性

淺談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檔案包含過多資訊;混淆器