大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java教程
Java標(biāo)識(shí)符與關(guān)鍵字
Java變量
Java數(shù)據(jù)類型
Java運(yùn)算符
Java控制語句
Java方法

Java中static靜態(tài)變量

java中的變量包括:局部變量和成員變量,在方法體中聲明的變量為局部變量,有效范圍很小,只能在方法體中訪問,方法結(jié)束之后局部變量內(nèi)存就釋放了,在內(nèi)存方面局部變量存儲(chǔ)在棧當(dāng)中。在類體中定義的變量為成員變量,而成員變量又包括實(shí)例變量和靜態(tài)變量,當(dāng)成員變量聲明時(shí)使用了static關(guān)鍵字,那么這種變量稱為靜態(tài)變量,沒有使用static關(guān)鍵字稱為實(shí)例變量,實(shí)例變量是對(duì)象級(jí)別的,每個(gè)對(duì)象的實(shí)例變量值可能不同,所以實(shí)例變量必須先創(chuàng)建對(duì)象,通過“引用”去訪問,而靜態(tài)變量訪問時(shí)不需要?jiǎng)?chuàng)建對(duì)象,直接通過“類名”訪問。實(shí)例變量存儲(chǔ)在堆內(nèi)存當(dāng)中,靜態(tài)變量存儲(chǔ)在方法區(qū)當(dāng)中。實(shí)例變量在構(gòu)造方法執(zhí)行過程中初始化,靜態(tài)變量在類加載時(shí)初始化。那么變量在什么情況下會(huì)聲明為靜態(tài)變量呢?請(qǐng)看以下代碼,定義一個(gè)“男人”類:

public class Man {
	//身份證號(hào)
	int idCard;
	//性別(所有男人的性別都是“男”)
	//true表示男,false表示女
	boolean sex = true;
	public Man(int idCard){
		this.idCard = idCard;
	}
}
public class ManTest {
	public static void main(String[] args) {
		Man jack = new Man(100);
		System.out.println(jack.idCard + "," + (jack.sex ? "男" : "女"));
		Man sun = new Man(101);
		System.out.println(sun.idCard + "," + (sun.sex ? "男" : "女"));
		Man cok = new Man(102);
		System.out.println(cok.idCard + "," + (cok.sex ? "男" : "女"));
	}
}

運(yùn)行結(jié)果如下圖所示:

Java技術(shù)架構(gòu)

圖11-16:運(yùn)行結(jié)果

我們來看一下以上程序的內(nèi)存結(jié)構(gòu)圖:

Java技術(shù)架構(gòu)

圖11-17:內(nèi)存結(jié)構(gòu)圖

“男人類”創(chuàng)建的所有“男人對(duì)象”,每一個(gè)“男人對(duì)象”的身份證號(hào)都不一樣,該屬性應(yīng)該每個(gè)對(duì)象持有一份,所以應(yīng)該定義為實(shí)例變量,而每一個(gè)“男人對(duì)象”的性別都是“男”,不會(huì)隨著對(duì)象的改變而變化,性別值永遠(yuǎn)都是“男”,這種情況下,性別這個(gè)變量還需要定義為實(shí)例變量嗎,有必要讓每一個(gè)“男人對(duì)象”持有一份嗎,這樣豈不是浪費(fèi)了大量的堆內(nèi)存空間,所以這個(gè)時(shí)候建議將“性別=男”屬性定義為類級(jí)別的屬性,聲明為靜態(tài)變量,上升為“整個(gè)族”的數(shù)據(jù),這樣的變量不需要?jiǎng)?chuàng)建對(duì)象直接使用“類名”即可訪問。請(qǐng)看代碼:

public class Man {
	//身份證號(hào)
	int idCard;
	//性別(所有男人的性別都是“男”)
	//true表示男,false表示女
	static boolean sex = true;
	public Man(int idCard){
		this.idCard = idCard;
	}
}
public class ManTest {
	public static void main(String[] args) {
		Man jack = new Man(100);
		System.out.println(jack.idCard + "," + (Man.sex ? "男" : "女"));
		Man sun = new Man(101);
		System.out.println(sun.idCard + "," + (Man.sex ? "男" : "女"));
		Man cok = new Man(102);
		System.out.println(cok.idCard + "," + (Man.sex ? "男" : "女"));
	}
}

運(yùn)行結(jié)果如下圖所示:

Java技術(shù)架構(gòu)

圖11-18:運(yùn)行結(jié)果

我們來看一下以上程序的內(nèi)存結(jié)構(gòu)圖:

靜態(tài)變量內(nèi)存圖

圖11-19:靜態(tài)變量內(nèi)存圖

通過以上內(nèi)容的學(xué)習(xí)我們得知,當(dāng)一個(gè)類的所有對(duì)象的某個(gè)“屬性值”不會(huì)隨著對(duì)象的改變而變化的時(shí)候,建議將該屬性定義為靜態(tài)屬性(或者說把這個(gè)變量定義為靜態(tài)變量),靜態(tài)變量在類加載的時(shí)候初始化,存儲(chǔ)在方法區(qū)當(dāng)中,不需要?jiǎng)?chuàng)建對(duì)象,直接通過“類名”來訪問。如果靜態(tài)變量使用“引用”來訪問,可以嗎,如果可以的話,這個(gè)訪問和具體的對(duì)象有關(guān)系嗎?來看以下代碼:

public class ManTest {
	public static void main(String[] args) {
		//靜態(tài)變量比較正式的訪問方式
		System.out.println("性別 = " + Man.sex);
		//創(chuàng)建對(duì)象
		Man jack = new Man(100);
		//使用“引用”來訪問靜態(tài)變量可以嗎?
		System.out.println("性別 = " + jack.sex);
		//對(duì)象被垃圾回收器回收了
		jack = null;
		//使用“引用”還可以訪問嗎?
		System.out.println("性別 = " + jack.sex);
	}
}

運(yùn)行結(jié)果如下圖所示:

靜態(tài)變量內(nèi)存圖

圖11-20:靜態(tài)變量使用“引用”訪問

通過以上代碼以及運(yùn)行結(jié)果可以看出,靜態(tài)變量也可以使用“引用”去訪問,但實(shí)際上在執(zhí)行過程中,“引用”所指向的對(duì)象并沒有參與,如果是空引用訪問實(shí)例變量,程序一定會(huì)發(fā)生空指針異常,但是以上的程序編譯通過了,并且運(yùn)行的時(shí)候也沒有出現(xiàn)任何異常,這說明雖然表面看起來是采用“引用”去訪問,但實(shí)際上在運(yùn)行的時(shí)候還是直接通過“類”去訪問的。靜態(tài)方法是這樣嗎?請(qǐng)看以下代碼:

public class Man {
	//身份證號(hào)
	int idCard;
	//性別(所有男人的性別都是“男”)
	//true表示男,false表示女
	static boolean sex = true;
	public Man(int idCard){
		this.idCard = idCard;
	}
	//靜態(tài)方法
	public static void printInfo(){
		System.out.println("-----" + (Man.sex ? "男" : "女") + "------");
	}
}
public class ManTest {
	public static void main(String[] args) {
		//靜態(tài)變量比較正式的訪問方式
		System.out.println("性別 = " + Man.sex);
		//創(chuàng)建對(duì)象
		Man jack = new Man(100);
		//使用“引用”來訪問靜態(tài)變量可以嗎?
		System.out.println("性別 = " + jack.sex);
		//對(duì)象被垃圾回收器回收了
		jack = null;
		//使用“引用”還可以訪問嗎?
		System.out.println("性別 = " + jack.sex);
		//靜態(tài)方法比較正式的訪問方式
		Man.printInfo();
		//訪問靜態(tài)方法可以使用引用嗎?并且空的引用可以嗎?
		jack.printInfo();
	}
}

運(yùn)行結(jié)果如下圖所示:

Java中static靜態(tài)變量

圖11-21:靜態(tài)方法可以使用引用訪問嗎

通過以上代碼測(cè)試得知,靜態(tài)變量和靜態(tài)方法比較正式的方式是直接采用“類名”訪問,但實(shí)際上使用“引用”也可以訪問,并且空引用訪問靜態(tài)變量和靜態(tài)方法并不會(huì)出現(xiàn)空指針異常。實(shí)際上,在開發(fā)中并不建議使用“引用”去訪問靜態(tài)相關(guān)的成員,因?yàn)檫@樣會(huì)讓程序員困惑,因?yàn)椴捎?ldquo;引用”方式訪問的時(shí)候,程序員會(huì)認(rèn)為你訪問的是實(shí)例相關(guān)的成員。

總之,所有實(shí)例相關(guān)的,包括實(shí)例變量和實(shí)例方法,必須先創(chuàng)建對(duì)象,然后通過“引用”的方式去訪問,如果空引用訪問實(shí)例相關(guān)的成員,必然會(huì)出現(xiàn)空指針異常。所有靜態(tài)相關(guān)的,包括靜態(tài)變量和靜態(tài)方法,直接使用“類名”去訪問。雖然靜態(tài)相關(guān)的成員也能使用“引用”去訪問,但這種方式并不被主張。

主站蜘蛛池模板: 亚洲欧美日韩中文综合在线不卡 | 国内精品久久久久影院免费 | 日本a∨在线播放高清 | 青青青手机版视频在线观看 | 六月丁香婷婷激情国产 | 狠狠久久久久综合网 | 免费鲁丝片一级观看 | 国产成人亚洲精品久久 | 动漫精品欧美一区二区三区 | 国产a自拍 | 99热综合在线 | 精品理论片一区二区三区 | 中文字幕一区二区三区精彩视频 | 一本伊大人香蕉久久网手机 | 青青青青久久国产片免费精品 | 国产女人成人精品视频 | 日本无吗中文字幕免费婷婷 | 亚洲欧美日韩高清一区二区一 | 在线日韩欧美 | 9966久久精品免费看国产 | 黄色在线免费 | 男人的网站在线观看 | 亚洲综合成人网在线观看 | 综合伊人久久 | 99久久精品免费观看国产 | 欧美伊人久久大香线蕉综合69 | 成人精品第一区二区三区 | 亚洲热热久久九九精品 | 看看免费a一片欧 | 在线播放成人毛片免费视 | 国内精品福利视频 | 久久香蕉影院 | 国产一国产一级毛片视频 | 99热久久这里只有精品6国产网 | 一级特黄aaa大片 | 在线观看久草视频 | 五月婷婷色网 | 成人伊人青草久久综合网 | 亚洲精品69 | 国产l精品国产亚洲区久久 国产l精品国产亚洲区在线观看 | 色播性播爱播放影院 |