总结:类加载、初始化实现顺序

类的加载着重介绍一下一下几个步骤。


虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类)

 加载:加载主类


准备:为类变量分配内存并设置类变量初始值(0或NULL),如果有static final 变量(对象),准备阶段赋值 static变量(对象)。
类变量:static修饰的变量:O或NULL
static final变量:因为在定义的时候必须赋初始值,在准备阶段直接赋值。
实例变量:在对象实例化时随对象一起分配在堆中。

 

初始化:按顺序初始化变量和其他资源。


new关键字实例化对象;

读取或设置一个类变量(static修饰),调用类的静态方法。如果有static对象、static变量、static代码块 初始化;

如果有父类还没有初始化,需要先触发父类的初始化。

对类进行反射调用。

等等。

例如:

package test;

public class Test {
	Father father2 = new Father("普通成员Father2 构造函数");
	static {
		System.out.println("静态块执行");
	}
	{
		System.out.println("普通代码块执行");
	}
	static Father father1 = new Father("静态成员Father1 构造函数");
	
	Father father3 = new Father("普通成员Father3 构造函数");

	public Test(){
		System.out.println("Test类默认构造函数调用");
	}
	public static void main(String[] args) {
		System.out.println("第一个主类对象");
		Test test1 = new Test();
		
		System.out.println("第二个主类对象");
		Test test2 = new Test();
	}
}

class Father {
	public Father(String s) {
		System.out.println(s);
	}

	{
		System.out.println("******father init");
	}
	static {
		System.out.println("*******father static init");
	}
}

 执行结果:

静态块执行
*******father static init
******father init
静态成员Father1 构造函数
第一个主类对象
******father init
普通成员Father2 构造函数
普通代码块执行
******father init
普通成员Father3 构造函数
Test类默认构造函数调用
第二个主类对象
******father init
普通成员Father2 构造函数
普通代码块执行
******father init
普通成员Father3 构造函数
Test类默认构造函数调用

分析:

 1、执行main()方法的时候先加载主类Test并初始化。

初始化的时候,对主类的静态对象、静态变量、静态代码块初始化(按顺序)。所以Test类的静态代码块、静态对象father1被初始化。(输出1-4行)

其中,静态对象father1初始化的时候,需要对类Father加载并初始化。同样,Father类初始化的时候,对静态代码块初始化。在类的加载过程中,只有内部的变量创建完,才会去执行这个类的构造方法。所有的变量初始化完,才会执行构造方法。

最后调用构造函数。

2、Test test1 = new Test();(输出6-11行)

初始化Test类,静态成员和静态代码块只进行了一次初始化。

所以只初始化Test类的普通对象和普通代码块。

3、Test test2 = new Test();(输出13-18行)

注意:

1、类的静态成员和静态代码块在类加载中是最先进行初始化的,并且只进行一次。

2、执行顺序为:

  1. static静态代码块和静态成员
  2. 普通成员
  3. 构造函数执行

3、类加载检查:

JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类的加载过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品型管理页面,此页面提供给管理员的功能有:新增产品型,修改产品型,删除产品型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值