3 类加载
3.1类的加载过程:
当使用java命令运行java程序时,此时JVM启动,并去方法区下找java命令后面跟的类是否存在,如果不存在,则把类加载到方法区下
在类加载到方法区时,会分为两部分:先加载非静态内容到方法区下的非静态区域内,再加载静态内容到方法区下的静态区域内
当非静态内容载完成之后,就会加载所有的静态内容到方法区下的静态区域内
3.1 先把所有的静态内容加载到静态区域下
3.2 所有静态内容加载完之后,对所有的静态成员变量进行默认初始化
3.3 当所有的静态成员变量默认初始化完成之后,再对所有的静态成员变量显式初始化
4,当所有的静态成员变量显式初始化完成之后,JVM自动执行静态代码块(静态代码块在栈中执行)[如果有多个静态代码,执行的顺序是按照代码书写的先后顺序执行]
5,所有的静态代码块执行完成之后,此时类的加载完成
3.2对象的创建过程:
当在main方法中创建对象时,JVM会先去方法区下找有没有所创建对象的类存在,有就可以创建对象了,没有则把该类加载到方法区
在创建类的对象时,首先会先去堆内存中开辟一块空间,开辟完后分配该空间(指定地址)
当空间分配完后,加载对象中所有的非静态成员变量到该空间下
所有的非静态成员变量加载完成之后,对所有的非静态成员进行默认初始化
所有的非静态成员默认初始化完成之后,调用相应的构造方法到栈中
在栈中执行构造函数时,先执行隐式,再执行构造方法中书写的代码
6.1 构造方法中的隐式:
第一步:执行super()语句 调用父类的没有参数的构造方法
第二步:对所有的非静态成员变量进行显式初始化(在定义成员变量时后面有赋值)
第三步:所有的非静态成员变量显式初始化完成之后,执行构造代码块
Ps.第二步第三步按照书写顺序执行
6.2 最后执行构造方法中书写的代码
当整个构造方法全部执行完,此对象创建完成,并把堆内存中分配的空间地址赋给对象名(此时对象名就指向了该空间)