黑马程序员技术交流社区

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

作者: HM程序员    时间: 2014-11-26 22:12
标题: 关于静态代码块的问题
  1. public class StaticDemo {
  2.         static
  3.         {
  4.                 System.out.println(StaticDemo.i);
  5.         }
  6.         static int i = 9;

  7.         public static void main(String[] args) {
  8.                 System.out.println(i);
  9.         }
  10. }
复制代码
为什么第四行的代码输出是0?
  1. public class StaticDemo {
  2.         static
  3.         {
  4.                 i=10;
  5.                 System.out.println(StaticDemo.i);
  6.         }
  7.         static int i = 9;

  8.         public static void main(String[] args) {
  9.                 System.out.println(i);
  10.         }
  11. }
复制代码
第四行代码,为什么不用定义,就可以直接赋值,第五行代码可以输出10.
  1. public class StaticDemo {
  2.         static
  3.         {
  4.                 i=10;
  5.                 System.out.println(i);
  6.         }
  7.         static int i = 9;

  8.         public static void main(String[] args) {
  9.                 System.out.println(i);
  10.         }
  11. }
复制代码
第四行代码可以赋值为10;为什么第五行代码,会报错,说没有定义。
求大神啊



作者: EARL    时间: 2014-11-26 22:18
:D貌似很高深的样子
作者: 刘隽哲    时间: 2014-11-26 22:53
留名  看看楼下怎么说
作者: 彭旭文    时间: 2014-11-27 00:00
问题研究得这么深入?我也来学习一下...
作者: 随风sky    时间: 2014-11-27 00:04
第一幅图定义的是一个默认初始化的值;
第二幅图是因为静态代码块会优先执行,所以会输出10;
第三幅图是因为静态不能给常量赋值,除非你加上final.
作者: 娱尘    时间: 2014-11-27 00:12
学习了,静态这地方确实让人很混淆
作者: as604049322    时间: 2014-11-27 09:17
这很容易让人混淆啊~
作者: kerner    时间: 2014-11-27 09:27
本帖最后由 kerner 于 2014-11-27 09:37 编辑

第一问:
静态代码块是在类加载完后执行的,int默认初始化为0,然后是执行静态代码中的 System.out.println(StaticDemo.i);所以会输出0;
第二问:
静态代码块是在类加载完后执行的,int默认初始化为0,然后是执行静态代码中的 数值初始化为10,System.out.println(StaticDemo.i);所以会输出10;
第三问:
所有的变量在使用前都应该是先声明。不能向前引用,但是为什么第一个,第二个可以,第三个不可以呢?这个答案会帮助你。

The declaration of a member needs to appear textually before it is used only if the member is an instance (respectively static) field of a class or interface C and all of the following conditions hold:


It is a compile-time error if any of the four requirements above are not met.


第三个,
i=10, i在赋值符号的左边,所以编译器不会报错。但是System.out.println(i),不满足上面四条,所以会报错,写成StaticDemo.i就不会报错。







作者: kerner    时间: 2014-11-27 09:29
本帖最后由 kerner 于 2014-11-27 09:30 编辑

为啥链接不能显示出来。地址
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.2.3



作者: 江南小道士    时间: 2014-11-28 16:42
我表示只看懂了第一个。。。
作者: HM程序员    时间: 2014-11-28 22:53
kerner 发表于 2014-11-27 09:27
第一问:
静态代码块是在类加载完后执行的,int默认初始化为0,然后是执行静态代码中的 System.out.println ...

非常感谢
作者: xingkong123    时间: 2014-11-28 22:59
学习了。。。。




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