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继承与方法重写的相关笔试面试题。题目涉及到了Java类的继承、方法重写、实例化对象时的调用顺序以及对象多态性等知识点。接下来,我们将对这些知识点进行详细的...
根据给定的文件内容,我们可以总结出一系列与Java面试相关的知识点。下面将详细解析每一道题目涉及的关键概念。 ### 第一部分:基础知识 #### 1. final, finally, finalize的区别 - **final**: 用于声明变量、方法...
"阿里软件JAVA笔试题" 阿里软件JAVA笔试题是阿里巴巴公司为招聘软件开发工程师所设计的一份笔试题目,涵盖了JAVA语言、数据结构、算法、设计模式、数据库等多方面的知识点。 本题目共有15道题目,涵盖了以下几个...
史上最全的android和java面试文档集。包括有: java程序员面试宝典.txt Java面试宝典2011版-1C,Java基础部分.doc... Java面试题及答案(基础题122道) - 在梦想与现实之间徘徊 - JavaEye技术网站.mht 等等,还有好多。
这是一道经典的Java面试题。解决这个问题需要了解Java的内存管理机制,包括FULL GC的触发条件、Perm Gen的设置、System.gc()方法的调用等。 Java集合框架 3. Java集合框架是Java语言中的一种重要概念,它提供了...
企业公司软件测试面试笔试题集合 软件测试面试题 (测试基础).doc 01_企业面试试卷(综合).doc 01_企业面试试卷(综合)_参考答案.doc 04_企业面试试卷(测试基础).doc 04_企业面试试卷(测试基础)_参考答案.doc...
"100家大公司Java笔试题汇总.doc"这份文档提供了丰富的实践材料,建议考生们深入研究每一道题,不仅要找出正确答案,还要理解背后的原理,这样才能在真正的笔试中游刃有余,成功叩开心仪企业的门扉。同时,通过反复...
Java经典笔试题主要涵盖了许多Java基础知识,包括面向对象、异常处理、类与对象、继承、接口、数组、字符串以及Swing组件等。以下是对题目及其涉及知识点的详细解析: 1. 第一道题考察了方法的重写和覆盖。类B继承...
### 常见的Java上机面试题:深入解析与实战指南 在IT行业的求职过程中,尤其是对于软件工程师或开发者而言,上机编程面试成为了一道必经的门槛。这种形式的面试旨在全面评估应聘者的技术能力,不仅考察理论知识的...
Java面试题涵盖了许多核心知识点,包括基础技术、项目经验、逻辑推理和SQL查询。下面将对这些方面进行详细的解析。 1. **基础技术题** - **UML图**:UML(统一建模语言)有多种图表,包括类图、对象图、用例图、...
标题中的“答复: 一道经典线程面试题的4种解法”暗示了这是一个关于多线程编程的问题,通常在面试中出现,用于评估候选人的并发处理能力。在这个问题中,可能涉及到同步、线程安全、锁机制等关键概念。 在Java中,...
【Java经典笔试题详解】 Java作为一门广泛应用的编程语言,其笔试题目往往涵盖了语言特性、设计模式、数据结构与算法、面向对象编程、框架及软件工程等多个方面。以下是对一些常见笔试题目的详细解答: 1. **设计...
java程序员求职之前看这一套就够了。包括Java程序员阿里面经等,java求职必备知识点,简历模板,JAVA核心知识点整理,蓝桥杯java历年真题及答案整理(共129道题目及答案),Java面试突击-V3.0
"java面试题_leetcode题解之第31题下一个排列" 的描述进一步确认了这是关于Java面试中的一道算法题目的解答,主要关注如何找到一个排列的下一个排列。在面试中,这样的问题通常用来评估候选人在处理数组操作和算法...
### Java面试题:行列转换详解 #### 一、问题背景 在进行数据分析或者报表处理时,经常需要将数据从一种格式转换成另一种格式以便更好地展示或分析。其中一种常见的转换需求是从行转列(即行列转换)。本篇文章将...
### Java经典笔试题详解 #### 一、填空题解析 1. **面向对象的语言具有__继承性__、__封装性__、__多态性__。** - **继承性**:指一个类可以从另一个类派生出来,派生出来的类可以继承父类的属性和方法,并且可以...
JAVA面试题选择原则 - **筛选标准**:为了提高复习效率,本面试题集筛选掉了那些过时或者出现频率极低的问题,确保每一道题目都有实际的价值。 - **回答策略**:建议的答题方法包括三个方面:首先阐述基础知识,...
【一线互联网大厂Java核心面试题库】Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等..