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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔡少凯 中级黑马   /  2013-1-7 20:07  /  1451 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class A{
  static int i=5;
  static { System.out.println("staticc code i="+i++);}
}
public class test{
  public static void main(String args[]){
  System.out.println("main code: i="+ A.i);
}
}
这里为什么会打印
staticc code i=5
main code: i=6
静态代码块不是在类一加载进内存的时候就执行了吗?为什么不是打印
staticc code i=6
main code: i=5
对于静态代码块 静态方法 静态成员变量在内存中的加载感到疑惑
谁能详细解释下 谢谢

评分

参与人数 1技术分 +1 收起 理由
邓艳秋 + 1

查看全部评分

4 个回复

倒序浏览
1、静态代码块是在类加载时被初始化。当用类名方问其中的静态成员变量时,类首先被加载,所以在静态代码块输出语句中输出i 的值等于5后,i自加就等于6,当完成了类的加载后,开始取i 的值时,i 就等于6了,所以再次输出i 的值等于6。
2、静态方法存储在虚拟机内存的方法区中。当用类名调用静态方法时,类首先被加载并把方法存在方法区中,通过类名就可以直接找到方法,然后虚拟机将方法压栈后,执行静态方法。执行完毕后,方法便弹栈,结束方法调用。
3、静态成员变量是在类被加载时,就被初始化,这和静态代码块的初始化级别是一样的,先定义就先初始化。所以上面代码中i 的值才是5。
回复 使用道具 举报
首先i++是先赋值再计算,程序运行时先运行构造代码块里的内容,先输出staticc code i=5,然后相当于给 i 赋值了 i 就变成了 6 当你再次调用时 输出的就是main code: i=6   
记住 i++是先赋值再计算   ++i是先自加在赋值
回复 使用道具 举报
静态代码块 >静态属性初始化>静态属性赋值>构造代码块>实例属性初始化>实例属性赋值>构造函数
这些是类中的加载中完成的顺序
是先 执行这个static { System.out.println("staticc code i="+i++);}
但是,注意 你这个是i++;  它是先赋值,后加1. 所以输出5,之后5++=6;这时i=6.
在执行System.out.println("main code: i="+ A.i);  输出6
你把i++改成++i, i先自加再赋值  结果你就会明白了
  1. class A{
  2.   static int i=5;
  3.   static { System.out.println("staticc code i="+(++i));}
  4. }
  5. public class Test{
  6.   public static void main(String args[]){
  7.   System.out.println("main code: i="+ A.i);
  8.         }
  9. }
复制代码
回复 使用道具 举报
当你执行此句时:System.out.println("main code: i="+ A.i);
就会初始化A这个类,但是里面有一个static方法,它优先于类的构造方法加载,
所以会打印出:static code i=5;
因为i是static,所以它存在于数据区且只有一份,被这个类的所有对象共享。
所以会打印出:main code: i=6;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马