JAVA基础知识之JVM-——类初始化
我们通常说的类初始化,其实要分为三个阶段,类加载,连接,和初始化。他们大致完成以下功能。类加载将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框架息息相关,不可不学(我将通过一个系 ...
随机推荐
- java提高篇(九)-----详解匿名内部类
在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...
- 创建纯洁的TableViewCell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPat ...
- FB面经prepare: task schedule II
followup是tasks是无序的. 一开始是有序的,比如说1, 1, 2, 1,一定要先执行第一个task1,然后等task1恢复,再执行第2个task1,再执行task2..... follow ...
- [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java基础(7):二维数组初始化时需要注意的问题
二维数组可以先指定行,再指定列:但不能先指定列,再指定行 没有说明二维数组的行的个数,在定义二维数组时也可以只指定行的个数,然后再为每一行分别指定列的个数.如果每行的列数不同,则创建的是不规则的二维数 ...
- poj: 1207
好吧这题竟然还有先大后小的可能,能不这么恶心下吗.. #include <iostream> #include <stdio.h> #include <string.h& ...
- logstash5.x改变
5.x版本 logstash中 elasticsearch插件的workers,无法配置大于1,会提示 This plugin uses the shared and doesn't need thi ...
- oracle随机取数据
select * from (select rownum,KEYWORD, CATEGORY,CREATE_DATE,UPDATE_DATE from (select * from knet_keyw ...
- install chrome in elementary os
Elementary OS Freya 0.3.2 was officially out for public. As previous release, it comes pre-installed ...
- NOIP200505谁拿了最多的奖学金
NOIP200505谁拿了最多的奖学金 Description 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期 ...