Java内存分析
public class Main {
public static void main(String[] args) {
/**
* 1、加载到内存,产生一个Class对象
* 2、链接,给静态变量value赋值默认值0
* 3、初始化,如果实例化对象,方法会将所有static变量和代码块按顺序进行合并执行
*/
Test test = new Test();
System.out.println(Test.value);
}
}
class Test{
public Test(){
System.out.println("Test类的构造方法");
}
/**
* static是按顺序执行的
*/
static int value = 100;
static {
value = 300;
System.out.println("Test类的静态代码块");
}
}
类初始化发生的条件
类加载器
public class Main {
public static void main(String[] args) {
/**
* 获取系统类加载器
*/
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
/**
* 获取系统类加载器的父类加载器——拓展类加载器
*/
ClassLoader extClassLoader = systemClassLoader.getParent();
System.out.println(extClassLoader);
/**
* 获取拓展类加载器的父类加载器——引导类加载器(C/C++)
*/
ClassLoader bootClassLoader = extClassLoader.getParent();
System.out.println(bootClassLoader);
/**
* 获取当前类的加载器
*/
ClassLoader classLoader = Main.class.getClassLoader();
System.out.println(classLoader);
/**
* 获取内置的类的加载器
*/
try {
ClassLoader objectClassLoader = Class.forName("java.lang.Object").getClassLoader();
System.out.println(objectClassLoader);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
/**
* 系统类加载器可以加载哪些路径下的类
*/
System.out.println(System.getProperty("java.class.path"));
}
}