public class InitialOrderTest {
static {
c = 'F'; //正确
System.out.println(c); //错误???为什么
}
public static char c = 'E';
public static void main(String[] args) {
new InitialOrderTest(); }
} 为什么c = 'F';没有错,而System.out.println(c);有错误呢?c = 'F';在System.out.println(c);前面啊?不理解
static {
c = 'F'; //正确
System.out.println(c); //错误???为什么
}
public static char c = 'E';
public static void main(String[] args) {
new InitialOrderTest(); }
} 为什么c = 'F';没有错,而System.out.println(c);有错误呢?c = 'F';在System.out.println(c);前面啊?不理解
楼主【xiaomage20042001】截止到2008-07-25 00:55:26的历史汇总数据(不包括此帖):
发帖的总数量:3 发帖的总分数:60 每贴平均分数:20
回帖的总数量:2 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:2 结贴的总分数:40
无满意结贴数:0 无满意结贴分:0
未结的帖子数:1 未结的总分数:20
结贴的百分比:66.67 % 结分的百分比:66.67 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
楼主加油
public class TT
{ static
{
c = 'F'; //正确
//System.out.println(c); //错误???为什么
}
public static char c = 'E';
public static void main(String[] args) {
TT t=new TT();
System.out.println(t.c); }
} 这样写得到的结果是 Fpublic class TT
{ public static char c = 'E';
static
{
c = 'F'; //正确
System.out.println(c); //错误???为什么
}
public static void main(String[] args) {
TT t=new TT();
// System.out.println(t.c); }
}
我的java基础也不好 ,我个人的理解就是对于静态域和静态快,好像编译器是按照语句的顺序编译的 ,如果理解不正确的话 我也一起等待高人的解释
c = 'F' 没有报错
但是System.out.println(c)报错了
错误是不能引用一个数据域在它被定义之前
这个应该是语法检查工具的问题 在引用的时候才进行检查吧至于执行顺序 是这样的
静态初始化块 是在类装载进虚拟机的时候执行的
然后初始化块是在创建类的实例时 构造方法执行之前执行的
static {
c = 'F';
System.out.println(Test.c); //Test.c
}
public static char c = 'E'; public static void main(String[] args) {
System.out.println(Test.c); }
static {
c = 'F'; //正确
//System.out.println(c); //错误???为什么
}
public static char c = 'E'; 这样在main中打印会打印出E来,静态块初始化可以在申明变量之前进行初始化,但是申明变量时同时再赋值会覆盖前面的初始化。
public class InitialOrderTest {
static {
char c = 'F'; //正确
//System.out.println(c); //错误???为什么
}
//public static char c = 'E';
public static void main(String[] args) {
new InitialOrderTest();
System.out.println(c);//这样也会报错!不知道为什么??
}
}
这样就不会报错public class InitialOrderTest {
//static {
static char c = 'F'; //正确
//System.out.println(c); //错误???为什么
// }
//public static char c = 'E';
public static void main(String[] args) {
new InitialOrderTest();
System.out.println(c);
}
}
package com.jsp.test;public class InitialOrderTest { /**
* @param args
*/
static {
char c = 'F';
System.out.println(c); //错误???为什么
}
public static char c = 'E';
public static void main(String[] args) {
new InitialOrderTest(); } }在定义字段之前不能引用该字段
public class InitialOrderTest { /**
* @param args
*/
static {
char c = 'F';
System.out.println(c); //错误???为什么
}
public static char c = 'E';
public static void main(String[] args) {
new InitialOrderTest();
System.out.println(c); } }
这样的话输出是
F
E你在引用(System.out.println(c);)之前需要定义。static的顺序是自上而下。
public class StaticTest {
static {
c = 'F';
System.out.println(StaticTest.c); //报错
}
public static char a = 'E';//没有声明为c public static void main(String[] args) {
System.out.println(new StaticTest().a);
}
}难道编译器会综合分析
static {
c = 'F'; //正确
System.out.println(c); //错误???为什么
}
顺序
public class InitialOrderTest
{
public static char c = 'E';
static
{
c = 'F';
System.out.println(c);
}
public static void main(String[] args) {
new InitialOrderTest(); }
} 把C的声明放到前面就OK 了
首先,9楼的说过了静态块初始化(形如static{}形式)可以在申明变量之前进行初始化,这也就是c='F';这句话为什么不报错的原因,但执行System.out.println(c); 的时候由于字段c并没有定义所以报错。
其实这个问题很好理解
public class Problem1{
static {
char c = 'F'; //如果char不写,由于static块初始化不会报错;
//下面public static char c = 'E';这句话申明变量时同时再赋值会覆盖前面的初始化
//如果写成static{c='F';}public static char c;则会输出F。这就证明了静态块初始化可以在申明变量之前进行初始化这句话的意思
System.out.println(c); //这里输出F,是这个块里的c的值。
}
public static char c = 'E'; //如果去除这句话当然会报错了,注意上面char c的作用域;
public static void main(String[] args) {
new Problem1();
System.out.println(c);//如果没有这句话,输出c;加上这句话输出F,E可见先执行static块里的内容
}
}
所以说此问题是static块初始化和作用域的问题,应该了解了把。