Java 基礎 40 語言特性 12
Q1:Java 語言的優點?
① 平臺無關性,擺脫硬體束縛,“一次編寫,到處執行”。
② 相對安全的記憶體管理和訪問機制,避免大部分記憶體洩漏和指標越界。
③ 熱點程式碼檢測和執行時編譯及最佳化,使程式隨執行時間增長獲得更高效能。
④ 完善的應用程式介面,支援第三方類庫。
Q2:Java 如何實現平臺無關?
JVM: Java 編譯器可生成與計算機體系結構無關的位元組碼指令,位元組碼檔案不僅可以輕易地在任何機器上解釋執行,還可以動態地轉換成本地機器程式碼,轉換是由 JVM 實現的,JVM 是平臺相關的,遮蔽了不同作業系統的差異。
語言規範: 基本資料型別大小有明確規定,例如 int 永遠為 32 位,而 C/C++ 中可能是 16 位、32 位,也可能是編譯器開發商指定的其他大小。Java 中數值型別有固定位元組數,二進位制資料以固定格式儲存和傳輸,字串採用標準的 Unicode 格式儲存。
Q3:JDK 和 JRE 的區別?
JDK: Java Development Kit,開發工具包。提供了編譯執行 Java 程式的各種工具,包括編譯器、JRE 及常用類庫,是 JAVA 核心。
JRE: Java Runtime Environment,執行時環境,執行 Java 程式的必要環境,包括 JVM、核心類庫、核心配置工具。
Q4:Java 按值呼叫還是引用呼叫?
按值呼叫指方法接收呼叫者提供的值,按引用呼叫指方法接收呼叫者提供的變數地址。
Java 總是按值呼叫,方法得到的是所有引數值的副本,傳遞物件時實際上方法接收的是物件引用的副本。方法不能修改基本資料型別的引數,如果傳遞了一個 int 值 ,改變值不會影響實參,因為改變的是值的一個副本。
可以改變物件引數的狀態,但不能讓物件引數引用一個新的物件。如果傳遞了一個 int 陣列,改變陣列的內容會影響實參,而改變這個引數的引用並不會讓實參引用新的陣列物件。
Q5:淺複製和深複製的區別?
淺複製: 只複製當前物件的基本資料型別及引用變數,沒有複製引用變數指向的實際物件。修改克隆物件可能影響原物件,不安全。
深複製: 完全複製基本資料型別和引用資料型別,安全。
Q6:什麼是反射?
在執行狀態中,對於任意一個類都能知道它的所有屬性和方法,對於任意一個物件都能呼叫它的任意方法和屬性,這種動態獲取資訊及呼叫物件方法的功能稱為反射。缺點是破壞了封裝性以及泛型約束。反射是框架的核心,Spring 大量使用反射。
Q7:Class 類的作用?如何獲取一個 Class 物件?
在程式執行期間,Java 執行時系統為所有物件維護一個執行時型別標識,這個資訊會跟蹤每個物件所屬的類,虛擬機器利用執行時型別資訊選擇要執行的正確方法,儲存這些資訊的類就是 Class,這是一個泛型類。
獲取 Class 物件:① 類名.class 。②物件的 getClass方法。③ Class.forName(類的全限定名)。
Q8:什麼是註解?什麼是元註解?
註解是一種標記,使類或介面附加額外資訊,幫助編譯器和 JVM 完成一些特定功能,例如 @Override 標識一個方法是重寫方法。
元註解是自定義註解的註解,例如:
@Target:約束作用位置,值是 ElementType 列舉常量,包括 METHOD 方法、VARIABLE 變數、TYPE 類/介面、PARAMETER 方法引數、CONSTRUCTORS 構造方法和 LOACL_VARIABLE 區域性變數等。
@Rentention:約束生命週期,值是 RetentionPolicy 列舉常量,包括 SOURCE 原始碼、CLASS 位元組碼和 RUNTIME 執行時。
@Documented:表明這個註解應該被 javadoc 記錄。
Q9:什麼是泛型,有什麼作用?
泛型本質是引數化型別,解決不確定物件具體型別的問題。泛型在定義處只具備執行 Object 方法的能力。
泛型的好處:① 型別安全,放置什麼出來就是什麼,不存在 ClassCastException。② 提升可讀性,編碼階段就顯式知道泛型集合、泛型方法等處理的物件型別。③ 程式碼重用,合併了同類型的處理程式碼。
Q10:泛型擦除是什麼?
泛型用於編譯階段,編譯後的位元組碼檔案不包含泛型型別資訊,因為虛擬機器沒有泛型型別物件,所有物件都屬於普通類。例如定義 List