初始化與清理是涉及到安全的兩個問題。
1.用構造器確保初始化:
當我們通過new關鍵字來創建對象的時候,就是調用了構造方法。
java會在用戶有能力操作對象之前自動調用相應的構造器,從而保證了初始化的進行。
1.1java采用與C++相同的,構造器命名方式,即構造器方法名與類名相同。(方法名首字母小寫不適用與構造器);
1.2構造器是一種特殊類型的方法,因此它沒有返回值。
1.3默認構造器:不接收任何參數的構造器
2 方法重載:
同名不同參數,方法名相同而參數不同。
2.1區分重載的方法:每個重載的方法都必須有獨一無二的參數類型。
2.2基本類型的重載:如果傳入的數據類型小于方法中聲明的形式參數類型,實際參數會被提示。
2.3為什么不能以返回值區分重載;
有時候你并不關心方法的返回值,你想要的是調用方法的效果,這是你會忽略返回值,說以有時候會調用 會以這種形式調用:f(),java將無法得到返回值的信息,進而無法確定方法,所以根據方法的返回值來區分重載是行不通的。
3.默認構造器:
默認構造器:不接收任何參數的構造器
如果我們沒有創建任何構造器,編譯器會自動幫我們創建一個默認構造器。如果創建了構造器,編譯器就不會幫我們創建構造器。
4.this關鍵字:
當一個類具有多個對象的時候,那么在調用一個非靜態的方法的時候,是如何知道是被對象a調用了呢?還是被對象b調用了呢?
解析:編譯器做了一些幕后工作,它暗自把“所操作兌現過的引用”作為第一個參數傳遞給了對象所調用的方法。
既然是暗自操作,我們如何在方法中獲得這個對象引用呢?
為此有個專門的關鍵字:this,this關鍵字只能在方法內部使用,表示對“調用這個方法的那個對象”的引用。
如果在方法內部調用同一個類的方法,就不必使用this,直接調用即可。this引用會自動用于同一類中的其他方法。
4.1 this關鍵字對于將當前對象船體給其他方法很有用。就是將this作為返回值,在程序中我們會看見通知的創建方法的連續調用,就是采用這種方法。
4.2當方法中的參數與成員參數,同名的時候,默認會調用方法中的參數,當我們想使用類中的參數,就需要在參數名前加入this., 表示對成員變量的引用。
4.3.在構造器中調用構造器:
this.(參數列表);直接調用對應參數的構造器。
4.3.1構造器的調用只能至于方法的最起始處。
4.3.2 一個構造器只能調用另外一個構造器。不能調用兩個。
5.static的含義:
static方法就是沒有this的方法,在static方法的內部是不能調用非靜態方法。反過來倒是可以的。(這與類的加載先后有關系)
6.垃圾回收:
1. 對象可能不被垃圾回收,什么時候回收也不一定。
2.垃圾回收只于內存有關。(所以在輸入輸出流的時候選需要手動關閉)
6.1垃圾回收器是如何工作:
在創建了足夠的對象后,內存的資源將耗盡。而java的垃圾回收器的工作是一面回收空間,一面使堆中哦對象緊湊排列。方便“堆指針進行內存分配”。
6.1其他系統中的垃圾回收機制:引用計數:
這是一種簡單但是速度很慢的垃圾回收機制。每個對象都有一個引用計數器,當有引用連接至對象時,引用計數加1.當引用離開作用域或被置null,引用計數減1。雖然甘麗引用計數的開銷不大,但這項開銷在整個程序生命周期將持續發生。垃圾回收器會在含有全部對象的列表上遍歷,當發現某個對象引用計數為0時候,釋放其占用的空間。(但是,引用計數模式經常會在計數值變為0的時候立刻釋放對象)。這種方法游客缺陷:如果對象間具有循環引用。可能出現“對象應該被回收,但是引用計數卻部位零”的情況。對于垃圾回收器而言,定位這樣的交互子應用對象需要的工作兩極大。
在一些更快地模式中,垃圾回收器并非基于引用記數,它地思想是:對任何“活”的對象,一定能追溯到起存活的在堆棧內存或者靜態存儲區之中地引用。這個引用鏈條可能會穿過數個對象層次。因此,如果從堆棧和靜態存儲區地開始,遍歷所有地引用,就能找到所有獲得對象。對于發現地每個引用,必須追溯它所指向的引用,然后是被指向對象所包含地所有引用,如此反復。直到“根源于堆棧和靜態存儲區的引用”所形成地網絡全部被訪問為止。你訪問過得對象都必須是活的。這樣就解決了“對象間相互引用”而導致對象無法回收地現象。因為這種情況根本不會被視為活地對象;
解析:上面說了兩種垃圾回收機制:原理都是當對象沒有引用指向地時候就被視為垃圾,可以回收了。第一種采用對象引用計數的方式進行確定指向對象地引用地個數。
java虛擬機采用了一種自適應的垃圾回收計數。至于如何處理找到地存活地對象,取決于不同地java虛擬機。
java虛擬機地兩種垃圾回收機制:
1.停止--復制 ?
這意味著,先暫停程序地運行(所以它不屬于后臺回收模式),然后將所有存活的對象從當前堆復制到另一個堆,然后沒有被復制地全部是垃圾。當對象被復制到新堆時,它們是一個挨著一個的。所有新堆保持緊湊排列,然后可以按加快內存地分配,加快了內存地分配速度。
當把一個對象搬運到另一處時,所有指向它的那些引用必須修正。位于棧內存和靜態區域地引用可以直接被修正,但是在對象中地引用,他們在遍歷地過程中才能被找到。(可以想想有個表格,將舊地址映射到新地址中)。
對于這種所謂地“復制式的回收器”而言,效率會降低,這有兩個原因。首先需要兩個堆然后得在兩個分離地堆之前來回倒騰。從而得維護地空間比實際需要地就多一倍地空間。某些java虛擬機堆此問題地處理方式是,按需從堆內部分配成幾個較大地內存,然后復制動作發生在這些大塊內存之間。
2.標記-清掃
程序進入穩定狀態后,可能只會產生少量垃圾,甚至沒有垃圾。盡管如此,停止--復制回收器仍然會將所有內存(活地對象)自一處復制到另一處,這很浪費。(因為基本上都是需要移動地對象)。為了避免這種情況,一些java虛擬機會進行檢查:要是沒有新的垃圾產生,就會轉換到另一種工作模式(自適應)。這種模式就是標記--清掃。一般情況下,標記--清掃方式速度很慢,只有在垃圾特別少或則不產生垃圾地時候就,這種方式運行地速度很快。
標記--清掃 所依據地思路同樣是從堆棧和靜態區域存儲出發,遍歷所有地引用。進而找出所有存貨地對象,每當它找到一個存活地對象。就會給這個對象一個標記。這個過程不會回收任何對象。只有當全部標記完成的時候,清理動作才會開始。在清理過程中,沒有標記地對象將被釋放,不會發生復制動作。所以剩下地堆空間是不連續地。垃圾回收器要是希望得到連續地空間地話,就得重新整理剩下地對象。
自適應技術:java虛擬機會進行監視如果和所有對象都很穩定,垃圾回收地效率降低地話,就會切換到標記-清掃模式,同樣,java虛擬機會跟蹤標記--清掃地效果。要是堆空間出現很多碎片,就會切換到停止--復制方式。
7.成員初始化:
所有變量在使用前都能得到愜當地初始化。對于方法中地局部變量,java編譯器是以編譯器錯誤地形式來保證初始化。成員變量地初始化,具有默認初始化和指定初始化兩個過程。
8.靜態數據初始化:
無論創建多少個對象,靜態數據都只占有一份存儲區域。static不能應用于局部變量,只能作用于成員變量。如果一個靜態成員沒有被初始化,他就會獲得默認值,引用為null,基本數據類型為默認值。
對象地創建與初始化過程:
1,當我采用new關鍵創建一個對象或者調用類的靜態方法或則靜態域地首次訪問的時候。
2.java解釋器必須查找路徑,一定為.class文件。(java是如何查找.class文件?是如何生成.class文件的呢?后面會說到。..class根據后綴就只域class類有關系)
3.載入.class文件(這時候會生成一個class對象),關于靜態初始化地所有動作都在這里進行。因此靜態初始化只在Class對象地首次加載地時候進行一次。
4.以下地步驟會在new關鍵字創建對象地時候才會執行,如果是調用類的靜態方法或則靜態域地首次訪問的時候地情況,以下地步驟并不會執行到。
5,當new關鍵字創建對象地時候,會在堆內存上為對象分配住夠地空間。
6.這塊存儲空間會被清零,這就自動將Dog對象中的所有的基本類型數據都設置為默認值(對數字是0,對布爾類型是false),而對引用被設置成了null。
7.然后調用父類的構造方法。
8.然后對于需要指定初始化的數據,進行初始化。
9.執行構造器中的代碼。
10.完成初始化。
在創建一個類使用之前要進行這些工作后,我們才可以使用這個對象
9.顯示靜態初始化
:將多個靜態動作組織成一個特殊的“靜態子句”有時也叫靜態塊。
靜態塊的寫法:static{ ? i=9;f() ?}
采用static關鍵字+大括號來進行。
靜態塊:中的代碼執行與靜態變量是一樣的,會在類的首次加載的時候一次。在靜態快中的方法也會被調用,被執行。
10 非靜態實例初始化:與靜態初始化類似,就是不需要進行用statci關鍵字修飾:
{? i=9;f()? },代碼塊中的代碼會在創建每一個實例,調用父類構造器后執行。
11.數組是相同類型,用一個標識符封裝到一起的一個對象序列或基本類型序列。
當我們創建一個數組就會被自動初始化。
12.可變參數列表:
可變參數列表是方法參數的一種聲明方式,一個方法中只能聲明一個,并且只能為參數列表的最后位置。
聲明方式 open(String。。。 s);
使用方法,當調用方法的時候,可以傳入0·n哥String對象,傳入方式為open(“s”,“s”);
在方法內部將s視為字符串數組即可。
本章完畢 等要學服務端的時候在說說枚舉
1-010101010