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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张治国 中级黑马   /  2014-4-3 17:49  /  1149 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张治国 于 2014-4-6 09:31 编辑

我就是想问一下,static代码块与static变量,哪个优先级高?请举例说明

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

2 个回复

倒序浏览
先回答你的问题,静态代码块的优先级高于静态变量。见下图举例说明。
第一,静态代码块随着类的加载而执行,只执行一次。
第二,静态变量也是随着类的加载而执行,只执行一次。
第三,成员变量随着对象的初始化而加载。成员变量的初始化在类的所有方法之前初始化,包括构造方法。
第四,构造方法也是随着对象的创建而加载。成员变量先初始化后再调用构造方法。
第五,静态方法,只有调用的时候才会加载。所以最后没有输出。




评分

参与人数 1技术分 +2 收起 理由
朱神必 + 2

查看全部评分

回复 使用道具 举报
楼主不要纠结,只要记住以下两句话就可以搞定静态初始化顺序:
1、加载类字节码后,程序会在方法区开辟空间。并对空间进行默认初始化。(这里初始化的值不是你代码里写的值,而是虚拟机默认的值)
2、static的执行,是按照代码书写顺序,自上而下执行的。
以如下代码为证:
  1. class StaticTest1 {
  2.         //代码块在前(这边看起来是执行在前,定义在后,静态初始化这种情况下是被允许的)
  3.         static {
  4.                 num = 1;
  5.         }
  6.         //静态变量初始化在后
  7.         static int num = 0;
  8. }

  9. class StaticTest2 {
  10.         //静态变量初始化在前
  11.         static int num = 0;
  12.         //代码块在后
  13.         static {
  14.                 num = 1;
  15.         }
  16. }

  17. public class Test {
  18.         public static void main(String[] args) {
  19.                 //这边输出结果为0,说明是“静态变量初始化”最后一次修改了变量值
  20.                 System.out.println(StaticTest1.num);
  21.                 //这边输出结果为1,说明是“静态代码块”最后一次修改了变量值
  22.                 System.out.println(StaticTest2.num);
  23.         }
  24. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
朱神必 + 2

查看全部评分

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