1.java类加载机制
详细的可以看https://blog.csdn.net/qq_44543508/article/details/102983363
阶段:加载---准备
加载阶段简单来说就是:.class文件(二进制数据)----读取到内存中----数据放进方法区-----堆中创建对应class对象----并提供访问方法区的接口
准备阶段:jvm会为被static修饰的变量分配内存并且取该数据类型的默认值如int的默认值是0(注意如果是final static修饰则不用初始化 ),不会为类成员变量分配。
解析阶段:解析阶段就是虚拟机将常量池内的符号引用替换为直接引用(不用掌握)
初始化阶段:对类的使用方式分为主动使用和被动使用。
此题解析:调用静态方法时,初始化这个静态方法所在的那个类,而且类继承原则是初始化一个子类,会先去初始化其父类!但是由final static修饰的常量此时不会初始化任何类。但final static int a=Math.random,这个a并不会在编译之前知道结果,此时不会放到调用类的常量池中,所以这个类会被初始化。
static属于类初始化启动,其他的是对象初始化时启动。
JVM的类加载机制:全盘负责、父类委托、缓存机制
所有的类加载器都继承自classloader(不包括启动类加载器)
2.static关键字
static只会在类加载的时候执行一次,因此很多时候将一些只需要进行一次的初始化操作都放在static代码块中进行。
被static修饰的变量或者方法是独立于改类的任何对象,这些变量与方法不属于任何实例对象,而是被类的实例对象所共享。静态变量是属于这个类,不是属于这个对象。所以在内存中只会有一份