相信大家在看到標題之後,是疑惑的點進來看內容的。
在看到標題之後,大家肯定會懷疑,我趙某人用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,誰在最後,誰說了算!
最後溫馨提示一下大家,正常情況下,我們還是先聲明在賦值比較靠譜點,免得本來想裝個大神來着,結果出現了語料未及的結果,造成沒必要的麻煩可就不值得了。