我们通常说的类初始化,其实要分为三个阶段,类加载,连接,和初始化。他们大致完成以下功能。类加载将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-——类初始化的更多相关文章

  1. JAVA基础知识之IO-File类

    File类介绍 File是java.io包下面的一个类,代表与平台无关的文件或者目录.JAVA中,无论文件还是目录,都可以看作File类的一个对象.File类能对文件或目录新建,删除,获取属性等操作, ...

  2. java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用

    写的非常棒的一篇总结: http://blog.csdn.net/speedme/article/details/22398395#t1 下面主要看各个集合如何使用迭代器Iterator获取元素: 1 ...

  3. java 基础知识学习 JVM虚拟机参数配置

    1) 设置-Xms.-Xmx相等: 2) 设置NewSize.MaxNewSize相等: 3) 设置Heap size, PermGen space: Tomcat 的配置示例:修改%TOMCAT_H ...

  4. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  5. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  6. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  7. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  8. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  9. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  10. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

随机推荐

  1. Java数组(初学者必看)

    数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同.但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构.尽管Java提供了 ...

  2. JavaScript----插入视频

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 转:python webdriver API 之鼠标事件

    前面例子中我们已经学习到可以用 click()来模拟鼠标的单击操作,而我们在实际的 web 产品测试中 发现,有关鼠标的操作,不单单只有单击,有时候还要和到右击,双击,拖动等操作,这些操作包含在Act ...

  4. CentOS 7 自动更新时间日期

    # ntpdate time.nist.gov 或 # rdate -s time.nist.gov 下列服务器可用 time-nw.nist.gov

  5. Python学习总结15:时间模块datetime & time & calendar (二)

    二 .datetime模块  1. datetime中常量 1)datetime.MINYEAR,表示datetime所能表示的最小年份,MINYEAR = 1. 2)datetime.MAXYEAR ...

  6. Android so lib库远程http下载和动态注册

    一.背景 在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过 ...

  7. JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面

    将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...

  8. struts_19_对Action中所有方法、某一个方法进行输入校验(手工编写代码实现输入校验)

    对所有方法进行校验1.通过手工编写代码的形式实现 需求:用户名:不能为空手机号:不能为空,并且要符合手机号的格式1,3/5/8,后面是9个数字 第01步:导包 第02步:配置web.xml <? ...

  9. linux挂接U盘

    挂接U盘fdisk -lDisk /dev/sdd: 131 MB, 131072000 bytes/dev/sdd1 * 1 889 127983+ b Win95 FAT32#mkdir -p / ...

  10. 夺命雷公狗---Thinkphp----4之数据表的设计

    我们这次来写的项目是仿http://yispace.net/39765.html而写的, 这里其实也就那回事,主要有标题和内容,和栏目, 文章页就更加的简单,其实也就那及格字段即可,我们分享得出的结果 ...