黑马程序员技术交流社区

标题: 关于静态的问题 [打印本页]

作者: 蔡少凯    时间: 2013-1-7 20:07
标题: 关于静态的问题
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
对于静态代码块 静态方法 静态成员变量在内存中的加载感到疑惑
谁能详细解释下 谢谢
作者: 熊永标    时间: 2013-1-7 20:33
1、静态代码块是在类加载时被初始化。当用类名方问其中的静态成员变量时,类首先被加载,所以在静态代码块输出语句中输出i 的值等于5后,i自加就等于6,当完成了类的加载后,开始取i 的值时,i 就等于6了,所以再次输出i 的值等于6。
2、静态方法存储在虚拟机内存的方法区中。当用类名调用静态方法时,类首先被加载并把方法存在方法区中,通过类名就可以直接找到方法,然后虚拟机将方法压栈后,执行静态方法。执行完毕后,方法便弹栈,结束方法调用。
3、静态成员变量是在类被加载时,就被初始化,这和静态代码块的初始化级别是一样的,先定义就先初始化。所以上面代码中i 的值才是5。
作者: 李奇    时间: 2013-1-7 20:45
首先i++是先赋值再计算,程序运行时先运行构造代码块里的内容,先输出staticc code i=5,然后相当于给 i 赋值了 i 就变成了 6 当你再次调用时 输出的就是main code: i=6   
记住 i++是先赋值再计算   ++i是先自加在赋值
作者: 夏振博    时间: 2013-1-7 20:51
静态代码块 >静态属性初始化>静态属性赋值>构造代码块>实例属性初始化>实例属性赋值>构造函数
这些是类中的加载中完成的顺序
是先 执行这个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. }
复制代码

作者: 罗利华    时间: 2013-1-7 21:59
当你执行此句时:System.out.println("main code: i="+ A.i);
就会初始化A这个类,但是里面有一个static方法,它优先于类的构造方法加载,
所以会打印出:static code i=5;
因为i是static,所以它存在于数据区且只有一份,被这个类的所有对象共享。
所以会打印出:main code: i=6;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2