-------------------------關於對象的構造過程------------------------
若是類B繼承了類A,那麼當建立類B的實例時,遵循以下過程:
一、若是類A有靜態的成員變量,初始化它
二、若是類A有靜態代碼塊,執行它
三、若是類B有靜態的成員變量,初始化它
四、若是類B有靜態代碼塊,執行它
五、若是類A有非靜態的成員變量,初始化它
六、若是類A有初始化代碼塊,就執行它
七、執行類A的構造函數
八、若是類B有非靜態的成員變量,初始化它
九、若是類B有初始化代碼塊,就執行它
十、執行類B的構造函數
一個對象建立的大體過程:遞歸的構造父類對象,爲對象分配內存空間,爲實例變量賦初值,調用構造方法。
構造方法是對象被建立時由系統自動調用的,不能在其餘方法中調用構造方法。
若是類B繼承了類A,能夠在類B的構造方法中調用類B的一個構造方法,但必須是在第一行中用this關鍵字進行調用(this指向當前的對象,若是掉用帶參數的構造方法,則在this後面跟上參數)。類B能夠經過super關鍵字調用類A的某個構造方法(若是是調用類A的帶參數的構造方法,則在super後面跟參數,也就是說,super指向父類的對象),但super必須出如今類B構造函數的第一行。默認狀況下,類B會隱式地經過super()來調用類A的默認構造方法。
類加載的原則:能不加載就不加載,而且類只加載一次。
一、第一次建立對象時,加載類;
二、經過類名調用靜態變量或方法時,加載類
三、聲明一個對象引用時,不加載類
四、經過子類訪問父類的靜態方法或屬性時,只加載父類
五、加載子類前先加載父類
六、若是經過類名訪問公開靜態常量,那麼若是編譯器能在編譯時肯定,那麼類就不會被加載,不然加載。
--------------------------重載和多態-------------------------------
Java中,靜態方法不存在多態。在任何一個類的方法中,都不能聲明static變量
在JAVA的繼承關係中,不能用非靜態方法覆蓋靜態方法,反過來,也不能用靜態方法覆蓋非靜態方法;但屬性沒有這個限制
若是有多個相匹配的重載方法,則調用精度最高的那個方法。
方法重載(overload)的原則:在同一個類中,方法名相同,但參數個數和參數類型至少有一項不一樣。注意:不能按返回類型的不一樣而區分不一樣的方法!!!
方法重寫(override)的原則:方法名相同,參數個數和參數類型也相同,返回類型兼容,拋出的異常不能更寬泛,不能下降方法的訪問權限(但能夠提升)
Java 中的方法中參數不能有默認值,JDK 5.0中增長了可變長數組,可是一個方法中只能有一個可變長數組,而且它必須放在方法參數列表的最右邊
能夠利用System類中的類方法gc()建議Java虛擬機回收內存(視乎JVM的實現),由於Java規範沒有對垃圾回收機制的具體實現做出規定
--------------------fianl finally finalize---------------------
final 方法不能被重寫(override),只能被繼承或重載,
final 常量屬性能夠被繼承和隱藏
final 類不能被繼承
finally 用在try{...}catch{...}finally{...}中,注意:若是有try,就必需要有catch或finally,便可以try{..}finally{...}或try{...}catch{...}
finalize 是Object類的一個方法,當一個對象再也不被任何變量引用時,由對象的垃圾回收器在適當的時候調用此方法。子類能夠重寫 finalize 方法,以配置系統資源或執行其餘清除。
另外,對於final的屬性,能夠直接賦值初始化,也能夠在構造函數裏初始化
final能夠用來修飾屬性,方法,類和塊變量
--------------------------------接口和抽象類
抽象類能夠有構造方法,可是接口沒有
接口是特殊的抽象類,一個類能夠同時繼承一個類和實現多個接口;接口和接口之間能夠多重繼承
接口中的量被默認爲final,public,static,接口中的方法被默認爲public abstact
接口中的常量可直接經過接口名調用
若是一個類不實現該接口的全部方法,則該類必須被聲明爲抽象類
---------------------------關於繼承
Java只支持單繼承表明調用父類的構造方法
* 子類和父類在同一個包中的繼承性:子類繼承了其父類中不是private的成員變量和方法,而且訪問權限保持不變
* 子類和父類不在同一個包中的繼承性: 子類繼承了父類的protected和public的成員變量和方法,而且訪問權限不變
關鍵字private確保只有本類的方法能訪問,其餘類的方法不能訪問(包括其子類的方法)
關鍵字public確保任何類的方法都能訪問接
關鍵字friend和protected確保本類的方法或處於同一個包中的方法能訪問
訪問修飾符protected的進一步說明:
一個類中的protected成員變量和方法能夠被它的直接子類和間接子類繼承。
詳見書本表格。。。。。。。。。。。。。。。。。。
-------------------------局部變量和實例變量,靜態方法和非靜態方法------------
實例變量在類中定義,能夠不用初始化,由於默認值是null,他的壽命跟對象相同
局部變量定義在方法或塊中,使用前必須初始化,不然會報錯,由於局部變量沒有默認值
靜態方法中不能訪問非靜態的方法
------------------------關於內部類和內部接口---------------------------------------------
內部類分四種,[非靜態]成員內部類(實例內部類),靜態成員內部類,方法內部類(局部內部類),匿名內部類
(非靜態)成員內部類:
定義在類(包括抽象類)中
四個訪問權限修飾符均可以修飾成員內部類。
在建立成員內部類的實例時,外部類的實例必須存在。(例子)
成員內部類的實例自動持有外部類的實例的引用。
外部類實例與內部類實例之間是一對多的關係。即:一個內部類實例只會引用一個外部類實例,而一個外部類實例對應零個或多個內部類實例。在外部類中不能直接訪問內部類的成員,必須經過內部類的實例去訪問。可是內部類能夠訪問外部類的成員和方法!
成員內部類中不能定義靜態成員,而只能定義實例成員!!
若是實例內部類B與外部類A包含同名的成員或方法(只要同名便可),那麼類B的成員或方法會把類A的成員或方法屏蔽掉!!!
內部類和外部類在編譯時是不一樣的兩個類,內部類對外部類沒有任何依賴。最終會獲得兩個類文件,這兩個類文件沒有任何關係
靜態成員內部類:
被冠以static的成員內部類
靜態內部類的實例不會自動持有外部類的特定實例的引用,在建立內部類的實例時,沒必要建立外部類的實例。
靜態內部類能夠直接訪問外部類的靜態成員和靜態方法,若是訪問外部類的實例成員和實例方法,就必須經過外部類的實例去訪問!注意:靜態成員內部類中能夠覆蓋外部類的成員和方法(只要同名便可)
在靜態內部類中能夠定義靜態成員和實例成員!!
客戶類能夠經過完整的類名直接訪問靜態內部類的公有靜態成員和公有靜態方法!!!
注意:當類與接口(或者是接口與接口)發生方法命名衝突的時候,此時必須使用內部類來實現。
用接口不能徹底地實現多繼承,用接口配合內部類才能實現真正的多繼承。
局部內部類:
局部內部類只能在當前方法中使用,該類不能被public、protected、private修飾符修飾,也不能是靜態的。
和實例內部類同樣,不能包含靜態成員。
在局部內部類中定義的內部類不能被public、protected、private訪問控制修飾符,也不能是靜態的。
局部內部類和實例內部類樣,能夠訪問外部類的全部成員,此外,局部內部類還能夠訪問所在方法中的final類型的參數和變量(訪問方法中的變量和方法參數必須是final的)。
若是要實例化局部內部類,則必須聲明在前,實例化在後
匿名內部類
匿名類是一種特殊的局部內部類,這種類沒有名字。
匿名類自己沒有構造方法,可是會調用父類的構造方法.
匿名類儘管沒有構造方法,可是能夠在類中提供一段實例初始化代碼,JVM會在調用父類的構造方法後,執行這段代碼。
除了能夠在外部類的方法內定義匿名類之外,還能夠在聲明一個成員變量時定義匿名類。
匿名類除了能夠繼承外,還能夠實現接口
匿名類和局部內部類同樣,能夠訪問外部類的全部成員,若是匿名類位於一個方法中,還能訪問所在方法中的final類型的變量和參數。
局部內部類的名字在方法外是不可見的,所以與匿名類同樣,可以起到封裝類型名字的做用。
匿名內部類的初始化代碼塊只執行一次,即初始化一個實例
內部接口:
在一個類(包括抽象類)中也能夠定義內部接口,該接口能夠被四個訪問修飾符修飾
在接口中能夠定義靜態內部類(該內部類默認是public static,也能夠加上abstract修飾符,聲明爲抽象的),此時靜態內部類位於接口的命名空間中。
在接口中還能夠定義接口,這種接口默認也是public static 的,如Map.Entry就是這種接口
--------------------------------------