黑马程序员技术交流社区
标题: 关于静态代码块的问题 [打印本页]
作者: HM程序员 时间: 2014-11-26 22:12
标题: 关于静态代码块的问题
- public class StaticDemo {
- static
- {
- System.out.println(StaticDemo.i);
- }
- static int i = 9;
- public static void main(String[] args) {
- System.out.println(i);
- }
- }
复制代码 为什么第四行的代码输出是0?- public class StaticDemo {
- static
- {
- i=10;
- System.out.println(StaticDemo.i);
- }
- static int i = 9;
- public static void main(String[] args) {
- System.out.println(i);
- }
- }
复制代码 第四行代码,为什么不用定义,就可以直接赋值,第五行代码可以输出10.
- public class StaticDemo {
- static
- {
- i=10;
- System.out.println(i);
- }
- static int i = 9;
- public static void main(String[] args) {
- System.out.println(i);
- }
- }
复制代码 第四行代码可以赋值为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:
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就不会报错。
作者: 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
非常感谢
作者: xingkong123 时间: 2014-11-28 22:59
学习了。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |