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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

提示: 该帖被管理员或版主屏蔽
签名被屏蔽

8 个回复

倒序浏览
本帖最后由 qhasilver 于 2012-10-9 19:54 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 建议修改真实姓名

查看全部评分

回复 使用道具 举报
本帖最后由 王震阳 于 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. }
复制代码
回复 使用道具 举报
王震阳 发表于 2012-10-9 19:57
将代码中static去掉,也就是将静态方法改为代码块,下面程序照样进行。

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

毕竟规矩是sun公司定的,底层的jvm想按什么顺序执行就什么顺序执行,然后给咱们一份API,得了,咱们还是得学。
回复 使用道具 举报
qhasilver 发表于 2012-10-9 20:11
毕竟规矩是sun公司定的,底层的jvm想按什么顺序执行就什么顺序执行,然后给咱们一份API,得了,咱们还是 ...

我感觉问题没有那么简单,真正的问题应该出现在第二各方static中,static int b=3;也就是说,该变量是类的Field,因此b变量的创建时随着类的加载而加载的。因此当我们在定义之前使用b变量时,其实b已经随着类的加载而加载了。如果去掉第二个static那么程序就出错了。
回复 使用道具 举报
qhasilver 发表于 2012-10-9 20:08
其实我们可以逆向理解,既然程序是可以正常运行的,说明在java的类加载机制中,初始化代码块{}里的内容的 ...

我的意思是,该代码向我们表明了,类对象的生命周期问题,类对象是属于类的,生命周期和类是一样的。
回复 使用道具 举报
王震阳 发表于 2012-10-9 20:19
我的意思是,该代码向我们表明了,类对象的生命周期问题,类对象是属于类的,生命周期和类是一样的。 ...

我赞同你的说法
回复 使用道具 举报
曾浩 中级黑马 2012-10-9 20:59:33
9#
首先这个b是成员变量 最重要的是成员变量的有效范围是整个类 不管他是写在程序的开始 中间 还是末尾
不过你要是把 b的static修饰符去了 就不可以了  虽然有静态代码块  但是你的成员变量也是static的啊
这个你可以写个 小程序做做实验  你懂得
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马