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 ...
随机推荐
- OCP读书笔记(15) - 管理SQL性能调优
SQL Tuning Advisor(STA): 使用oracle提供的程序包进行sql优化 SQL> conn scott/tiger SQL), name )); SQL> inser ...
- [置顶] 如何在Python IDLE中调试Python代码?
好久没有用Python了,居然忘记了怎么在Python IDLE中调试Python代码.百度了一下,然后还是写下来吧,以免以后又忘记了. 1. Set break point in the sourc ...
- oracle 之 内存—鞭辟近里(二)
overview of the pga pga是在操作系统的进程或是线程特定的一块内存区域,它不是共享的.因为pga是进程指定的,因此它不会在sga中分配. pga是一个内存堆,其中包含了被专用服务器 ...
- POJ 2151 Check the difficulty of problems (动态规划-可能DP)
Check the difficulty of problems Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4522 ...
- POJ 3589 Number-guessing Game(简单题)
[题目简述]:两个四位数,假设后一个数中的某个数与前一个相应的数的位置和值都相等.则统计数目由几个这种数.记为count1吧. 假设后一个数中的某个数与前一个数的数值相等,但位置不同. 此时这种数的个 ...
- xml(3)--dom4j实现crud操作
1.XML解析技术概述 (1)XML解析方式分为两种:dom和sax dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种标准方 ...
- codeforces#253 D - Andrey and Problem里的数学知识
这道题是这种,给主人公一堆事件的成功概率,他仅仅想恰好成功一件. 于是,问题来了,他要选择哪些事件去做,才干使他的想法实现的概率最大. 我的第一个想法是枚举,枚举的话我想到用dfs,但是认为太麻烦. ...
- 利用Nginx构建负载均衡server
大家都知道.一个域名相应一个IP地址,而一个WebSite则相应一个IP地址上相应port服务的应用程序(或位置).而大型站点的并发訪问量很大,这些站点是怎样在一台Webserver上实现负载均衡的呢 ...
- php将中文插入数据库出现乱码
通过php向mysql数据库插入数据,然后在数据库中查看的时候全是乱码(中文),但是取出之后放在页面上仍然正常.就是通过数据库查看的时候全是乱码不能阅读. mysql以UTF-8编码来保存中文,页面提 ...
- U7Linux文件与目录管理
1. .:代表当前层目录. ..:代表上一层目录. -:代表前一个工作目录. ~:代表目前用户所在的主文件夹. ~account:代表account这个用户的主文件夹. 2.pwd:显示当前目录. p ...