坑爹静态初始化问题,请进。

结贴是美德 2013-10-13 06:28:44
这个显现我倒是知道,但是一直不知道为何会这样。。。

代码:

public class Test {
static {
s1 = "s1"; // s1正常
}


static{
s2 = s1 +"s2"; // 提示s1不能在变量定义前引用。
}


static String s1;
static String s2;

}


问题:同样是引用,为何出现在等号左边的s1没问题,出现在等号右边的s1就出错了呢。。。
...全文
296 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
西电小楠 2013-10-15
  • 打赏
  • 举报
回复
引用 5 楼 qq331077064 的回复:
static { s1 = "s1"; //s1定义了,把“s1”的引用赋给s1 } s1="other";//重新赋值 s1最终结果是other; s1="other";//如果在前面,申明,把“other”的引用赋给s1, 静态代码块重新赋值, s1最终是“s1”, 错的来了 static { s2 = s1 + "s2"; // 提示s1不能在变量定义前引用。 } s2有,从没初始化过,,现在不是访问,没问题。再去找s1,s1没有申明过,不知道什么东西,通过class找静态变量,s1找到了,但它没被初始化过,那编译器认为你怎么能操作未初始化的数据呢。应该够详细了吧
感觉描述的不清楚……
西电小楠 2013-10-15
  • 打赏
  • 举报
回复
引用 3 楼 rainbowsix 的回复:
还是不一样的 这个是在赋值, 是在write s1 static { s1 = "s1"; // s1正常 } 这个是在取值, 是在read s1 static{ s2 = s1 +"s2"; // 提示s1不能在变量定义前引用。 }
更容易理解一些……
  • 打赏
  • 举报
回复
s1在上面一个大括号声明只在括号内有效。 下面一个大括号没有声明,所以不能直接使用吧。
guan_tu 2013-10-15
  • 打赏
  • 举报
回复
引用 4 楼 howlaa 的回复:
楼上说的对,在声明前可以writ,不可以read
+1
呼啸 2013-10-14
  • 打赏
  • 举报
回复
楼上说的对,在声明前可以writ,不可以read
郑涛 2013-10-14
  • 打赏
  • 举报
回复
static { s1 = "s1"; //s1定义了,把“s1”的引用赋给s1 } s1="other";//重新赋值 s1最终结果是other; s1="other";//如果在前面,申明,把“other”的引用赋给s1, 静态代码块重新赋值, s1最终是“s1”, 错的来了 static { s2 = s1 + "s2"; // 提示s1不能在变量定义前引用。 } s2有,从没初始化过,,现在不是访问,没问题。再去找s1,s1没有申明过,不知道什么东西,通过class找静态变量,s1找到了,但它没被初始化过,那编译器认为你怎么能操作未初始化的数据呢。应该够详细了吧
无聊找乐 2013-10-13
  • 打赏
  • 举报
回复
还是不一样的 这个是在赋值, 是在write s1 static { s1 = "s1"; // s1正常 } 这个是在取值, 是在read s1 static{ s2 = s1 +"s2"; // 提示s1不能在变量定义前引用。 }
失落夏天 2013-10-13
  • 打赏
  • 举报
回复
换一换位置就可以了。。。 编译是从上向下的 static String s1; static String s2; static { s1 = "s1"; // s1正常 } static{ s2 = s1 +"s2"; // 提示s1不能在变量定义前引用。 }
kanorl 2013-10-13
  • 打赏
  • 举报
回复
这不关静态初始化的事,使用变量前必须初始化

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧