這是什麼操作?java中的變量竟然可以先使用後聲明?

相信大家在看到標題之後,是疑惑的點進來看內容的。

在看到標題之後,大家肯定會懷疑,我趙某人用java寫了好幾年的代碼了,還真就沒見過java中的變量能先用在聲明,今天就是進來看看你在沒有聲明變量的前提下是怎麼用的!怎麼用的!!!

各位,先別激動,能不能你先自己看,我們先來寫個例子:

/**
 * 
*    
* 項目名稱:BianChengXiGuan   
* 類名稱:TestMain   
* 類描述:   靜態變量
* 創建人:Mu Xiongxiong  
* 創建時間:2020-6-17 下午10:53:54   
* 修改人:Mu Xiongxiong   
* 修改時間:2020-6-17 下午10:53:54   
* 修改備註:   
* 個人博客:https://blog.csdn.net/qq_34137397
* 微信公衆號:雄雄的小課堂
* @version    
*
 */
public class TestMain {
	
	public static int num = 10;
	static{
		num = 100;
	}
	
	public static void main(String[] args) {
		System.out.println(num);
	}

}

這個例子很簡單,輸出結果我不說大家也都知道,是100,正確。那麼我們稍微改一下上面的代碼:

/**
 * 
*    
* 項目名稱:BianChengXiGuan   
* 類名稱:TestMain   
* 類描述:   靜態變量
* 創建人:Mu Xiongxiong  
* 創建時間:2020-6-17 下午10:53:54   
* 修改人:Mu Xiongxiong   
* 修改時間:2020-6-17 下午10:53:54   
* 修改備註:   
* 個人博客:https://blog.csdn.net/qq_34137397
* 微信公衆號:雄雄的小課堂
* @version    
*
 */
public class TestMain {
	
	static{
		num = 100;
	}
	public static int num = 10;
	
	public static void main(String[] args) {
		System.out.println(num);
	}

}

注意了,我將聲明num的和賦值num的代碼替換了位置,你肯定會問:兄弟,你這代碼能編譯通過嗎?即便你能編譯通過,那輸出來是多少???(這裏可以看到num是先賦值後聲明的)

這段代碼可以編譯通過,並且輸出的num結果是10,是不是有點出乎意料了,不着急,要想把這裏說通,我們還得回到靜態變量的誕生說起,總所周知,靜態變量是在我們第一次使用類(加載類)的時候別分配到數據區的,它在內存中之後一次拷貝,不會被分配多次,其後不管給它賦值多少遍,都是值在改變,而地址不變。

當類被加載時,首先會找到類中的所有靜態聲明,然後給它們分配空間,這個時候僅僅只是分配空間,並未賦值,此後,JVM就會根據靜態賦值或者靜態塊的先後順序去執行,到這裏相信大家差不多就明白了。

回到我們的代碼中,TestMain類被加載時,JVM首先在內存中開闢出了一塊空間,並且將該地址傳遞給num,也就是執行的是public static int num,其次按照先後順序,就該執行num = 100;了,接着往下執行,碰到了num = 10;顯而易見,最後輸出的結果就是num爲10,誰在最後,誰說了算!

最後溫馨提示一下大家,正常情況下,我們還是先聲明在賦值比較靠譜點,免得本來想裝個大神來着,結果出現了語料未及的結果,造成沒必要的麻煩可就不值得了。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章