目录
一、单个类的加载顺序
1、加载是类
2、产生自己的静态空间 静态属性 静态方法 静态块
执行静态块
3、在堆内存中开辟对象空间
4、加载类的非静态成员 普通属性 普通方法 普通块
执行普通块 执行构造方法
5、将对象空间的地址引用交给 变量来存储
二、代码
public class Demo {
private String demo = "普通属性";
private static String demoStatic = "静态属性";
public Demo() {
System.out.println("这是Demo无参构造方法");
}
{
this.test();
System.out.println("这是Demo普通的块");
}
static {
testStatic();
System.out.println("这是Demo的静态块");
}
public static void testStatic() {
System.out.println(getDemoStatic());
System.out.println("这是Demo的静态方法");
}
public void test() {
System.out.println(getDemo());
System.out.println("这是Demo的普通方法");
}
public String getDemo() {
return demo;
}
public static String getDemoStatic() {
return demoStatic;
}
}
public class TestMain {
public static void main(String[] args){
Demo p = new Demo();
}
}
三、输出结果
三、对输出结果的解释
在静态方法中调用了静态属性,在静态块中调用了静态方法
都能如愿以偿的输出说明了在静态方法之前就加载了属性
在加载静态方法之前就加载了静态属性------->静态属性产生的比静态方法早
在加载静态块之前就加载了静态方法------>静态方法的产生比静态块早
得出结论:
早------>晚
静态属性 静态方法 静态块
在普通方法中调用了普通属性,在普通块中调用了普通方法
都能如愿以偿的输出说明了在普通方法之前就加载了属性
在加载普通方法之前就加载了普通属性------->普通属性产生的比普通方法早
在加载普通块之前就加载了普通方法------>普通方法的产生比普通块早
最后输出了默认的构造方法
得出结论:
早------>晚
普通属性 普通方法 普通块 默认的构造方法
四、类加载的内存图:
对象的创建是在堆内存中
变量是在栈内存中,Demo d = new Demo();
Demo d = 的意思是将对象空间的地址引用交给 变量来存储