訪問權限
成員訪問權限
- 默認成員訪問權限爲package,只能被同一package內類訪問
- protected可被同一package內類訪問,因此protected = package + 跨package子類
- 成員訪問權限大小:public > protected > package > private
類訪問權限
- 默認類訪問權限爲package,只能被同一package內類訪問和繼承
- public類訪問權限可被所有package內類訪問和繼承
注1:成員訪問權限 = min(成員訪問權限, 類訪問權限),因此package類成員的public權限和protected權限本質還是package權限
注2:不管是成員訪問權限還是類訪問權限,package訪問權限只是認知上的理解,訪問權限本身並無package關鍵字,默認缺省就是package訪問權限
繼承
- 只支持單根繼承,不支持多重繼承,無顯式父類則繼承自root類Object
- 只有唯一繼承方式,public繼承,且public無須顯式指明
class加載
- class被引用時(包括實例化對象和引用類static成員),jvm會加載相關class文件
- class加載順序:父類(數據成員類->當前類)->子類(數據成員類->當前類)
- 數據成員類加載順序與數據成員類(static和non-static)在類中定義順序一致
初始化
static數據成員初始化
- static數據成員不屬於實例對象成員,static數據成員於class加載時初始化,static數據成員初始化順序與static數據成員在類中定義順序一致,且只初始化一次
- static數據成員初始化早於non-static數據成員初始化
non-static數據成員初始化
- non-static數據成員屬於實例對象成員,non-static數據成員於實例化對象時初始化
- non-static數據成員初始化順序:父類(non-static數據成員->構造函數)->子類(non-static數據成員->構造函數)
- non-static數據成員初始化順序與non-static數據成員在類中定義順序一致
- non-static數據成員若無顯式初始化,則初始化爲0
this&super
構造函數
- java構造函數功能單一,不含初始化列表,或初始化列表散落在數據成員定義處,因此數據成員初始化先於構造函數調用
- 在性能和安全性之間,java選擇了安全性,java數據成員默認初始化爲0(引用類型爲null)
- java構造函數無初始化列表,因此java構造函數本質並非初始化行爲,因此java構造函數與普通函數無本質區別,構造函數多次調用不會導致重複初始化
- java構造函數非常靈活,構造函數可相互調用,但不可遞歸調用(直接遞歸或間接遞歸),構造函數調用語句只能放在主調構造函數首行,構造函數不可被普通函數調用
- 父類構造函數必須顯式調用(子類構造函數調用),且必須放在首行,如果調用父類默認構造函數,可omit,因此除非調用父類默認構造函數,否則子類不可調用本類其他構造函數,否則違背構造函數調用必須放在首行原則
複製構造函數
- java只有heap實例對象,無stack實例對象,且實例對象只能通過引用間接訪問,不可直接訪問實例對象,因此java無複製構造函數
析構函數
- java通過GC(Garbage Collection)機制管理對象內存,因此java無析構函數
賦值操作符函數
- java不支持操作符重載,因此java無賦值操作符函數
non-static方法
- non-static方法默認runtime bind,因此編譯期無法確認non-static方法是否會被調用,爲避免runtime crash,non-static方法必須實現
- override方法時,子類訪問權限不能比父類訪問權限小,即子類訪問權限必須大於等於父類訪問權限(public > protected > package > private)
注:構造函數編譯期bind,必須實現,父類子類構造函數之間訪問權限大小無限制
static方法
- static方法既可通過類名(類作用域)引用,也可通過實例對象引用
- static方法名字按照類作用域對象名字查找規則查找,因此編譯期bind
- static方法編譯期bind,但也必須實現