jvm类加载:
类加载的时间:按需加载,运行期间
常量:final static 在准备阶段进行赋值
类变量:static 准备阶段为null或者0之类的,初始化阶段进行赋值
变量:创建对象的时候进行赋值
创建对象的步骤:
举例:new 类名
1.根据new的参数在常量池中定位一个累的符号引用,
2.如果没有找到这个符号引用,说明类还没有被加载,则进行类的加载、解析和初始化
3.虚拟机为对象分配内存(位于堆中)
4.将分配的内存初始化为0值(不包括对象头)
5.调用对象的init()方法
对象头:
用于存储对象自身的运行时数据,如哈希码,GC分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳等。另一部分是类型指针Java对象大小之类。
实例数据:
有效信息
对齐填充:
不是必须
静态代码块:初始化阶段
普通代码块:创建对象的时候
构造器:创建对象的时候
public class Test01 {
public static void main(String[] args) {
System.out.println(B.str);
}
}
class A {
public static String str = "qwer";
static {
System.out.println("A....");
}
}
class B extends A{
//public static String str="yuyu";
static {
System.out.println("B...");
}
}
结果如下:如果没有注解则子类和父类的静态代码块都会输出,表明两个类都加载了。
A....
qwer
Process finished with exit code 0
分析:在继承关系当中,先加载的是父类的类变量,然后才是子类的类变量,准备阶段在子类中找不到,则会在父类中查找,找到后进行类加载,初始化,得到结果。
类加载器:
通过一个类的全限定名来获取描述该类的二进制字节流的这个动作的“代码”被称为“类加载器”