为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的这个静态变量不是优先,而且第二次创建对象的时候,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下载
官方微信