以下是我的个人看法,仅供参考: 1. //System.out.println(a); 方法不能直接放在类里动作。要么放在函数(方法)里,要么放在static{}里。 否则这个方法就没有调用者。 放在static{}里是由装载函数(对象还未实例化呢)来调用。 2. { a=999;} public int a; 可以,而 a=999; public int a; 却不行。 说明加了{}以后,编译器在扫描符号阶段会先扫到public int a; 再扫到层次更深的{ a=999;} 然后再初始化阶段:安先后顺序运行赋值。 所以是先构建public int a;再执行{a=999;} 。
System.out.println(a); 方法不能直接放在类里动作。要么放在函数(方法)里,要么放在static{}里。------------------------------------------------------然而这样却可以~ public int a; { a=999; System.out.println(a); }
哦,那我说错了。这样的问题都被你发现了,真是服了U :) 编译器不是我们做的。只能猜想: a=999;中的a不是reference。 而System.out.println(a);是种reference。 想想,他们之间也是有区别的,因后者要复制一份,而前者直接操作原来数据。 至于编译为什么要这样做,不得而知。话说回来,这些其实都不重要。因为规则的制定者不是我们。而为什么要这 样制定,其实也并非一定有100%的理由。只能说,这样可能比其它方案会好些。 象下面这样的代码,即使能运行,也不是"好的"(大家就这么约定了)代码: { a=999;} public int a;类似的例子还有很多,比如return的问题(http://www.csdn.net/develop/Read_Article.asp?Id=25828).此例中还有更多情况没有点明,如if...else...if...else...if,多来几个层次的话,编译器就不管你了。 //不能通过编译: class test { public String test() { if(true){ return ""; } } } //能通过编译: class test { public String test() { while(true){ return ""; } } }
public String test() { while(true){ return ""; } } 和 public String test() { boolean aa = true; while (aa) { return ""; } } 的区别是什么?
你的变量a是实例变量,而你再static block里给它赋值者当然不行了。
can't access instance variable in static context
a=999; //System.out.println(a); //如果把这句的注释去掉,则报
}
这是STATIC BLOCK吗??
1.
//System.out.println(a);
方法不能直接放在类里动作。要么放在函数(方法)里,要么放在static{}里。
否则这个方法就没有调用者。
放在static{}里是由装载函数(对象还未实例化呢)来调用。
2.
{ a=999;}
public int a;
可以,而
a=999;
public int a;
却不行。
说明加了{}以后,编译器在扫描符号阶段会先扫到public int a;
再扫到层次更深的{ a=999;}
然后再初始化阶段:安先后顺序运行赋值。
所以是先构建public int a;再执行{a=999;} 。
方法不能直接放在类里动作。要么放在函数(方法)里,要么放在static{}里。------------------------------------------------------然而这样却可以~
public int a; {
a=999; System.out.println(a); }
编译器不是我们做的。只能猜想:
a=999;中的a不是reference。
而System.out.println(a);是种reference。
想想,他们之间也是有区别的,因后者要复制一份,而前者直接操作原来数据。
至于编译为什么要这样做,不得而知。话说回来,这些其实都不重要。因为规则的制定者不是我们。而为什么要这
样制定,其实也并非一定有100%的理由。只能说,这样可能比其它方案会好些。
象下面这样的代码,即使能运行,也不是"好的"(大家就这么约定了)代码:
{ a=999;}
public int a;类似的例子还有很多,比如return的问题(http://www.csdn.net/develop/Read_Article.asp?Id=25828).此例中还有更多情况没有点明,如if...else...if...else...if,多来几个层次的话,编译器就不管你了。
//不能通过编译:
class test {
public String test() {
if(true){
return "";
}
}
}
//能通过编译:
class test {
public String test() {
while(true){
return "";
}
}
}
while(true){
return "";
}
}
和
public String test() {
boolean aa = true;
while (aa) {
return "";
}
}
的区别是什么?
这是java本身的编译方式,如果用jb的话就必须把成员变量全放到前面才可以。