2011-04-19 58 views
7

“与程序员负责初始化的方法的本地变量相比,Java语言自动初始化对象的字段。如果您知道关于程序内和程序间数据流分析的知识,请解释语言设计人员为什么可能做出的这些设计选择。“Java语言自动初始化对象字段的具体原因是什么?

它对我来说很明显,它可以防止一个bug。但是,那个bug究竟是什么? 是否会浓缩某些给定方法的可能控制流?

有人可以在这个更详细的?我真的很感激帮助。

+1

所以,你希望我们为你回答你的作业问题吗? – 2011-04-19 19:24:38

+0

哈哈,是的。对我感到羞耻吗?对不起,如果我只是故意滥用这个网站。 – VitaminYes 2011-04-19 19:32:51

+3

幸运的是这个问题很有趣,所以没有人在意= P – Claudiu 2011-04-19 19:33:32

回答

3

做内部程序数据流真的很容易,所以很容易检查一个字段是否已经初始化,如果没有的话可以给出警告(可以写一个简单的可判断算法,例如确保所有的分支一个if初始化一个变量,并且如果一个分支没有,失败,即使分支不可达)。

这真的很难做的过程间的数据流,所以真的很难检查对象的字段是否具有曾经代码初始化任何地方(您快速进入不可判定境内任何合理的近似)。

因此,Java会处理前者,并在检测到未初始化的局部变量时发出编译时错误,但不会执行后者并将对象的字段初始化为其默认值。

1

它们并不总是被初始化。通过结合使用反射和sun.misc.Unsafe或ObjectInputStream类来访问这些类私有本地方法或直接通过JNI,可以实例化对象而无需调用任何构造函数。这些旨在用于对象序列化/反序列化的目的,并期望字段由解串器填充。至于为什么设计人员会选择消除对这些方法的直接访问(即没有反射),这意味着仍然留在内存中的指针可用于堆栈粉碎或返回到lib-c攻击。清除为大多数程序“自动”分配的内存可降低安全风险并减少出错的几率。还要注意,试图读取未初始化的局部变量会导致编译错误,原因很多,原因很相似