public class Student{
static{
name="世界";
//静态代码块的作用就是给类初始化的,Student类一加载进内存就进行了初始化动作,给name赋了内存地址值,让name指向了"世界"这个对象
}
private static String name="你好";
}
上面的这段代码没有问题,编译OK
但是下面的这段代码就报错了:
public class Student{
static{
System.out.println(name);
//你这么写,name连初始化值都没有,虚拟机怎么访问name,虚拟机完全不知道该怎么给这个变量分配内存空间,编译当然失败。
}
private static String name="你好";
//当你把这句话写在静态代码块的前面时,name就有了初始化值,这个值是"你好"这个对象的内存地址值,虚拟机才知道可以给name分配内存空间, 把对象"你好"的地址值赋给了name,
//让name指向了"你好"这个对象。
}
总结一句话就是:方法和代码块中的变量都必须显示初始化,否则JVM完全不知道该怎么给它们分配内存空间,它们不能在内存中安家,JVM就访问不了他们。 |