我们通常说的类初始化,其实要分为三个阶段,类加载,连接,和初始化。他们大致完成以下功能。类加载将class文件载入内存,类连接进行内存分配,初始化进行变量赋值。
类的加载,连接和初始化
java.lang.Class
来自JAVA API的解释
Instances of the class Class represent classes and interfaces in a running Java application. Class
has no public constructor. Instead Class
objects are constructed automatically by the Java Virtual Machine as classes are loaded and by calls to the defineClass
method in the class loader.
Class类的实例代表正在执行的Java程序的类和接口,Class类没有public的构造函数, 每当有类被载入,或者在call处于加载器中的类方法时,JVM就会自动去构造Class类。
个人理解为,如果说一个类是一种对象的抽象的话,那么一个java.lang.Class类就是所有类的抽象,即抽象的抽象,那么所有类(而不是对象)本身就是java.lang.Class的一个实例。JAVA API中的定义是Class Class<T> (返回值和类名称一样!)在JAVA API中可以看到java.lang.Class定义了很多重要的方法可以返回类的属性,这里说的属性指的是这个类本身的性质,而不是说类中定义了什么变量或者方法。常用的态方法有,
public static Class<?> forName(String className) ——得到”className“类的Class实例,并初始化类”className“
这是非常典型的用法,注意这里的"Class实例"相对于java.lang.Class是一个实例,但是相对于我们常说的类和对象,其实这依然还是个类,要使用这个类,还需要创建对象(跟直接使用这个类创建对象还是有区别的)。这就是上面”抽象的抽象“的理解。
public Method[] getMethods() ——返回所有类拥有的public方法(包括继承来的以及来自接口的)的Method数组,可以通过数组元素调用invoke来执行这些方法
public T newInstance()——创建类的实例
类的加载
类的加载指的是将类的class文件载入内存,并为之创建一个java.lang.Class对象。可以从下面几种来源加载类,
- 本地文件系统
- JAR包
- 网络
- 把一个java文件动态编译,并执行加载。
类加载完成后,JVM就为其生成一个java.lang.Class对象,通过这个对象就可以操作类。
类的连接
所谓的连接,就是将类的二进制数据合并到JRE中, 连接阶段将会为变量分配内存以及设置默认初始值。
类初始化
类的初始化其实主要就是对变量初始化。变量初始化分两种,一种是声明变量时候就指定的初始值,另一种是静态初始化块。JVM都将按他们定义的顺序初始化。
如果变量所在类的类还有父类,则需要先初始化父类的变量,直到Object类。
类初始化的时机
- 创建类的实例,包括通过new创建,通过反射创建,通过反序列化创建
- 调用类的静态方法
- 访问类或接口的变量(静态变量)
- 通过反射方式强制创建类或接口的java.lang.Class对象。 例如Class.forName("Person")
- 初始化子类,其所有父类将被初始化
- 使用java.exe命令运行一个主类。
另外有如下特例,
- 对于final修饰的static变量,如果在编译期间就能确定值的,那么即使有别的类使用这个变量,也不会初始化这个类。 例如static final String a = "abc", 编译期间就知道值。
- 反之编译期间不能确定final类(static)变量的值,就会初始化这个类。例如 static final String a = System.currentTimeMillis() + "";
- ClassLoader类的loadClass()只是加载类,不初始化类。
JAVA基础知识之JVM-——类初始化的更多相关文章
-
JAVA基础知识之IO-File类
File类介绍 File是java.io包下面的一个类,代表与平台无关的文件或者目录.JAVA中,无论文件还是目录,都可以看作File类的一个对象.File类能对文件或目录新建,删除,获取属性等操作, ...
-
java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用
写的非常棒的一篇总结: http://blog.csdn.net/speedme/article/details/22398395#t1 下面主要看各个集合如何使用迭代器Iterator获取元素: 1 ...
-
java 基础知识学习 JVM虚拟机参数配置
1) 设置-Xms.-Xmx相等: 2) 设置NewSize.MaxNewSize相等: 3) 设置Heap size, PermGen space: Tomcat 的配置示例:修改%TOMCAT_H ...
-
第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
-
JAVA基础知识|java虚拟机(JVM)
一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...
-
java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
-
Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
-
JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
-
Java 基础知识总结
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
-
学习Spring必学的Java基础知识(1)----反射(转)
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
随机推荐
-
初学Hibernate持久化
hibernate三种持久化对象状态:(持久化对象:Persistent Object=POJO + hbm映射) 1.瞬时状态(临时状态或*态):PO对象刚创建(即new)开始进入瞬时状态,此时对 ...
-
C#不同页面之间通信的方法
以前做项目的时候经常头疼两个页面之间的交互(汗),这几天看的MVVM项目,忽然感觉好简单的!我自己写了个简单的demo 可以简单实现2个页面之间的交互,新人第一次发博客,不喜勿喷 代码很简单,注释我就 ...
-
python分布式抓取网页
呵呵,前两节好像和python没多大关系..这节完全是贴代码, 这是我第一次写python,很多地方比较乱,主要就看看逻辑流程吧. 对于编码格式确实搞得我头大..取下来页面不知道是什么编码,所以先找c ...
-
Android中的java层的线程暂停和恢复实现
/** * 基础线程对象. * * @author jevan * @version (1.0 at 2013-6-17) * @version (1.1 at 2013-7-2) 增加on ...
-
用Eclipse 搭建一个Maven Spring SpringMVC 项目
1: 先创建一个maven web 项目: 可以参照之前的文章: 用Maven 创建一个 简单的 JavaWeb 项目 创建好之后的目录是这样的; 2: 先配置maven 修改pom.xml & ...
- istio入门(05)istio的架构概念2
-
微信小程序——demo合集及简单的文档解读【五】
官方Demo https://github.com/wechat-miniprogram/miniprogram-demo 其他Demo https://www.cnblogs.com/ytkah/p ...
-
如何诊断windows性能问题
直接使用perfmon中的性能诊断工具
-
tips:解决bootstrap-switch 在jqgrid中动态加载不显示的问题
bootstrapo-switch 是一个十分好用的插件,用来关闭开启再好不过了,适合状态类型只有两种的情况下可以进行切换 在使用中,在jqgrid动态加载的时候出现不能加载的问题 原因是html代码 ...
-
DataGridView使用技巧十一:DataGridView用户输入时,单元格输入值的设定
通过DataGridView.CellParsing事件可以设定用户输入的值.下面的示例:当输入英文文本内容的时候,立即被改变为大写.DataGridView.CellParsing在离开编辑的单元格 ...