类的加载和初始化的区别

说到类的加载和类的初始化,想必大家都会很迷茫,总是搞不清楚他俩的区别,下面就来说一说他俩的区别:

类的加载包括类的初始化,类的加载后使用前的最后一个阶段。

 

类的加载:代表jvm将java文件编译成class文件后,以二进制流的方式存放到运行时数据的方法区中,并在java的堆中创建一个java.lang.Class对象,用来指向存放在方法堆中的数据结构。

这里给大家推荐一篇java类加载的很好的文章:https://www.cnblogs.com/ityouknow/p/5603287.html

 

类的初始化:类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中验证、准备、解析3个部分统称为连接。类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。

类加载有三种方式:

1、命令行启动应用时候由JVM初始化加载

2、通过Class.forName()方法动态加载

3、通过ClassLoader.loadClass()方法动态加载

 

在执行类的时候,静态变量会优先类的构造函数执行。

例如:

加载测试类

package frist;
public class ParentClass {
	static int num = 0;
	String name = "qqqqqq";
	static String name2 = "wwwwwwwwwww";
	static ParentClass parentClass = new ParentClass();
	ParentClass(){
		System.out.println("这里是构造函数*************");
	}
	{
		System.out.println("name1:" + name);
		System.out.println("这里是块1============");
	}
	static {
		num += 1;
		System.out.println("name2:" + name2);
		System.out.println("这里是静态初始化块*************" + num);
	}
	
}

测试类:

package frist;

public class TestClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ParentClass pa = new ParentClass();
		
	}

}

输出结果:

name1:qqqqqq
这里是块1============
这里是构造函数*************
name2:wwwwwwwwwww
这里是静态初始化块*************1
name1:qqqqqq
这里是块1============
这里是构造函数*************

执行顺序:静态对象parentClass执行初始化---》静态对象parentClass的静态块---》静态对象parentClass的构造方法---》最开始被调用的类的静态块---》最开始被调用的类的构造方法

这是因为静态对象的执行级别是一样的,因此会从最靠上的静态对象开始执行,而且每个静态方法只会在类生命的时候初始化一次。

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Java中,加载初始化是Java虚拟机(JVM)执行的一部分。类加载是将的.class文件从磁盘加载到JVM中的过程,而初始化是为的静态变量赋初值并执行静态块的过程。 类加载过程分为以下三个步骤: 1.加载(loading):将的.class文件从磁盘读入内存中,并为之创建一个Class对象。 2.链接(linking):将的二进制代码合并到JVM的运行状态中,并分配内存空间。链接过程又分为三个子步骤: - 验证(verification):验证的二进制代码是否符合JVM规范,包括语法检查、型检查、字节码验证等。 - 准备(preparation):为静态变量分配内存空间并赋初值(默认值),如int型为0,对象型为null。 - 解析(resolution):将符号引用转换为直接引用,如将名转换为的地址引用。 3.初始化(initialization):为的静态变量赋实际值,并执行静态块。 初始化规则: - 当创建的实例时,如果该还没有被初始化,则先初始化。 - 当访问的静态变量或静态方法时,如果该还没有被初始化,则先初始化。 - 当子初始化时,如果发现父还没有被初始化,则先初始化。 - 当虚拟机启动时,会初始化所有被引用的。 总之,加载初始化是Java虚拟机中非常重要的概念,对理解Java的运行机制有很大帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值