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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

HM程序员

中级黑马

  • 黑马币:52

  • 帖子:26

  • 精华:0

© HM程序员 中级黑马   /  2014-11-26 22:12  /  1887 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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;为什么第五行代码,会报错,说没有定义。
求大神啊


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

11 个回复

正序浏览
学习了。。。。
回复 使用道具 举报
kerner 发表于 2014-11-27 09:27
第一问:
静态代码块是在类加载完后执行的,int默认初始化为0,然后是执行静态代码中的 System.out.println ...

非常感谢
回复 使用道具 举报
我表示只看懂了第一个。。。
回复 使用道具 举报
kerner 中级黑马 2014-11-27 09:29:02
9#
本帖最后由 kerner 于 2014-11-27 09:30 编辑

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


回复 使用道具 举报
kerner 中级黑马 2014-11-27 09:27:33
8#
本帖最后由 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:

  • The usage occurs in an instance (respectively static) variable initializer of C or in an instance (respectively static) initializer of C.
  • The usage is not on the left hand side of an assignment.
  • The usage is via a simple name.
  • C is the innermost class or interface enclosing the usage.


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就不会报错。






评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2

查看全部评分

回复 使用道具 举报 1 0
这很容易让人混淆啊~
回复 使用道具 举报
学习了,静态这地方确实让人很混淆
回复 使用道具 举报
第一幅图定义的是一个默认初始化的值;
第二幅图是因为静态代码块会优先执行,所以会输出10;
第三幅图是因为静态不能给常量赋值,除非你加上final.
回复 使用道具 举报
问题研究得这么深入?我也来学习一下...
回复 使用道具 举报
留名  看看楼下怎么说
回复 使用道具 举报
:D貌似很高深的样子
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马