考虑一下:
public class TestClass { private String a; private String b; public TestClass() { a = "initialized"; } public void doSomething() { String c; a.notify(); // This is fine b.notify(); // This is fine - but will end in an exception c.notify(); // "Local variable c may not have been initialised" } }
我不明白."b"永远不会被初始化,但会产生与"c"相同的运行时错误,这是一个编译时错误.为什么局部变量和成员之间存在差异?
编辑:让会员私密是我最初的意图,问题仍然存在......
语言以这种方式定义它.
对象类型的实例变量默认为初始化为null.默认情况下,对象类型的局部变量未初始化,访问未定义变量是编译时错误.
请参阅此处的第4.5.5节 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5
这是交易.你打电话的时候
TestClass tc = new TestClass();
该new
命令执行四个重要任务:
在堆上为新对象分配内存.
将类字段启动为其默认值(数字为0,布尔值为false
,对象为null
).
调用构造函数(可能会重新启动字段,也可能不会).
返回对新对象的引用.
所以你的字段'a'和'b'都被启动null
,并且'a'在构造函数中重新启动.此过程与方法调用无关,因此永远不会初始化局部变量"c" .
HTH
PS:对于严重的失眠者,请阅读此内容.
明确分配的规则非常困难(阅读JLS第3版第16章).在字段上强制执行明确的赋值是不切实际的.就目前而言,甚至可以在初始化之前观察最终字段.