1.使用建構函式1.方法中的區域性變數-----必須初始化才可以進行使用2.使用返回物件的靜態函式
2.類的屬性變數---------可以不進行初始化
物件的reference初始化為null
基本型別變數會自動的初始化
3.變數的初始化順序
3.1首先初始化類的屬性-----呼叫他們的建構函式
3.2呼叫自己的建構函式
例子:
class housevoid 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
publicvoid 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...