java ClassLoader static
package init;
class Person {
private static Person person = new Person();
public static int count2 = 5;
public static int count1;
private Person() {
count1++;
count2++;
}
public static Person getInstance()
{
return person;
}
}
public class Testsingleton {
public static void main(String[] args) {
System.out.println("count1: " + Person.count1);
System.out.println("count2: " + Person.count2);
}
}
Output:
count1: 1
count2: 5
原因:
ClassLoader
类在执行之前会执行三个步骤:
1.类的加载:查找并加载类的二进制数据,把对应的class文件加载到内存
2.连接
2.1. 验证:确保被加载的类的正确性(主要防止恶心的class文件被加载)
2.2. 准备:为类的静态变量分配内存,并将其初始化为默认值
2.3. 解析:把类中的符合引用转换为直接引用
3.初始化:为类的静态变量赋予正确的初始值
发现其中步骤2.2和3提到了关键字静态变量,重点关注这两步,2.2的结果会导致为静态变量
person,count1,count2分配内存并赋值(默认值)
person=null;
count1=count2=0
到步骤3,初始化时会为静态变量赋予正确的值,那么什么时候才会进行初始化呢?
所有的java虚拟机实现必须在每一个类或接口被java程序“首次主动使用”时才初始化
java对类的使用方式分为:主动使用,被动使用
主动使用有六种:(除这6种外,其他都是被动使用)
1、创建类的实例
2、访问某个类或接口的静态变量或对该静态变量赋值
3、调用类的静态方法
4、反射
5、初始化类的子类
6、java虚拟机启动时被标注位启动类的类
即在执行main方法时会为静态变量赋值,如果有多个静态变量,按照自上而下的顺序(编译器会优化,与代码书写的顺序会不一致)
为person变量初始化时后count1=1;count2=1;
public static int count2 = 5;执行后,count2=5
验证:
package init;
class Person {
public static int count2 = 5;
private static Person person = new Person();
public static int count1;
private Person() {
count1++;
count2++;
}
public static Person getInstance()
{
return person;
}
}
public class Testsingleton {
public static void main(String[] args) {
System.out.println("count1: " + Person.count1);
System.out.println("count2: " + Person.count2);
}
}
Output:
count1: 1
count2: 6
http://longpo.iteye.com/blog/2217113
java ClassLoader static的更多相关文章
- [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib
转载自http://www.iteye.com/topic/98178 一.Java ClassLoader 1,什么是ClassLoader 与 C 或 C++ 编写的程序不同,Java 程序并 ...
- Java ClassLoader加载机制理解 实际例子
针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...
- Java ClassLoader加载机制理解
今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...
- Java ClassLoader详解(转载)
Java ClassLoader详解 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK ...
- Java关键字--static
在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variable ...
- Java中static的用法
static静态,作为修饰符,最初是由c引入,一开始static表示退出一个块后依然存在的局部变量.随后,static表示不能被其他文件访问的全局变量和函数.到了C++和java,static表示属于 ...
- Android(java)学习笔记106-1:深入分析Java ClassLoader原理
1. 前言: Android中的动态加载机制能更好的优化我们的应用,同时实现动态的更新,这就便于我们管理我们的应用,通过插件化来减轻我们的内存以及CPU消耗,在不发布新版本的情况下能更新某些模块. 当 ...
- Java之Static静态修饰符详解
Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...
- java中static关键字的作用
java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...
随机推荐
- DecimalFormat
public class TestDemo { public static void main(String[] args) { String format = new DecimalFormat(& ...
- zoj2760(最大流)
传送门:How Many Shortest Path 题意:给出n个点,和n*n的矩阵表示有向图.a[i][j]为-1表示i到j没有路径:不为-1则表示i到j的路径长度.给出一个vs和vt,要求vs到 ...
- 折扣&折让-看清实质的思考
折扣&折让 看清实质的思考 Author:zfive5(zidong) Email:zfive5@163.com 引子 有些东西,在没有人指点的情况,一时理解不了,就放一放,等到某一个契机到来 ...
- JavaScript 闭包环境非常奇特 - 相当于类与实例的关系?!
JavaScript 闭包环境非常奇特 - 相当于类与实例的关系?! 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一 ...
- zoj2059(经典dp)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1059 分析:dp[i][j]表示前i个石头组成两座塔高度差为j的较低 ...
- 自写jquery网页回到顶部效果,渐隐图标,引用js文件就可以
唔.进来开发需求,当网页内容草鸡多的时候,用户就须要有个button高速回到顶部,而不是自己去滚滑轮~ 原本以为比較难的说,由于上头要求所实用js来实现,哪个页面引用,哪个页面显示. 于是乎,本屌丝就 ...
- leetcode 之 Permutation Sequence
Permutation Sequence The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and ...
- ural1018(树形dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题意:给一棵边有权值的二叉树,节点编号为1-n,1是根节点 ...
- Max Sum (hdu 1003 简单DP水过)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- ASIHttpRequest 摘要
向server端上传数据 ASIFormDataRequest ,模拟 Form表单提交,其提交格式与 Header会自己主动识别. 没有文件:application/x-www-form-urlen ...