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