循环调用接口当一个接口加载完成后调用下一个接口_JVM类加载

类的生命周期加载,验证,准备,初始化,卸载 这五个阶段先后顺序是确定的。但是解析阶段不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(动态绑定或晚期绑定)。静态绑定:在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。 所有私有方法、静态方法、构造器及初始化方法都是采用静态绑定机制。在编译器...
摘要由CSDN通过智能技术生成

类的生命周期

3b864315a71783577232d6755f38af72.png
  1. 加载,验证,准备,初始化,卸载 这五个阶段先后顺序是确定的。但是解析阶段不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(动态绑定或晚期绑定)。
静态绑定:在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。 所有私有方法、静态方法、构造器及初始化方法都是采用静态绑定机制。在编译器阶段就已经指明了调用方法在常量池中的符号引用,JVM运行的时候只需要进行一次常量池解析即可。
动态绑定:动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。通俗的是指,对象在调用方法的时候能够自己判断该调用谁的方法。所以动态绑定一般发生在继承、方法重载时。 假设,对象o是类C1的实例,其中C1是C2的子类,C2是C3的子类,那么o也是C2,C3的实例。如果对象o调用一个方法p,JVM会依次在类C1,C2,C3中查找方法p的实现,直到找到为止。类对象方法的调用必须在运行过程中采用动态绑定机制: 首先,根据对象的声明类型(对象引用的类型)找到“合适”的方法。具体步骤如下: ① 如果能在声明类型中匹配到方法签名完全一样(参数类型一致)的方法,那么这个方法是最合适的。 ② 在第①条不能满足的情况下,寻找可以“凑合”的方法。标准就是通过将 参数类型进行自动转型之后再进行匹配。如果匹配到多个自动转型后的 方法签名f(A)和f(B),则用下面的标准来确定合适的方法:传递给f(A) 方法的参数都可以传递给f(B),则f(A)最合适。反之f(B)最合适 。 ③ 如果仍然在声明类型中找不到“合适”的方法,则编译阶段就无法通过。 然后,根据在堆中创建对象的实际类型找到对应的方法表,从中确定具体的方法在内存中的位置。
  1. JVM规范没有强制约束 加载 过程何时开始,这部分可以由虚拟机的具体实现自由把握。但是对于初始化阶段,虚拟机规范严格规定了有且只有 5种情况 必须立即对类进行初始化操作(加载 验证 准备自然要在此之前开始)。
  2. 遇到new、getstatic、putstatic、invokestatic四条字节码指令时,如果类没有进行初始化,则必须先触发其初始化操作。
  3. 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发初始化操作。
  4. 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。但是接口在初始化时,并不要求其父接口全部完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量)才会初始化。
  5. 虚拟机启动时,用户需要制定一个要执行的主类,虚拟机会先初始化这个主类
  6. 当使用JDK1.7 的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic的方法句柄时,并且这个句柄对应的类没有进行初始化,虚拟机需要先触发其初始化操作。

类加载过程

加载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值