亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么我的這個靜態變量不是優先,而且第二次創建對象的時候,static初始化塊還會出現?跟講的不一樣

public class HelloWorld{
?? ?int num1;
?? ?int num2;
?? ?static int num3;
??? public HelloWorld(){
?? ?num1=10;
?? ?System.out.println("通過構造方法為變量num1賦值");
??? }
???? {
?? ?num2=20;
?? ?System.out.println("通過初始化塊為變量num2賦值");
??? }
?? {
?? ?num3=30;
?? ?System.out.println("通過靜態初始化塊為變量num3賦值");
??? }
????? public static void main(String[] args){
?? ?HelloWorld hello=new HelloWorld();
?? ?System.out.println("調用num1:"+hello.num1);
?? ?System.out.println("調用num2:"+hello.num2);
?? ?System.out.println("調用num3:"+num3);
?? ?HelloWorld hello2=new HelloWorld();
??? }
}

正在回答

7 回答

http://img1.sycdn.imooc.com//5e3f69220001dbfd07240844.jpghttp://img1.sycdn.imooc.com//5e3f68e60001742b09530590.jpg加個static即可

0 回復 有任何疑惑可以回復我~

static {
?? ?num3=30;
?? ?System.out.println("通過靜態初始化塊為變量num3賦值");
??? }


這里加上static

0 回復 有任何疑惑可以回復我~

我從內存管理給你解釋一下為什么吧,static稱為靜態變量,它在內存管理中單獨放在一塊內存中,程序開始的時候需要經歷先編譯在執行,如果聲明的該變量是static,那么就會在編譯的時候就直接把該變量放到了內存區里面()注意這是在程序還沒有開始執行的時候),如果你后面初始化模塊前不加static的話,會導致程序是順序執行的,只有到執行的時候才會賦值(而不是編譯的時候),所以這里兩個都需要加static

0 回復 有任何疑惑可以回復我~

同意樓上看法,在13行加static

0 回復 有任何疑惑可以回復我~

你改成

static

{
?? ?num3=30;
?? ?System.out.println("通過靜態初始化塊為變量num3賦值");
??? }

下面的“通過靜態初始化塊為num3賦值”不就沒了嗎?


0 回復 有任何疑惑可以回復我~

因為你的num3不是在靜態初始化塊中賦值的。。

你少加了個static

0 回復 有任何疑惑可以回復我~
#1

努力0拼命 提問者

我試過了,加了static也是一樣
2020-01-10 回復 有任何疑惑可以回復我~
#2

努力0拼命 提問者

而且num3我在上面就已經用static修飾了,下面的構造模塊里面,不寫是不影響的
2020-01-10 回復 有任何疑惑可以回復我~
#3

慕前端1461208 回復 努力0拼命 提問者

上面的static是定義靜態num3,下面的static是定義靜態的初始化模塊,是不一樣的,都不能少
2020-02-21 回復 有任何疑惑可以回復我~
#4

幻世HS 回復 努力0拼命 提問者

你真的測試過嗎?不要空想 自己用代碼去驗證
2020-02-27 回復 有任何疑惑可以回復我~
查看1條回復

對問題補充下http://img1.sycdn.imooc.com//5e12e35c0001eb3103640189.jpg

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

為什么我的這個靜態變量不是優先,而且第二次創建對象的時候,static初始化塊還會出現?跟講的不一樣

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號