class ForwardReference{
{
// System.out.println(age);//compile error
age=22;
}
int age=21;
}
class ForwardReference02{
//int first=second; //Can't make forward refencece to second in class
int accessTooSoon(){
return second;
}
int first=accessTooSoon();
int second=1;}先来分析ForwardReference: ForwardReference是这样初始化的 首先声明变量int age; 并赋于缺省值(0)此时age=0;
然后执行实例块
{
System.out.println(age); //1处
age=22;
}
按我自己的想法是 System.out.println(age); 应该输出0 然后将age赋值为22
最后又将age赋值为21 但是结果1处却不能compile, cause by:forward refencece
再来分析ForwardReference02:ForwardReference02是这样初始化的 首先按照代码先后顺序
声明变量int first , int second; 并赋于缺省值(0)此时first=0,second=0;
然后执行赋值操作
int first=accessTooSoon(); //调用accessTooSoon()返回second值0 此时first=0
int second=1; //将second赋值为1通过对比
我的疑惑就是在1处?为什么会出现 forward refencece error(难道问题出现在 实例块 实例方法 这两者之间)
我分析错误了?谁能替我解忧?
{
// System.out.println(age);//compile error
age=22;
}
int age=21;
}
class ForwardReference02{
//int first=second; //Can't make forward refencece to second in class
int accessTooSoon(){
return second;
}
int first=accessTooSoon();
int second=1;}先来分析ForwardReference: ForwardReference是这样初始化的 首先声明变量int age; 并赋于缺省值(0)此时age=0;
然后执行实例块
{
System.out.println(age); //1处
age=22;
}
按我自己的想法是 System.out.println(age); 应该输出0 然后将age赋值为22
最后又将age赋值为21 但是结果1处却不能compile, cause by:forward refencece
再来分析ForwardReference02:ForwardReference02是这样初始化的 首先按照代码先后顺序
声明变量int first , int second; 并赋于缺省值(0)此时first=0,second=0;
然后执行赋值操作
int first=accessTooSoon(); //调用accessTooSoon()返回second值0 此时first=0
int second=1; //将second赋值为1通过对比
我的疑惑就是在1处?为什么会出现 forward refencece error(难道问题出现在 实例块 实例方法 这两者之间)
我分析错误了?谁能替我解忧?
{
System.out.println(age);
age=22;
}
static int age=21;
}
class ForwardReference{
int age=21; {
System.out.println(age);
age=22;
}
}
{
// System.out.println(age);//compile error
age=22;
}
int age=21;
}
class ForwardReference02{
//int first=second; //Can't make forward refencece to second in class
int accessTooSoon(){
return second;
}
int first=accessTooSoon();
int second=1;}你怎么定义的时候对类变量的声明都放在方法体后面~这样程序运行一定会处错误的~
class ForwardReference{
int age=21;
{
age=22;
}
}
class ForwardReference02{
int second=1;
int accessTooSoon()
{
return second;
}
int first=accessTooSoon();
Sysstem.out.println(first);
}
而对于ForwardReference02类,你还是犯了和上面一样的错误~调用accessTooSoon()这本没有错~不过你在方法中返回second~这个是在最后面定义的~编译器不会到最后面去找这个~编译器是按顺序执行的~所以也会出现异常~
{
// System.out.println(age);//compile error
age=22;
}
int age=21;
}
class ForwardReference02{
//int first=second; //Can't make forward refencece to second in class
int accessTooSoon(){
return second;
}
int first=accessTooSoon();
int second=1; public static void main(String[] args) {
System.out.println( new BeforeQuote().first );//output 0
}
}
声明:
此代码并无错误!!!!
static int second = 1;
static int first = second;
static int accessTooSoon(){
return second;
}
public static void main(String args[]){
first = accessTooSoon();
}}
我觉得你不仅要看看变量定义的顺序 还要看看静态和非静态的知识...
1.
{
age=22;
}
int age=21;
可以编译通过证明了 在实例块中{} 是知道age的存在的因为初始化的时候就是new 的时候 声明并且初始化了age=0
2.
{
System.out.println(age);
}
int age=21;
按照1的推论 2是不该有farward reference error的 结果却相反我想我更定是理解错误了 就是不知道自己哪里理解的不对
参考java 语言规范,
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.3.2
java编译器对初始化和其他语句的语法检查是不同的。具体看上面网址的说明。
如果有兴趣看javac的源代码:
参考
langtools-4af43632966c\src\share\classes\com\sun\tools\javac\comp\Attr.java
检查是在checkInit()中进行的。
代码下载地址:
http://hg.openjdk.java.net/jdk7/2d/langtools/archive/tip.zip
{
System.out.println(this.age);
age=22;
}
int age=21;
}发现加了个this也可以.........可以解释下为什么吗