局部变量也得先定义啊,如果直接在代码块里写{b=6;}是不能编译的?作者: 何明辉 时间: 2012-9-9 10:58
楼主你的问题正好也以前我也想问的问题哦。呵呵,关于静态代码块的变量赋值问题,你可以和构造代码块结合起来进行参考,两者在变量赋值上存在类似的情况。不过前者是用来给类进行初始化的,而且只运行一次,而后者是给对象进行初始话的,也只是运行一次。
public class Test {
static{
c=6;
//System.out.println(c)此处如果打印的话就会出现非法向前引用,因为不知道C是什么类型的变量。
//但是前面如果有非静态变量类型修饰的话这里也可也打印。
}
static int c=4;
static int f=7;
static
{
f=8;
System.out.println(f);//此处知道f的类型,所以可以打印,值是8。当然前面有非静态变量类型修饰的话就以这里面的为准,它就相当于在栈中重新开辟了一个局部变量,当代码块运行完之后就释放了,这里没有改变相对应的静态成员变量的值。
//但是f的值前面没有对应变量类型修饰时,这是就相当于把静态成员变量f的值改变成8
}
{
int a=4;
System.out.println(a+"dad");//这里也会出现非法向前引用。
}
int a=2 ;
int b=3;
{
b=5;
}
{
m=3;
System.out.println(m+"....");//这里是可以打印的,因为静态成员变量是随着类的加载就加载进来了。
}
static int m=4;
public static void main(String[] args) {
System.out.println(Test.c);//值是4.
System.out.println(Test.f);//值是8.
Test p=new Test();
System.out.println(p.b);//值是5。
System.out.println(p.a);//值是2。
System.out.println(p.m);//值是4。
}
}
构造代码块那一块我能理解,但是静态成员加载到类中也是有顺序的吧,static int b;它要比static{代码块}先加载进内存,默认初始化0,在执行static{}代码块中的内容,对类中的成员进行初始化,但如果是这样,那么b这个变量就已经在语句中先定义好了,代码块中应该是可以打印b的值的。实际上static{}代码块中是不能引用b的值,这样还是说不通。。。
public class Test{
static{
b=6;
//System.out.println(b);//这里不能直接打印
System.out.println("---------");
}
static int a = 5;
//static int b=9;这里注释掉,改成下面的
static int b;//若改为static int b; 则打印结果为6
static int c;
public static void main(String[] args) {
System.out.println(Test.b);
}
} 作者: 陈俊来 时间: 2012-9-9 15:41
lz啊,这一部分你就从全局变量和局部变量理解就好,
//static int b=9是全局变量
b=6是局部变量
这样就OK了作者: 王红潮 时间: 2012-9-9 17:11
陈俊来 发表于 2012-9-9 15:41
lz啊,这一部分你就从全局变量和局部变量理解就好,
//static int b=9是全局变量
b=6是局部变量
要是按局部变量理解,局部变量要先定义,才能使用,不能直接在代码块里 b=6;除非static int b=9;先加载了,但如果他先加载了,我在代码块里打印一个已经定义并且重新赋值为6是没问题的,但代码块中的b是不能使用的作者: 陈俊来 时间: 2012-9-9 18:39
王红潮 发表于 2012-9-9 17:11
要是按局部变量理解,局部变量要先定义,才能使用,不能直接在代码块里 b=6;除非static int b=9;先加载 ...
你可以这样理解
当执行static{b=6;}的时候发现b未定义,于是它就跑到外面看看是否有全局变量,发现有个
static int b=9;原来已经定义了啊,
所以就没有报错,但由于b=6是局部变量所以最后打印的还是9咯作者: 王红潮 时间: 2012-9-9 18:41