public class M { public static void main(String[] args) { N n = N.getInstence(); System.out.println("a = " + n.a); System.out.println("b = " + n.b); } } class N { public static int a; public static int b = 0; private static N n = new N(); private N() { a++; b++; } public static N getInstence() { return n; } }
上面的代码普遍都能知道答案,输出是:
a = 1 b = 1
如果把上面的N类里面的创建N的成员对象的时候调换位置,代码如下:
public class M { public static void main(String[] args) { N n = N.getInstence(); System.out.println("a = " + n.a); System.out.println("b = " + n.b); } } class N { private static N n = new N(); public static int a; public static int b = 0; private N() { a++; b++; } public static N getInstence() { return n; } }
现在输出的确不在是上面的结果,结果如下:
a = 1 b = 0
我们都知道类加载的时候首先加载的是静态代码,在第一个代码里面,当执行 N n = N.getInstence();的时候,java虚拟机会去加载N类,在加载N类的时候,按照顺序:
public static int a; public static int b = 0; private static N n = new N();
首先给静态变量分配内存空间,其次给静态变量赋予默认值然得到 a = 0;b = 0;n = null;然后显示初始化各静态变量,因为a没有显示赋初值,所以a = 0,而b显示赋初值为0,所以b = ,然后显示为n赋初值,在new N()的时候对a、b自增,得到 a = 1;b = 1;所以最终结果如上述。
在第二段代码里面,当执行 N n = N.getInstence();的时候,java虚拟机会去加载N类,在加载N类的时候,按照顺序:
private static N n = new N(); public static int a; public static int b = 0;
首先给静态变量分配内存空间,其次给静态变量赋予默认值,得到 n = null ;a = 0; b = 0;
然后显示初始化各静态变量,n为N对象,在new N()的时候对a、b自增,得到a = 1;b = 1;
因为a没有显示赋予初值,所以a还是为a = 1;而b显示赋予初值为0,所以b = 0;得到最终结果如上述。
所以得到最终的结论是,jvm在加载类的时候对静态代码按如下步骤处理:
1、当jvm在加载类的时候,首先是对各个静态变量分配空间。
2、对各个静态变量赋予默认值(比如int、long型的默认值为0,Object的默认值为null)。
3、对各个静态变量按顺序显示初始化(即按照代码里面的初始化为其初始化)。
相关推荐
原创一道Java笔试面试题考考大家!附带答案!
史上最全的android和java面试文档集。包括有: java程序员面试宝典.txt Java面试宝典2011版-1C,Java基础部分.doc... Java面试题及答案(基础题122道) - 在梦想与现实之间徘徊 - JavaEye技术网站.mht 等等,还有好多。
一道有趣的java笔试题.
企业公司软件测试面试笔试题集合 软件测试面试题 (测试基础).doc 01_企业面试试卷(综合).doc 01_企业面试试卷(综合)_参考答案.doc 04_企业面试试卷(测试基础).doc 04_企业面试试卷(测试基础)_参考答案.doc...
java面试题之行列转换 Oracle 和SQLServer两种方式 详细例子以及说明 一条语句实现,绝对看得懂! 方便理解!
北京宏景世纪软件股份有限公司Java笔试题
java程序员求职之前看这一套就够了。包括Java程序员阿里面经等,java求职必备知识点,简历模板,JAVA核心知识点整理,蓝桥杯java历年真题及答案整理(共129道题目及答案),Java面试突击-V3.0
【一线互联网大厂Java核心面试题库】Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等..
1、面试题 2、面试官心里分析 3、面试题剖析
java截取字符串,一道面试题。好像没有找到正确答案,今天找时间做了一个,仅供参考。本人运行过了。
注:本文是从众多面试者的面试经验中整理而来,其中不少是本人出的一些题目,网络资源众多,如有雷同,纯属巧合!...后期一系列的文章会不断的探讨这一个个经典的面试题,敬请期待!也欢迎大家在留言处补充和讨论!
本文给大家分享一道史上最难的一道Java面试题,非常不错,具有参考借鉴价值,需要的朋友参考下吧
笔试题,使你面试的成功率大大提高,好好学习,文档的收集,认真分析每一道题。
主要介绍了阿里的一道Java并发面试题详解,网络、并发相关的知识,相对其他一些编程知识点更难一些,主要是不好调试并且涉及内容太多 !,需要的朋友可以参考下
一套Java开发工程师笔试试题 (请不要在试题上留任何痕迹,所有答案均写在答题纸上) 包括了选择题、填空题、简答题、程序读写题 都有答案 最后一道简答题关于设计模式的题目见博客: ...
用java写一个函数判断字符串中"{"与"}"匹配? 提示:"{"与"}"必须同时出现,"{"必须在"}"前面,允许嵌套
计算机后端-Java-Java核心基础-第21章 常用类 09. String的一道面试题.avi
每天一道面试题,周五冲冲冲!List、Set、Queue和Map是Java集合框架中的四个主要接口,它们各自具有不同的特点和用途。 1. List(列表): - 允许重复元素。 - 具有按照元素插入顺序维护的有序集合。 - 可以通过索引...
3. 记一道字节跳动的算法面试题 4. 关于三次握手与四次挥手面试官想考我们什么?--- 不看后悔系列 5. 腾讯面试题:有了二叉查找树、平衡树为啥还需要红黑树? 6. 你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗...