国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java學(xué)習(xí)之神奇的初始化
Java學(xué)習(xí)之神奇的初始化
作者: yjwgeg
Friday, March 5 2004 9:50 AM
java在初始化的時(shí)候也有很多講究,因?yàn)閖ava中出現(xiàn)了類,所以在初始化的時(shí)候就有可能使用到創(chuàng)建新對(duì)象,所以,對(duì)于初始化的順序要求的比較嚴(yán)格,請(qǐng)看下面一個(gè)程序,是thinking in java中的一個(gè)程序,被我稍加改編,這樣可以更好的說明幾個(gè)初始化的要點(diǎn):
class Cup {
Cup(int marker)
{
System.out.println("Cup(" + marker + ")");
}
void f(int marker)
{
System.out.println("f(" + marker + ")");
}
}
class Cups {
static Cup c1=new Cup(1);
Cup c3=new Cup(3);
static Cup c2= new Cup(2);
Cups()
{
System.out.println("Cups()");
}
Cup c4=new Cup(4);
}
public class ExplicitStatic {
Cups c=new Cups();
{
System.out.println("Hello");
}
public static void main(String[] args)  {
System.out.println("Inside main()");
Cups.c1.f(99);
ExplicitStatic x=new ExplicitStatic();
}
static Cups x = new Cups();
}
大家可以手動(dòng)執(zhí)行一下這個(gè)程序,考慮一下結(jié)果是什么,然后參照下面的答案對(duì)照一下,看看是否正確:
Cup(1)
Cup(2)
Cup(3)
Cup(4)
Cups()
Inside main()
f(99)
Cup(3)
Cup(4)
Cups()
Hello
我總結(jié)了四個(gè)初始化的要點(diǎn),如下:
1、如果有static,即靜態(tài)成員定義,首先初始化static的變量,如,在類Cups中c3在c2前面,可是在輸出的結(jié)果中,你可以發(fā)現(xiàn),c2是在c3前執(zhí)行的,這就是因?yàn)?,所有的static都在第一時(shí)間被初始化。
2、Static只初始化一次,在第二次創(chuàng)建類的對(duì)象的時(shí)候,就不會(huì)去執(zhí)行static的語句,如,在第二次執(zhí)行new Cups()的時(shí)候,就只輸出了Cup(3)和Cup(4),顯然,static的兩個(gè)創(chuàng)建對(duì)象的語句沒有做。
3、變量的初始化在方法前。如,在Cups類中,方法Cups()在語句Cup c4=new Cup(4)之前,可是輸出結(jié)果的時(shí)候,打印的Cups()卻在Cup(4)之后。
4、 在含有main的類中執(zhí)行順序是先做static,然后就是main,而不是像其它類一樣,除了static就按順序做下來。如,在main函數(shù)中,如果去掉語句ExplicitStatic x=new ExplicitStatic(),則Cups c=new Cups()和System.out.println("hello")都不會(huì)執(zhí)行。另外,留個(gè)小問題,如果去掉了System.out.println("hello")外的括號(hào)會(huì)怎么樣呢?
原來java的初始化這么復(fù)雜,結(jié)合在其他地方查到的資料,總結(jié)如下:
(1)java的初始化分為類的初始化(clinit)和實(shí)例初始化(init),類的初始化先于實(shí)例初始化
(2)java類初始化的原則:
如果當(dāng)前類繼承了其他父類,則先執(zhí)行父類的類初始化;父類初始化完畢,才開始子類的初始化 類初始化時(shí),clinit將static 變量和static的代碼塊收集到初始化容器中進(jìn)行初始化,該動(dòng)作是在類初始化的時(shí)候進(jìn)行,因此只會(huì)進(jìn)行一次 同級(jí)static 成員初始化的順序按照前后順序進(jìn)行
(3)實(shí)例初始化的原則:
實(shí)例初始化的原則:實(shí)例變量和普通代碼在構(gòu)造函數(shù)之前初始化 實(shí)例變量和普通代碼塊在調(diào)用構(gòu)造函數(shù)之前完成初始化,即構(gòu)造函數(shù)是完成實(shí)例初始化的最后一步(除非實(shí)例變量的初始化過程中,調(diào)用了構(gòu)造函數(shù)) 綜合的執(zhí)行順序:父類的實(shí)例變量--父類的構(gòu)造函數(shù)--當(dāng)前類的實(shí)例變量--當(dāng)前類的構(gòu)造函數(shù)
注: 代碼塊是指用{ }包含的代碼,比如{System.out.println("ssss")},可以是靜態(tài)的也可以不是,實(shí)際用的不是很多
為了說明上面的原則,再添加兩個(gè)范例,都是從網(wǎng)絡(luò)上找的,感謝這么多好心的人共享出的他們的研究成果
下面這個(gè)例子演示了由于初始化不當(dāng),導(dǎo)致的問題
package test;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class CacheEnumResolver {
// 單態(tài)實(shí)例 一切問題皆由此行引起
private static CacheEnumResolver SINGLE_ENUM_RESOLVER = new CacheEnumResolver();
/**
* MSGCODE->Category內(nèi)存索引
*/
private static Map<String,String> CODE_MAP_CACHE;
static {
CODE_MAP_CACHE = new HashMap<String,String>();
// 為了說明問題,我在這里初始化一條數(shù)據(jù)
CODE_MAP_CACHE.put("0", "北京市");
}
// private, for single instance
private CacheEnumResolver() {
// 初始化加載數(shù)據(jù) 引起問題,該方法也要負(fù)點(diǎn)責(zé)任
initEnums();
}
/** * 初始化所有的枚舉類型 */
public static void initEnums() {
// ~~~~~~~~~問題從這里開始暴露 ~~~~~~~~~~~//
if (null == CODE_MAP_CACHE) {
System.out.println("CODE_MAP_CACHE為空,問題在這里開始暴露.");
CODE_MAP_CACHE = new HashMap<String,String>();
}
int i=1;
CODE_MAP_CACHE.put("1", "北京市");
CODE_MAP_CACHE.put("2", "云南省");
// ..... other code...
}
public Map getCache() {
return Collections.unmodifiableMap(CODE_MAP_CACHE);
}
/**
* * 獲取單態(tài)實(shí)例 * *
*
* @return
*/
public static CacheEnumResolver getInstance() {
return SINGLE_ENUM_RESOLVER;
}
public static void main(String[] args) {
System.out.println(CacheEnumResolver.getInstance().getCache());
}
}
這是另外一個(gè),展示除了繼承情況下,初始化的情況:
package test;
public class Test1 {
{
System.out.print("7 ");
}
private Cup cup = new Cup(2);
Test1() {
System.out.print("5 ");
}
static {
System.out.print("6 ");
}
}
package test;
public class Test2 extends Test1 {
static {
System.out.print("3 ");
}
static Test2 ts2 = new Test2();
private Cup cup = new Cup(1);
{
System.out.print("1 ");
}
Test2() {
super();
System.out.print("2 ");
}
{
System.out.print("4 ");
}
public static void main(String[] args) {
new Test2();
}
}
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
51Testing軟件測試網(wǎng):java經(jīng)典問題:傳值還是傳引用
java中靜態(tài)語句塊、實(shí)例代碼塊、構(gòu)造器方法這3者的調(diào)用順序
Java關(guān)鍵字static、final使用小結(jié)
Java基礎(chǔ)
不了解Java反射機(jī)制?看這篇就明白了!
最全的Java筆試題庫之選擇題篇-總共234道【1~60】
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服