1 建立和銷毀物件

2022-09-15 11:18:12 字數 3470 閱讀 8148

1.使用建構函式

2.使用返回物件的靜態函式

1.方法中的區域性變數-----必須初始化才可以進行使用

2.類的屬性變數---------可以不進行初始化

物件的reference初始化為null

基本型別變數會自動的初始化

3.變數的初始化順序

3.1首先初始化類的屬性-----呼叫他們的建構函式

3.2呼叫自己的建構函式

例子:

class house

void f()

}public class orderofinitialization

}執行結果:

1.建立 window(1);window(2);window(3); 2.呼叫house的建構函式 3.呼叫f()

準確的建立過程是這樣的:

1.main函式中,建立了乙個house的物件,首先會建立並初始化house類的例項的屬性,也就是w1,w2,w3(如果有父類的話先呼叫父類的建構函式)

2.之後開始呼叫house類的建構函式,其中首先重新初始化了w3之後呼叫了house的成員函式f();

3.這裡要注意的是:每建立乙個house例項,這個house的屬性,w1,w2,w3都會被自動的初始化一次。

static屬性除外,它只會建立一次,而且是在最開始的時候,也就是類建立的時候與物件的建立無光(但是只有在用到的時候(用到類)才會建立static物件)

4.類的屬性的初始化

4.1 靜態成員屬性

這段**只會在類第一次被使用的時候被呼叫

static{

#進行初始化

} 4.2 非靜態的成員屬性

每建立乙個物件,該段**都會被執行一次

{#進行初始化

}j**a和c++中間有一堵由動態記憶體分配和垃圾**技術組成的高牆,j**a沒有析構函式,程式設計師不能決定物件什麼時候會被記憶體**。

3.1如何判斷物件是不是"無用"

j**a虛擬機會對物件進行"可達性分析"(並不是有的文章寫的使用引用計數器進行判斷),判斷物件是不是沒用了,對於不可達的物件,虛擬機會把物件駕到佇列中(f-queue)進行第一次標記,如果這些物件的finalize()函式被執行過,或者不存在,那麼就不進行處理,否則會對物件在此進行標記,在下一次垃圾**的時候進行記憶體的**,如果期間物件重新被引用了,那麼就不進行垃圾**,這個過程就是垃圾**的二次標記

總結:1.使用可達性分析判斷物件的狀態,使用二次標記呼叫finalize()函式

2.finalize() 函式並不是析構函式(c++銷毀物件的空間時候必須呼叫析構函式,如果程式沒有錯誤,物件一定會被銷毀),j**a中的物件是不一定會銷毀:1. 物件可能不會被垃圾** 2.垃圾**函式finalize() 並不是析構函式

類--j**a中的所有類都有相同的基類(object) 

這使得j**a中的所有類都有一些相同的function:比如equals、hashcode、wait、notify、notifyall等

j**a是多實現的,可以實現多個介面

string s=new string(「j**a string"); #s是string類的乙個物件的引用

string s; #引用而不建立物件—不是好習慣,和基本型別一樣,如果s是函式的區域性變數,那麼s必須初始化,如果s是類的屬性,那麼會自動的初始化為null

public

void swap(int a,int

b)

public static void tricky(point arg1, point arg2)

說明由於傳遞的是值的引用的副本,所以賦值是有效的

1.問題-怎麼對值進行交換?

法一

int a = 4;

int b = 5;

public void swap()

法二:利用陣列

publicvoid swap(t arrays)

j**a中記憶體管理

儲存器--速度最快,j**a中不能直接操作暫存器,也不能直接申請暫存器的儲存空間,都是自動完成的

stack--物件引用、區域性變數表、returnaddress

heap--物件(new 出來的東西都儲存在堆中)

常量--編譯期間會把常量存入常量池,常量池在j**a中屬於方法區(常量池)

j**a基本型別

基本型別的儲存空間並不像其他的語言那樣隨著平台,機器的改變而改變,j**a的的跨平台特性。--------位元組碼

基本型別的建立於c++相同,不使用new的方式,儲存在stack中。

boolean大小

boolean a=true;//這個a在jvm中佔4個位元組即:32位。

boolean b = new boolean[10];//陣列時,每乙個boolean在jvm中佔乙個位元組。

j**a中的陣列

自動的初始化,null

j**a中的作用域與物件銷毀

{/*變數的作用域(同乙個函式中不能有相同名稱的變數)*/

int x=10;

{int x=20;

}}

上述的**在j**a中不能編譯通過,會提示變數已經被定義過(挺好的本來就沒有必要,雖然在c++等很多的程式語言之中時可以這麼寫的)

{string s=new string(「s string ");

}/*out of scope,此時s,引用物件(stack)已經被銷毀,而string物件還繼續存在*/

程式設計師不用關注物件所佔的記憶體空間的釋放問題,j**a的垃圾**器執行在後台,用來監控new出來的所有物件,一旦不再需要的時候就自動的釋放它所佔的記憶體空間。

static 關鍵字(屬性)

一般情況下類描述的都是類物件的屬性或者方法,必須new 出類的例項才可以呼叫屬性或者呼叫這些方法。

有兩種特殊的情況

1.不建立物件,也希望可以呼叫這些function,使用這些屬性

2.乙個類的多個物件希望能夠共享的屬性,就用static關鍵字來限制 eg:static int x=10;

無論建立多少個類的例項,其中的x都只建立一次,可以使用它來進行各個物件之間的通訊。

static 屬性可以直接使用類名稱直接呼叫(也可以使用物件引用來呼叫),非static物件則不行,必須使用物件的引用來訪問類的屬性。

static function(方法)

main方法必須是static的原因就是:main是應用程式的入口(操作係用呼叫),原因就是沒有建立類的例項的情況下就呼叫了main函式,所以main函式必須是static函式。

不能使用非static物件和static函式

effective java 建立和銷毀物件

b 1.考慮靜態方法替代建構函式 b 靜態工廠方法有3個好處 b a.b 靜態工廠方法具有名字使程式碼易讀,名字不必和類名一樣具有更高靈活性。b b.b 實現singleton模式。b c.b 能返回乙個原返回型別的子類,形成面向介面程式設計的好習慣。壞處 b a.b 不能被繼承。b b.b 不夠物...

物件的建立和銷毀

考慮用靜態工廠方法代替構造器 示例 public static boolean valueof boolean b 當構造引數很多的時候考慮使用建造者 模式 示例 原始 public class nutritionfacts builder pattern public class nutritio...

第2章 建立和銷毀物件

優勢1 有特定的名稱 如果構造器的引數本身沒有確切地描述正被返回的物件,那麼具有適當名稱的靜態工廠方法會更容易使用。biginteer.probableprime int,random 指明返回的biginteger可能為素數,比原始的建構函式表示的更清楚。public class biginteg...