• 虚拟机类加载机制


    本文参考《深入理解java虚拟机》

    虚拟机加载类的过程:

    java源程序被编译器编译成class文件后,会被虚拟机的类加载器加载,加载完成后,会为class文件在内存中开辟一块空间用来存储class文件对象,之后对class文件进行校验,准备,解析和初始化,最终形成能被虚拟机使用的java类型,这叫做类加载过程。

    过程:

    校验:检验class文件的正确性,判断class文件是否对虚拟机的安全造成威胁。

    准备:为类成员分配内存空间,值得注意的是,会给静态属性默认赋值,比如 static int a,a的值在内存中默认是0。

    解析:将符号引用转为直接引用。

    初始化:为准备阶段的类成员赋于我们定义的值。

    类加载过程图:

    什么时候进行初始化?

    1.使用putstatic,new,getstatic,invokestatic这四个字节码命令时进行初始化。

    2.子类初始化时需要先把父类初始化。

    3.对类进行反射调用时

    4.含有主方法的类要被初始化

    初始化要点

    对于静态字段只有直接定义这个静态字段的类会被初始化。

    package com.yqg.test;
    
    public class Cat extends Dog{
           static {
               System.out.println("我是九尾");
           }
    }
    
    package com.yqg.test;
    
    public class Dog {
        
        public static  int value = 2;
        static {
            System.out.println("我是神犬");
        }
        
    }
    
    package com.yqg.test;
    
    public class Test {
           public static void main(String[] args) {
            System.out.println(Cat.value);
        }
    }

    结果:

    我是神犬
    2
  • 相关阅读:
    HDU-5818-Joint Stacks
    蓝桥杯-2016CC-卡片换位
    HDU-2255-奔小康赚大钱(KM算法)
    蓝桥杯-PREV31-小朋友排队
    crypto.js加密传输
    js之对象
    LigerUi之ligerMenu 右键菜单
    关于js中window.location.href,location.href,parent.location.href,top.location.href的用法
    设置js的ctx
    AngularJS简单例子
  • 原文地址:https://www.cnblogs.com/yanqingguo/p/9732954.html
Copyright © 2020-2023  润新知