java 类的加载、连接和初始化
JVM和类
调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区。当系统出现以下几种情况时,JVM进程将被终止:
- 程序运行到最后正常结束;
- 程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序;
- 程序运行过程中遇到未捕获的异常或错误而结束;
- 程序所在的平台强制结束了JVM进程。
类的加载
当程序主动使用某个类时,如果该类还没有被加载到内存中,系统会通过加载、连接、初始化这三个步骤来对该类进行初始化(如果没有意外,JVM将会连续完成这三个步骤,所以有时也会把这三个步骤统称为类的加载或初始化)。
类的加载是指将类的class文件读入内存,并为之创建一个java.lang.Class对象(注意并不是目标类的对象)。也就是说当程序中使用任何类时都会为之创建一个java.lang.Class对象。
类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是Java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。
通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种数据来源:
- 从本地文件系统加载class文件;
- 从jar包中加载class文件;
- 通过网络加载class文件;
- 把一个Java源文件执行动态编译,并执行加载。
java通常无需等到“首次使用”该类时才加载该类,Java虚拟机允许系统预先加载某些类。
类的连接
当类被加载后,系统会为之生成一个对应的Class对象,接着就会进入类的连接阶段。
类的连接阶段负责把类的二进制数据合并到JRE中。类的连接又可以分为如下三个阶段:
- 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致;
- 准备:类的准备阶段则负责为类的静态属性分配内存,并设置默认初始值;
- 解析:将类的二进制数据中的符号引用替换成直接引用。(关于符号引用和直接引用我觉得这里说的非常明白)
类的初始化
在类的初始化阶段,虚拟机负责对类进行初始化,主要是对静态属性进行初始化。在java类中对静态属性进行初始化有两种方式:
- 声明静态属性时指定初始值;
- 使用静态初始化块为静态属性指定初始值。
进行初始化时,JVM会按语句在程序中的排列顺序依次执行初始化。如下面的代码,最终b的值为9。
package com.zhyea.test;
public class Test {
static{
b=6;
}
static int a = 0;
static int b = 9;
}
JVM对类进行初始化时包含如下步骤:
- 假如这个类还没有被加载和连接,程序先执行加载并连接这个类;
- 假如该类的直接父类还没有被初始化,则先初始化其直接父类;
- 假如类中有初始化语句,则系统依次执行这些初始化语句。
根据如上步骤可以看出来,当程序主动使用任何一个类时,系统会保证该类以及所有父类都会被初始化。
类初始化的时间
系统开始初始化类或接口的时间包括一下6种情况:
- 创建类的实例;
- 调用某个类的静态方法;
- 访问某个类或接口的静态属性,或为该静态属性赋值;
- 通过反射方式来创建某个类或接口对应的java.lang.Class对象,如使用Class.forName(“Person”);
- 初始化某个类的子类。初始化子类时,所有的父类都会被初始化;
- 直接使用java命令来运行某个类时。
需要一提的是final修饰的静态属性,如final修饰的静态属性在编译时就得到了属性值,那么该静态属性就会被当作常量不会被初始化(类的编译做了哪些事情呢,这里需要考虑下)。如下面这种情况:
final static int MON = 1;
final修饰的静态属性未能在编译时得到属性值,那么就会被初始化,如下面这种情况:
final static int TUE = 1+1;
还值得一提的就是ClassLoader的loadClass方法并不会执行类的初始化,而是只执行了类的加载。
java 类的加载、连接和初始化的更多相关文章
- JAVA类的加载、连接与初始化
JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...
- java类从加载、连接到初始化过程
类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JV ...
- Java类的加载、链接和初始化
一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样 ...
- java 类的加载,链接,初始化
本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码 ...
- Java类的加载 链接 初始化
原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够 ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- JVM(1):Java 类的加载机制
原文出处: 纯洁的微笑 java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang. ...
- Java类的加载过程-重点!!
java类的加载过程有以下几步共同完成: 加载->连接->初始化.连接又分为验证.准备.解析 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以 ...
- 【Java基础】Java类的加载和对象创建流程的详细分析
相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...
随机推荐
- 【Double】double精度问题和int、long除不尽取舍问题
看了老半天,真心没搞懂,留下几篇文章,后面继续跟进吧.... 一.如何理解double精度丢失问题? - 知乎 https://www.zhihu.com/question/42024389/answ ...
- jquery刷新页面指定部位
做好好几次了,经常忘记格式,这次记下来 $("#baseInfo").load("/KnowledgeLib/Personalization/QuestionUpdate ...
- mysql_系统数据库认识
show databases:查看mysql自带数据库有information_schema,mysql, performance_schema, test information_schema数据库 ...
- VC的CListCtrl控件
1. CListCtrl 样式及设置 2. 扩展样式设置 3. 数据插入 4. 一直选中Item 5. 选中和取消选中Item 6. 得到CListCtrl中所有行的checkbox的状态 7. 得到 ...
- z waiting to receive.**B0100000023be50
[root@b ~]# rz▒z waiting to receive.**B0100000023be50
- Tomcat 服务器介绍
Tomcat 目录介绍 Tomcat 主目录有 bin, conf, lib, logs, temp, webapps, work 7个文件夹 bin 目录 主要用来存放 tomcat 命令 .sh ...
- js身份证号有效性验证
1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用户名和身份证号就可以实名 ...
- Android图片加载框架Picasso最全使用教程2
前言 前面我们已经介绍了Picasso的基本用法及如何将一张图片加载到ImageView中,下面我们就利用Picasso在ListView中加载图片;Let’s Go! 一个ListView的简单应用 ...
- @ControllerAdvice 拦截异常并统一处理(转载)
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...
- SQL2000查看表的大小
SQL2000查看表的大小 标签: sqlsql server数据库报表tableinsert 2011-06-08 11:47 4013人阅读 评论(0) 收藏 举报 SQL2000查看表的大小 本 ...