楼主你的问题正好也以前我也想问的问题哦。呵呵,关于静态代码块的变量赋值问题,你可以和构造代码块结合起来进行参考,两者在变量赋值上存在类似的情况。不过前者是用来给类进行初始化的,而且只运行一次,而后者是给对象进行初始话的,也只是运行一次。
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。
}
}
|