5行代码求解释

bojianyu 2012-07-05 05:27:23
public class Test01 {
{
b = 5 ;
a = b + 1 ;
}
int a ;
int b ;
}
----------------------------------
以上代码a=b+1;报错,说b未定义。求解释。此贴的前贴请参见:
http://topic.csdn.net/u/20120705/15/ea3af978-8b08-4d9d-9553-1e0a18548e2c.html

...全文
6215 点赞 收藏 126
写回复
126 条回复
w2zysys 2012年07月27日
[Quote=引用 111 楼 的回复:]
类里面的那个{}什么意思啊 我没看懂啊。。。。。
[/Quote]
那是非静态的匿名类
回复 点赞
w2zysys 2012年07月27日
[Quote=引用 34 楼 的回复:]
Java code

public class Test {
{
b = 5 ;
a = b + 1 ;
}
int a ;
static int b ;//在此处加入static就可以了 因为代码块中的代码先执行,而此时b尚未定义 但是如果把b的定义换为static的话 ……
[/Quote]
运行结果b = 0
回复 点赞
Jone-ForOne 2012年07月27日
我的天啊,不止代码逆天,人都逆天啦。变量不定义,怎么用。了解Java初始化顺序
回复 点赞
gaiyinzhijia 2012年07月27日
Cannot reference a field before it is defined
意思是在变量定义之前是不能被引用的,像b=5这种是可以通过的。
回复 点赞
VanBaston 2012年07月27日
[Quote=引用 2 楼 的回复:]
{
b = 5 ;
a = b + 1 ;
}
以上代码表示static的,所以下面的int a,int b 定义根本不行,首先编译都不能通过,、
修改方法:把int b 修改为 static int b即可。
[/Quote]

这个不是静态块,静态块是 static {}这样的形式,楼主这个形式就是代码块。
回复 点赞
MacJoin 2012年07月27日
补充一句:java的灵活表现在能在类的任何位置定义变量或方法,但是不能这么颠倒次序!
回复 点赞
MacJoin 2012年07月27日
LZ必须了解jvm在程序运行时是如何执行的,哪些代码jvm会在类加载的时候就执行,哪些代码会在类加载之后执行是你必须了解的内容。
针对你提出来的问题首先{...}这是一个块,那这个块是jvm加载类的时候就开始执行的东西,但是你的a和b的定义却放在块外边,是属于创建对象的时候才初始化的代码,所以出现了冲突,要么定义成用static修饰,要么放到块里头。ok?
java相对于C啊什么的这些编程语言可能在语法上要灵活一点,也就是说可能你那样想颠倒一下次序执行不是说不行,但是好多事情要随大流,灵活并不代表乱用。
回复 点赞
MacJoin 2012年07月27日
LZ必须了解jvm在程序运行时是如何执行的,哪些代码jvm会在类加载的时候就执行,哪些代码会在类加载之后执行是你必须了解的内容。
针对你提出来的问题首先{...}这是一个块,那这个块是jvm加载类的时候就开始执行的东西,但是你的a和b的定义却放在块外边,是属于创建对象的时候才初始化的代码,所以出现了冲突,要么定义成用static修饰,要么放到块里头。ok?
java相对于C啊什么的这些编程语言可能在语法上要灵活一点,也就是说可能你那样想颠倒一下次序执行不是说不行,但是好多事情要随大流,灵活并不代表乱用。
回复 点赞
ainibc 2012年07月27日
第一个a和b不在啊a,b的作用域内
回复 点赞
ainibc 2012年07月27日
第一个a和b不在啊a,b的作用域内
回复 点赞
mengxieshi 2012年07月26日
先弄清楚基本的规则吧!
回复 点赞
吖超 2012年07月26日
int b ;
int a;


public class Test01 {
{
b = 5 ;
a = b + 1 ;
}

这样顺序吧
回复 点赞
下雪天 2012年07月26日
类里面的那个{}什么意思啊 我没看懂啊。。。。。
回复 点赞
Mathore 2012年07月26日
哎呀呀,还能看到用javap来测试的。 哇哈哈 支持84L
回复 点赞
歪歪瓜 2012年07月26日
哇塞,这样的问题竟然有这么多人回答,热心人好多啊!
回复 点赞
忆纷飞 2012年07月26日
这......定义在下面啊 搬上去就ok...
回复 点赞
bojianyu 2012年07月25日
[Quote=引用 97 楼 的回复:]
"教育"人的时候不能把帖子读全吗?
这么"大义凛然"的批评一个光荣的计算机教师,不感觉羞愧吗?
也许你现在"教育"的正好是教你的老师...


引用 92 楼 的回复:

楼主,不知道你这代码是从哪里得来的,也有可能是自己想出来的,不管哪种,体现出来的都是,没从基础的地方一步一步走来。不管学什么东西,这样进行是不好的。不管自己有没有创新能力,先搞清楚基础的,才是其它的。
[/Quote]
^_^
回复 点赞
yqy521 2012年07月20日
LZ啊,你这是基础问题了!

int b;
int a;
private int id = 10;
{
b = 5;
a = b+1;
}
程序初始化的顺序:第一步:静态代码块和静态全局变量。
第二步:代码块和成员变量
第三步:构造方法
你这个代码代码块和成员变量是同级的,程序是由上往下执行的!所以就会报错了!
回复 点赞
zhangyong369 2012年07月20日
[Quote=引用 50 楼 的回复:]
引用 48 楼 的回复:
能不能希望某个高手从JVM校验、加载等步骤的角度给俺解释解释呢?

这个是编译期的语法分析检查,涉及不到运行期的加载
既然是语法分析检查,自然就有语法规则,也就说java的语法规则就是这样规定的
LZ有时间的话,可以下载openjdk的源码,去看看javac的scanner和parser的相关代码




引用 49 楼 的回复:
引用 43 楼 的……
[/Quote]
这个有意思
回复 点赞
ylwltc 2012年07月20日
加static修饰词
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告