我们通常说的类初始化,其实要分为三个阶段,类加载,连接,和初始化。他们大致完成以下功能。类加载将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. 在自定义的UINavigationController中设置背景图片

    //这个方法中设置 + (void)initialize { UINavigationBar *bar = [UINavigationBar appearance]; [bar setBackgrou ...

  2. Codeforce Round #227 Div2

    这回的看错时间了! 发现理论可以涨分的- -

  3. 简单分组背包ACboy needs your help(hdu1712)

    题意:有n个任务,完成期限是m天,a[i][j]代表第i个任务用j天完成可以获得的利益,问在这m天里面可以获得的最大利益,每次只能做一个任务,即多个任务不能同时做; 分析;用dp[i][j]代表在做第 ...

  4. HDU 3691 Nubulsa Expo(全局最小割Stoer-Wagner算法)

    Problem Description You may not hear about Nubulsa, an island country on the Pacific Ocean. Nubulsa ...

  5. Tomcat8.5

    说明:Tomcat服务器上一个符合J2EE标准的Web服务器,在tomcat中无法运行EJB程序,如果要运行可以选择能够运行EJB程序的容器WebLogic,WebSphere,Jboss等Tomca ...

  6. IIS7.5解决应用程序池回收假死问题

    使用windows server 2008 r2解决回收假死的问题. 具体做法是: 打开应用程序池 -> 高级设置 ->在“禁止重叠回收”里选择“true”,这样就有效避免了应用程序池回收 ...

  7. 夺命雷公狗---node.js---17之项目的构建在node+express+mongo的博客项目2之一,二级路由

    然后我们就来开始搭建后台了... 不过后台我们可以来玩玩他的二级路由... 然后再去修改下他们的样式即可......修改方法和刚才那里的修改方法一样, 访问效果如下所示: OK,已经正常相识了

  8. 夺命雷公狗—angularjs—16—angularjs里面的缓存

    强大的angularjs也给我们预留了一套他的缓存机智,这样在某个程度上来说还是可以做到减轻一点服务器压力的.... <!DOCTYPE html> <html lang=" ...

  9. 夺命雷公狗---DEDECMS----1dedecms的安装过程

    我们这次要玩的dedecms(cms也就是内容管理系统),电商网.或者政府网..小说网.新闻网之类的都是基于可以用cms来实现的. 现在在市场上主流的cms系统有dedecms(织梦),帝国cms,p ...

  10. Deep Learning 深度学习 学习教程网站集锦(转)

    http://blog.sciencenet.cn/blog-517721-852551.html 学习笔记:深度学习是机器学习的突破 2006-2007年,加拿大多伦多大学教授.机器学习领域的泰斗G ...