有关java static的一个问题

来源:百度知道 编辑:UC知道 时间:2024/06/08 16:38:15
public class MyTest003 {
static { a = 5;}//1
static{System.out.println(a);}//2
static int a;
static {
System.out.println(a);
a = 6;
System.out.println(a);
}
public static void main(String[] args) {
}
}

为什么//1所在的行不报错?//2所在的行会报错?
希望更多的高人出现!
希望更多的高人出现!
希望更多的高人出现!

请注意,我的问题是:在没有为变量a声明类型的情况下,为什么可以给a赋值(//1行处),但是不能引用a(//2行处)?java里static语句(包括static静态变量的声明和赋值,以及static静态代码块)是按出现的先后顺序,依此执行。

小鱼虫没说清楚.既然"先加载静态成员变量",那为何static{System.out.println(a);}//2还是报错?

希望更多的高人出现!
希望更多的高人出现!
希望更多的高人出现!

请把定义a的类型这句static int a;放在最前面

static int a;
static {
a = 5;
}// 1
static {
System.out.println(a);
}// 2

修改
首先:
java虚拟机的加载的顺序为,先加载静态成员变量,然后是静态代码块;同等级的才按照前后顺序依次加载。
static { a = 5;}//1 这种型式是一个静态代码块,所以static int a;不管在什么位置,只要声明了,就会首先被加载,所以在static { a = 5;}//1 处不会有错误。
其次:
static{System.out.println(a);}//2的地方错误:out是System中的一个静态字段(静态变量),再强调一下!静态字段!!你可以查API看,所以System.out段的代码也会先加载,返回一个PrintStream类型的对象,所以System.out和int a的级别是一样的,System.out如果在前,会先被加载,这时static int a;还没有被加载呢,所以紧接着println会读取到未定义的a产生错误。如果不调用println方法,或者给println()传入一个定义了的对象就不会有错。static{PrintStream out = System.out;}//2或者static{System.out.println("sdfsdf");}//2 无错误。所以,以后一定要注意System.out和其它静态变量的先后顺序,它们级别是相同的。
我觉得这回我解释的够清楚了。

System.out.println()里边的参数是需要有地址的,你放个a进去,又没定义,它上哪找地址,怎么输出内容

我觉得养小鱼de虫说得很清楚了。楼主如果想深入研究,建议看看《深入Java虚拟机》。

我也想知道答案.
感觉小鱼虫还是没说清楚.既然"先加载静态成员变量",那为何static{System.out.println(a);}//2 是错的?