Java基礎
Java如何運行的?
開發的java源代碼,通過javac編譯成為平台無關的字節碼文件(class),然后通過JVM的解釋器將字節碼解釋成對應的機器碼
“一次編譯,到處運行”的理解
說的是java的跨平台特性,與JVM密不可分,不同環境和平台安裝好JDK就有java運行環境,並不是說java是跨平台語言;到處運行的關鍵和前提是JVM,在可以運行JVM的地方都內含着一個JVM操作系統,從而使Java提供了各種不同平台上的虛擬機制,因此實現了到處運行的效果
JDK、JRE、JVM的區別
JDK | java開發工具包 |
JRE | java運行時環境,包含JVM和Java類庫 |
JVM | 虛擬機,運行java字節碼的運行時環境 |
什么是封裝,繼承,抽象?
封裝 | 隱藏對象的屬性和實現細節,僅對外提供公共訪問方式--安全性、復用性 |
繼承 | is-a的關系,子類接受共有的屬性和方法,並加入獨有的屬性和方法 |
抽象 | 共有的方法名和類,具體實現交給子類 |
繼承注意事項
1、子類只能繼承父類所有非私有的成員(成員方法、成員變量)
2、子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類構造方法
equals和==的區別
== | 比較的是變量在內存中堆內存地址,判斷兩個對象的地址是否相同,即是否指向同一個對象 |
equals | 比較兩個對象內容是否相等,Object類也有equals,但調用==,如果類不重寫equals方法,則調用Object的equals |
HashCode和equals的一些約定
a:equals 相等,hashCode 一定要相等
b:重寫了 hashCode 也要重寫 equals
c:hashCode 需要保持一致性,狀態改變返回的哈希值仍然要一致
怎么理解多態?好處?為什么要用多態?
多態:父類的引用指向子類
好處:子類的功能可以被父類的方法或引用變量所調用
為什么用:復用性,高內聚低耦合,可擴展性
super和this的區別
this | 代表本類的對象引用 |
super | 代表本類的父類的引用,代表父類存儲空間的標識 |
代碼塊執行順序
靜態代碼塊(只執行一次)-> 構造代碼塊(每次執行構造方法前都執行)-> 構造方法
普通類初始化順序
靜態屬性(變量、方法)-> 靜態代碼塊-> 成員屬性 -> 構造代碼塊 -> 構造函數
繼承的子類初始化順序
父類靜態屬性 -> 父類靜態代碼塊 -> 子類靜態屬性 -> 子類靜態代碼塊 -> 父類成員變量 -> 父類構造代碼塊 -> 父類構造方法 -> 子類成員變量 -> 子類構造代碼塊 -> 子類構造方法
final、finally、finalize的區別
final |
修飾類:類不可被繼承 修飾變量:基本數據類型的變量不可重新賦值,引用類型的變量不可指向其他對象 修飾方法:方法不可被重寫,即該方法無需進行擴展 |
finally |
finally語句塊總會被執行,通常是資源的回收(數據庫關閉,IO關閉,網絡關閉等) |
finalize |
保證對象在被垃圾收集之前完成特定的資源回收 |
Java異常類相關
Error | 未檢查異常,系統級別錯誤,無法恢復和預防,如系統崩潰,虛擬機錯誤,內存空間不足 |
Exception | 分RuntimeException(未檢查)和IOException(需檢查),程序級別錯誤,可恢復和預防,創建一個類繼承Exception是需檢查異常 |
throw | 用在方法體內,拋出異常對象名,可以拋出任意Throwable,需由方法體內的語句或throws拋出處理 |
throws | 用在方法名后,跟的是異常名,表示可能拋出異常,並不一定發生這些異常,由方法調用者處理異常 |
接口和抽象類的區別
接口 | 1、不包含非常量成員 2、都是靜態抽象方法,可多繼承 3、只能public,沒有構造方法,沒有main函數不可運行 4、主要作用:API定義和實現分離的目的 |
抽象類 | 1、可以有普通成員變量 2、可有成員方法也可有抽象方法,單繼承 3、public、protected、private都可以,有構造方法,有main函數 4、主要作用:代碼重用 |