`
Rejoy
  • 浏览: 205213 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

再论Java的构造方法

    博客分类:
  • java
 
阅读更多

在OOP语言中,都会有构造方法这个概念,它的主要作用就是用于创建一个类的实例,并为这个实例的成员变量赋值。虽然它是一个好像很简单的东西,但是好像还有很多人对它的理解还不是很透彻,往往在面试中就会搞一些比较2B的题目来考大家。

写这个主题主要是因为在自己的代码中出现了问题,在XStream中,它在实例化的时候是不会调用类的默认方法的,后面自己去跟了一下XStream的源码才发现,它是用了Unsafe中的allocateInstance方法来实例化的,而这个方法是不会去调用构造方法的,导致了Map cache = new HashMap();这个cache成员变量没有被赋值,最后用的时候就出现了NullPointerExption。

我猜这XStream是肯定没有调用类的默认构造方法,不然不可能会null的,结果就跟其他两个同事讨论起构造方法的事来,他们都说成员变量的赋值都是在构造方法之前执行的,而我说成员变量的初始化是在构造方法里面执行的。在论证这个之前,我们先来看一个比较误导人的命题:“当一个类没有定义任何构造方法时,编译器会生成一个什么都不做的默认构造方法”,我拿这个问题问了以前的同事,他竟然说这是对的,这段话好像在很多教材里面都会出现。这句话里的一半是对的,至于哪里错了,我们就要用事实来说话了。

先上一段简单的代码:

public class Test {

	int a = 100;

}

 

这段代码只有简单的三行代码,但是却已经可以证明上面那句话的问题了。首先这个类里面是没有任何构造方法的,为了证明上面那句话是有一半错误的,我们需要看编译器为我们生成了些什么东西。在这里我们需要用到javap命令,这个命令能为我们的class文件转成对应的字节码指令。

 

在这里我们看到,编译器确实帮我们生成了一个默认的构造方法,但是它是什么都不做的默认构造方法么?明显不是,生成好几行的字节码指令。那么,我们现在来看一下这些生成的字节码指令都做了些什么事,首先会将this压入栈中,接着调用父类的构造方法,最后为成员变量赋值。现在我们就可以得出两个结论了:1、编译器为我们生成的默认构造方法并不是什么都不做的”懒人“;2、类中的成员变量的赋值是放到构造方法中去的,而并不是在构造方法之前执行的。相当于生成了以下的代码:

 

public class Test {

	int a;
	
	Test()
	{
		super(); // 首先去调用父类的构造方法
		a = 100; // 为成员变量赋值
	}

}

    再来看一下构造方法里面的代码和成员变量赋值的顺序,再来一段简单的代码:

public class Test {

	int a = 100;
	
	int b = 200;

	Test() {
		int e = 300;
		int f = 400;
	}
	
	int c = 500;
	
	int d = 600;
}

 

   看了这段简单的代码后,大家先花几秒钟的时间来猜一下它们的执行顺序是怎么样的大笑

   国际惯例,我们用javap命令来看一下它生成的字节码指令(javap真是一个好用的东西啊,哈哈)

    看了这图之后,相信大家都已经知道答案了吧。相当于生成了以下的代码:

public class Test {

	int a;
	
	int b;

	Test() {
		a = 100;
		b = 200;
		c = 500;
		d = 600;
		int e = 300;
		int f = 400;
	}
	
	int c;
	
	int d;
}

 

   哈哈,我就不多费口舌了。希望这篇博客能帮到大家。

 

0
0
分享到:
评论

相关推荐

    Java构造方法解析.pdf

    Java构造方法解析.pdf

    一种基于UML关系的Java代码库构造方法.pdf

    一种基于UML关系的Java代码库构造方法.pdf

    Java语言程序设计教学中构造方法的研究.pdf

    Java语言程序设计教学中构造方法的研究.pdf

    java课程设计论文

    4、构造Point类表示某一格子的坐标,并实现set和get方法对x、y坐标修改和读取; 5、构造Stack类来实现一个栈,利用java中的LinkedList实现,并实现栈的 pop() , push() , isEmpty() 等基本操作; 6、Chess类是含main...

    基于Java的坦克大战游戏的设计与实现设计软件程序源码+word毕业论文文档.zip

    Graphics()方法构造了一个新的 Graphics 对象, 由于 Graphics类是抽象类,因此Graphics()方法不可以被直接调用,此构造方法是图形上下文的默认构造方法,通过在组件上调用 getGraphics() 来创建图形上下文,...

    基于JAVA毕业设计-JAVA Smart系统-题库及试卷管理模块的设计与开发(源代码+论文).rar

    论文首先阐述了题库管理及试卷管理系统的详细需求分析、数据库的合理设计以及系统设计原理,给出了计算机管理环境下的题型分类、试卷生成的方法,并从科学、实用的角度构造系统功能模块,包括试题录入、题库维护、...

    java Smart系统-题库及试卷管理模块的设计与开发(源代码+论文)

    论文首先阐述了题库管理及试卷管理系统的详细需求分析、数据库的合理设计以及系统设计原理,给出了计算机管理环境下的题型分类、试卷生成的方法,并从科学、实用的角度构造系统功能模块,包括试题录入、题库维护、...

    java深入解析

    103 话题18 一成不变——不可修改的String对象 107 话题19 钩深索隐——String字符最大长度的探索 111 话题20 追本溯源——追寻String字面常量的“极限” 116 话题21 旧调重弹——再论equals方法与“==”的 区别 ...

    p计算机毕业设计 - java Smart系统-题库及试卷管理模块的设计与开发(源代码+论文),保证可靠运行,提供示范论文可参考

    论文首先阐述了题库管理及试卷管理系统的详细需求分析、数据库的合理设计以及系统设计原理,给出了计算机管理环境下的题型分类、试卷生成的方法,并从科学、实用的角度构造系统功能模块,包括试题录入、题库维护、...

    Java开发技术大全 电子版

    3.7.4再论静态成员变量137 3.8main()方法和命令行参数139 3.9结束方法141 3.10本地方法141 3.11本章小结144 第4章继承与多态145 4.1继承的基本原理145 4.2子类对父类的继承146 4.3属性隐藏和方法的覆盖148 ...

    构造正则表达式的简化DFA算法

    方法是首先构造与正则表达式等价的非确定有限自动机(NFA) , 这里省略了构 造带E动作的有限自动机的操作, 然后用状态树构造与该NFA 等价的简化DFA. 这 个算法在计算机上已实现, 并且对输入的任意正则表达式, 都可以...

    Java-打飞机程序设计及论文

    这个简单的打飞机游戏程序使用Java语言和Swing库来实现。它具有基本的图形用户界面,让玩家能够通过键盘控制飞机的移动。 在这个程序中,我们使用了一个继承自JFrame的FlyingGame类,该类表示整个游戏窗口。在构造...

    JAVA3D的网络三维技术的设计与实现(源代码+论文+说明).zip

    实现JAVA3D结构体系的方法 §3.1 总体设计 设计思想是:以JAVA3D为平台,使用JBuilder编译器,生成一个三维小场景,实现简单实体建模,物体运动,场景移动,各种灯光,雾等场景变换操作以及更换背景图片增加背景音乐...

    基于JAVA SMART系统-系统框架设计与开发(源代码+论文).zip

    在大部分采用B/S结构的web应用中,用户与系统的交互都是要涉及到相应的交互数据、业务逻辑,因此在本系统的框架设计中考虑到将这些交互中涉及到的因素全部封装到一个Carrier类中,再通过一个单例类来实现表现层与...

    JAVA程序设计教程

    §1.2 程序设计方法与语言 ..............................................................................................5 1.2.1 早期的程序设计 ........................................................

    Bent函数的一种递归构造方法 (2005年)

    文章首先研究了Bent函数特征矩阵的性质,并给出了Bent函数的一个等价判别条件,从而引出了Bent函数的一种新的构造方法:由一个已知的n(n≥2)元Bent函数的特征矩阵来构造n+2元.Bent函数的特征矩阵,为Bent函数的...

    数字签名标准DSS的研究与实现 论文

    5.2.4 利用SHA-1构造任意长度随机数的Java实现 34 5.3 DSA其他参数产生算法的Java实现 35 5.3.1 生成DSA的g算法的Java实现 35 5.3.2 计算 算法的Java实现 36 5.3.3 生成DSA公钥的Java实现 36 5.3.4 求模幂 的Java...

    JAVA实现贪吃蛇游戏毕业设计(源代码+论文)

    通过该类的构造函数,实现游戏初始化,图片和音乐的加载。 在该类中通过方法paintComponent(Graphics g)来调用该类中的所有paint方法,进行绘图。 在该类中通过方法keyPressed(KeyEvent e)来调用该类中的所有...

    论文研究-移动机器人Java Agent控制系统设计.pdf

    选用高适用度的软件工程知识,能够为软件项目开发构造坚实的实施基础。情形是软件工程知识得以共享和复用的重要基础。然而,一方面,当前软件工程知识复用涉及众多实际情形因素;另一方面软件工程知识已经呈现出丰富...

Global site tag (gtag.js) - Google Analytics