java jvm加载类


说明:

        内存中存在栈、堆(放创建好的对象)、方法区(实际上也是一种特殊的堆)

1.当创建一个Demo01的类会保存在JAVA类源代码上,JVM虚拟机 会创建一个class文件,首先在方法区中形成Demo01类对应的(静态变量、类方法、代码等。。。)存储信息,同时根据方法区里面的信息在堆里面也会形成java.lang.Class对象(反射对象),代表Demo01类,通过对象可以访问到类二进制结构。然后加载变量A类信息,同时也会在堆里面形成a对象,代表A类。

2.main方法执行时会在栈里面形成mian方法栈帧,一个方法对应一个栈帧,如果main方法调用了别的方法,会在栈里面挨个往里面压,main方法里面有局部变量A类型的a,一开始a为null,通过new调用类A的构造器,栈里面生成A()方法同时堆里面生成A对象,然后把A对象的地址付给栈中的a,此时a就有了A对象的地址

3.当再次调用A.方法()时,调用方法区数据。

当类被引用的加载,类只会加载一次

  • 类的主动引用(一定会发生类的初始化)
    • new一个类的对象
    • 调用类的静态成员(除了final常量)和静态方法
    • 使用java.lang.reflect包的方法对类进行反射调用
    • 当虚拟机启动,java Demo01,则一定会初始化Demo01类,说白了就是先启动main方法所在的类
    • 当初始化一个类,如果其父类没有被初始化,则先初始化它父类
  • 类的被动引用(不会发生类的初始化)
    • 当访问一个静态域时,只有真正声名这个域的类才会被初始化
      • 通过子类引用父类的静态变量,不会导致子类初始化
    • 通过数组定义类的引用,不会触发此类初始化
    • 引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)

参考地址:https://www.cnblogs.com/dooor/p/5289994.html

https://blog.csdn.net/hu_wen/article/details/53635710

如有问题欢迎指正!共同学习进步!



猜你喜欢

转载自blog.csdn.net/ZLNEWCSDN/article/details/80654517