黑马程序员技术交流社区

标题: 一个简单的不能再简单的代码,让我开始怀疑人生!!! [打印本页]

作者: 王震阳老师    时间: 2012-10-9 19:42
提示: 该帖被管理员或版主屏蔽
作者: qhasilver    时间: 2012-10-9 19:51
本帖最后由 qhasilver 于 2012-10-9 19:54 编辑

static大括号里表示的是一个静态代码块

java中类的装载步骤:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块

作者: 王震阳老师    时间: 2012-10-9 19:57
本帖最后由 王震阳 于 2012-10-9 19:58 编辑
qhasilver 发表于 2012-10-9 19:51
static大括号里表示的是一个静态代码块

java中类的装载步骤:
将代码中static去掉,也就是将静态方法改为代码块,下面程序照样进行。
  1. //在大一学习c语言的时候我们就知道,程序的运行顺序是从上往下,如果想使用哪个变量必须先定义后使用
  2. //今天我看书的时候,我发现我错误,甚至开始怀疑人生!!!
  3. class MyWord2
  4. {
  5.            /// 去掉此处的static照样可以执行
  6.                 {
  7.                   b=1;
  8.                   System.out.println("这是静态代码块,为什么 b可以直接赋值,程序不报错呢?");
  9.                 }

  10.     static int b=3;

  11.         public static void main(String[] args)
  12.         {
  13.                 System.out.println(b);
  14.         }
  15. }
复制代码

作者: qhasilver    时间: 2012-10-9 20:08
王震阳 发表于 2012-10-9 19:57
将代码中static去掉,也就是将静态方法改为代码块,下面程序照样进行。

其实我们可以逆向理解,既然程序是可以正常运行的,说明在java的类加载机制中,初始化代码块{}里的内容的加载顺序是低于变量初始化的。
作者: qhasilver    时间: 2012-10-9 20:11
王震阳 发表于 2012-10-9 19:57
将代码中static去掉,也就是将静态方法改为代码块,下面程序照样进行。

毕竟规矩是sun公司定的,底层的jvm想按什么顺序执行就什么顺序执行,然后给咱们一份API,得了,咱们还是得学。
作者: 王震阳老师    时间: 2012-10-9 20:18
qhasilver 发表于 2012-10-9 20:11
毕竟规矩是sun公司定的,底层的jvm想按什么顺序执行就什么顺序执行,然后给咱们一份API,得了,咱们还是 ...

我感觉问题没有那么简单,真正的问题应该出现在第二各方static中,static int b=3;也就是说,该变量是类的Field,因此b变量的创建时随着类的加载而加载的。因此当我们在定义之前使用b变量时,其实b已经随着类的加载而加载了。如果去掉第二个static那么程序就出错了。

作者: 王震阳老师    时间: 2012-10-9 20:19
qhasilver 发表于 2012-10-9 20:08
其实我们可以逆向理解,既然程序是可以正常运行的,说明在java的类加载机制中,初始化代码块{}里的内容的 ...

我的意思是,该代码向我们表明了,类对象的生命周期问题,类对象是属于类的,生命周期和类是一样的。
作者: qhasilver    时间: 2012-10-9 20:32
王震阳 发表于 2012-10-9 20:19
我的意思是,该代码向我们表明了,类对象的生命周期问题,类对象是属于类的,生命周期和类是一样的。 ...

我赞同你的说法
作者: 曾浩    时间: 2012-10-9 20:59
首先这个b是成员变量 最重要的是成员变量的有效范围是整个类 不管他是写在程序的开始 中间 还是末尾
不过你要是把 b的static修饰符去了 就不可以了  虽然有静态代码块  但是你的成员变量也是static的啊
这个你可以写个 小程序做做实验  你懂得




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