文档章节

类初始化详解(1)

史文超
 史文超
发布于 2016/05/11 13:22
字数 833
阅读 12
收藏 0
public class Test {
	public static void main(String[] args) {
		Singleton s = Singleton.gets();
		System.out.println("count1:" + s.count1);
		System.out.println("count2:" + s.count2);
	}
}

class Singleton {
	private static Singleton singleton = new Singleton();
	public static int count1;
	public static int count2 = 0;

	private Singleton() {
		count1++;
		count2++;
	}

	public static Singleton gets() {
		return singleton;
	}
}

结果:

count1:1
count2:0

解:

我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。

在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。这些类型信息存储在方法区。
 

连接阶段又可以分为三个子步骤:验证、准备和解析。
验证就是要确保java类型数据格式 的正确性,并适于JVM使用。(不详细解释)
准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0 。在这个阶段,JVM可能还会为一些数据结构分配内存,目的 是提高运行程序的性能,比如说方法表。

因此上述代码jvm为Singleton类的金泰变量分配内存空间,并分别设置默认值:

private static Singleton singleton = null;
public static int count1=0;
public static int count2 = 0;

解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候 再去解析它。(不详细解释)


类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:
1.创建类的实例
2.调用类的静态方法
3.使用类的非常量静态字段
4.调用Java API中的某些反射方法
5.初始化某个类的子类
6.含有main()方法的类启动时

初始化一个类包括两个步骤:
1.如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类
2.如果类存在一个初始化方法,就执行此方法
注:初始化接口并不需要初始化它的父接口。
初始化顺序步骤:
1.静态成员变量首先初始化(注意,Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关)
2.普通成员初始化
3.执行构造函数。


因此综上所述
1.在main()方法所属的Test类首先会被初始化
2.Singleton s = Singleton.gets();调用了Singletion的静态方法gets(),将会使Singleton进行初始化
3.执行Singleton的初始化,此时按照初始化顺序步骤
 

   private static Singleton singleton = new Singleton();->执行Singleton构造函数-->count1=1;count2=1;
   public static int count1;-->count1未改变;
   public static int count2 = 0;-->count2由1变成0


4.输出count1和count2
 

 

© 著作权归作者所有

共有 人打赏支持
史文超
粉丝 0
博文 1
码字总数 833
作品 0
闵行
Android 自定义View实战系列 :时间轴

前言 开发中,时间轴的 需求非常常见,如下图: 本文将结合 自定义 & 的知识,手把手教你实现该常见 & 实用的自定义:时间轴 目录 目录 1. 知识储备 本文采用 自定义 & 实现时间轴,所以必须...

Carson_Ho
2017/06/10
0
0
JVM详解之类加载过程

JVM详解之类加载过程 什么叫类?类在什么时候进行加载?类加载过程发生了什么?或者叫jvm做了哪些工作? 类的概念(.java/.class的区别)和范围扩充 java语言和Java虚拟机的概念 java可以运行...

默默学习中
2016/04/15
575
0
Java虚拟机详解

面试必问关键词:JVM垃圾回收、类加载机制。 先把本文的目录画一个思维导图:(图的源文件在本文末尾) 一、Java引用的四种状态: 强引用:   用的最广。我们平时写代码时,new一个Object存...

白石MAI
2016/11/04
5
0
创建Servlet实例

已经完成了 Servlet 的解析工作,并且被包装成 StandardWrapper 添加在 Context 容器中,但它仍不能为我们工作,以为还未被实例化。下面将介绍 Servlet 对象是如何创建及初始化的。 1 创建 ...

芥末无疆sss
2017/12/14
0
0
iOS开发音频播放基础——AVAudioPlayer的应用

iOS音频开发——AVAudioPlayer应用 AVAudioPlayer是系统提供给我们的一个音频播放类,在AVFoundation框架下,通过它,我们可以实现一个功能强大的音乐播放器。首先,在项目中我们需要导入AVF...

珲少
2015/05/26
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
2
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
68
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部