zoukankan      html  css  js  c++  java
  • Java类加载的时机

    类是什么时候初始化的?类初始化的时候会执行static块,这个是我们知道的。那么我们可以用static块来做个实验。

    上面代码输出是:

    hello world
    init
    this is a test
    这说明了什么?在调用TR.hello_world的时候,类并没有初始化!而是在调用其方法test的时候才初始化的。

    这是因为在编译的时候,常量(static final 修饰的)会存入调用类的常量池【这里说的是main函数所在的类的常量池】,调用的时候本质上没有引用到定义常量的类,而是直接访问了自己的常量池。所以,这里调用TR.hello_world的时候,TR并没有初始化。

    类初始化的时机,有且仅有四个:

    1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。(当使用某个类或接口的静态字段,或者对该字段赋值时(即在字节码中,执行getstaticputstatic指令时),用final修饰的静态字段除外,它被初始化为一个编译时的常量表达式。)

    2、使用java.lang.reflect进行反射调用的时候。

    3、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。

    4、当虚拟机启动的时候,需要初始化main函数所在的类。

    说到这里,还要说下,静态变量和静态初始化块,普通变量、普通初始化块之间的初始化顺序。

    对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是
    (静态变量、静态初始化块)>
    (变量、初始化块)>
     构造器

    http://www.cnblogs.com/jackyrong/archive/2008/08/12/1266161.html

    链接中说明了,静态变量和静态初始化块的声明顺序决定了初始化的顺序。

    静态变量和静态初始化块的初始化时间::早于::普通变量和普通初始化块::早于::构造方法。

    并不是完全父类初始化完毕之后,子类才开始初始化。实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

    上面报错的地方,有点奇怪。

    明明在上面都赋值b=2了的。怎么打印语句就不行呢。

    这是因为在类初始化的时候,就规定了,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的,只能赋值,不能访问。

    http://blog.csdn.net/imzoer/article/details/8038249

  • 相关阅读:
    Redis 的set集合使用及set集合和list列表的区别和应用场景
    c++ JsonCpp Parse对Json字符串解析转换判断的补充 Json格式验证
    使用程序将文件夹名字输出到文本文件中
    MVC 使用PageList进行分页
    sql从某不连续的数字中将其分段并找出缺失的数字并分段
    手机跟本机调试
    javascript中常用的一些功能及正则表达式的用法
    配置tomcat免安装版服务器
    xheditor上传图片的java实现
    eclipse 使用技巧
  • 原文地址:https://www.cnblogs.com/softidea/p/3931350.html
Copyright © 2011-2022 走看看