A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 呆呆呆 中级黑马   /  2013-12-23 12:42  /  1128 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 呆呆呆 于 2013-12-23 14:19 编辑
  1. class StaticStuff
  2. {
  3. static int x=10;
  4. static {x+=5;}

  5. public static void main(String[] args)
  6. {
  7. System.out.println("x="+x);
  8. }

  9. static {x/=3;}
  10. }
复制代码

这段代码运行的结果是什么?静态代码块的执行顺序是怎样的?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
                static int x=10;//1,先加载 10

                static {x+=5;}//2,静态区,运算15

        public static void main(String[] args) throws InterruptedException {

                System.out.println("x="+x);   //4,静态去获取结果

        }

        static {x/=3;}  //3, 运算结果 5

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
首先是 static int x=10;加载进内存,方法区里面
然后static {x+=5;}静态代码块执行x=15;
接着静态代码块static {x/=3;}执行,x=5
最后主函数加载进内存,打印出运算结果。x=5

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
首先 静态代码块是优先执行的,在调用静态变量前。因为静态变量一旦被修改就彻底被修改了,在任何情况下,也不可能调出修改前的值了。
综上,3个静态代码块对静态变量x进行了,赋值、加和除的操作后输出,最终输出结果:5.

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
静态块先执行,类加载的时候就执行,一个类要想运行,首先被Java虚拟机将class文件内部字节码指令读取至内存并且包装成一个Class类型的对象,这个过程称为类加载,Class类的一个对象是对某一个类的一个描述!
   
不是说运行到Chinese.sing();时输出了static code,Chinese.sing();是什么?是方法调用,Chinese是类,sing是该类的静态方法,你要想调用sing方法,首先第一步就是类加载,类都没加载,Java虚拟机都不认识他,运行个屁呀!
   
所以第一步是类加载,注意!static块,也就是静态块,在类加载的时候就执行了,而且只执行一次,因为不可能进行第二次类加载,从这个意义上说,静态的成员是第一时间执行的,然后才轮到别人!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马