黑马程序员技术交流社区

标题: 静态代码块的加载的问题 [打印本页]

作者: 常在河边走_    时间: 2013-9-14 19:37
标题: 静态代码块的加载的问题
本帖最后由 杨增坤 于 2013-9-14 22:34 编辑

class StaticDemo{
        //静态代码块
        static
        {
                System.out.println("静态初始化块...");
        }
        static final String a = "哈哈";
}

public class Test{
        public static void main(String[] args) {
                System.out.println(StaticDemo.a);        //这里调用了StaticDemo类的方法,为什么静态代码块不能运行
        }
}
请问什么我获取a的值, Static中的静态代码块不会执行?


作者: 张文豪    时间: 2013-9-14 20:18
如果一个静态成员是编译时常量则对它的引用不会引起定义它的类的初始化。
static final String a = "哈哈";a是个静态常量所以对应它的引用不引起StaticDemo类的初始化,所以静态块也不会初始化


作者: 雪龙    时间: 2013-9-14 20:23
static final String a = "哈哈";  定义a变量时不要使用final  去掉final就ok了

作者: 毋须繁华    时间: 2013-9-14 20:30
final:最终
final修饰变量叫做最终变量
final变量必须赋初始值
final变量不能修改值

final也可以用于修饰方法内的变量
final修饰的变量只能被赋值一次

由于类的加载在JVM中只进行一次,因此静态代码块只能被运行一次
1.访问静态变量时运行
2.访问静态方法时运行
3.创建对象的时候运行

由于final变量的存储问题……所以并不是调用的类中…… 把final去掉就可以了……
  1. class StaticDemo{
  2.     //静态代码块
  3.    static
  4.     {
  5.             System.out.println("静态初始化块...");
  6.     }
  7.     static String a = "哈哈";
  8. }

  9. public class Test{
  10.     public static void main(String[] args) {
  11.             System.out.println(StaticDemo.a);        //这里调用了StaticDemo类的方法,为什么静态代码块不能运行
  12.             
  13.    }
  14. }
复制代码

作者: Yuan先生    时间: 2013-9-14 20:31
类加载的时机:第一次创建对象,第一次访问类的静态成员,只是声明引用不会发生类加载
但对于static final String a = "哈哈";属于直接赋值,JVM在编译的时候就已经知道变量a的值,所以不会发生类加载,但如果这样写:static final String a = String.valueOf("哈哈");这属于间接赋值,会发生类加载
作者: 焦允    时间: 2013-9-14 20:31
静态代码块在类加载的时候就会运行,而且只运行一次。一般而言,在创建类的对象或调用类里面的静态成员的时候,类就会被加载,静态代码也会随之被执行。就上面程序而言,主方法和静态代码块在同一个类,所以主方法一运行,类就会被加载进内存,静态代码块也会被执行,所以在调用变量的时候,不会在执行静态代码块。
作者: 晓天s    时间: 2013-9-14 20:31
在虚拟机加载类的时候就会加载执行,而且只执行一次,所以第一步是类加载,注意!static块,也就是静态块,在类加载的时候就执行了,而且只执行一次,因为不可能进行第二次类加载,从这个意义上说,静态的成员是第一时间执行的,然后才轮到别人!
作者: 645420297    时间: 2013-9-14 21:57
因为静态优先于对象存在,对象一创建他就会自动执行一次,只有创建对象才会运行一次,你只是调用了类的方法并没有创建对象
作者: 周文斌    时间: 2013-9-14 21:59
静态代码块的执行,只在程序加载阶段,并且只执行一次。

也就是说,当我们执行某段程序时,在最初的 相关class类加载到方法区,之后会自动执行类内的静态代码块。

了解 “静态”相关知识点,由一个窍门儿,就是,所有“静态”在内存的加载都与 代码中的“对象”,“调用”等咱们“人”所编写的任何动作无关,他的加载由虚拟机控制~~~。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2