Java中未初始化的变量和成员

Yuv*_*dam 28 java oop variables

考虑一下:

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"
    }

}
Run Code Online (Sandbox Code Playgroud)

我不明白."b"永远不会被初始化,但会产生与"c"相同的运行时错误,这是一个编译时错误.为什么局部变量和成员之间存在差异?

编辑:让会员私密是我最初的意图,问题仍然存在......

jco*_*der 44

语言以这种方式定义它.

对象类型的实例变量默认为初始化为null.默认情况下,对象类型的局部变量未初始化,访问未定义变量是编译时错误.

请参阅此处的第4.5.5节 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5


Yuv*_*val 23

这是交易.你打电话的时候

TestClass tc = new TestClass();
Run Code Online (Sandbox Code Playgroud)

new命令执行四个重要任务:

  1. 在堆上为新对象分配内存.
  2. 将类字段启动为其默认值(数字为0,布尔值为false,对象为null).
  3. 调用构造函数(可能会重新启动字段,也可能不会).
  4. 返回对新对象的引用.

所以你的字段'a'和'b'都被启动null,并且'a'在构造函数中重新启动.此过程与方法调用无关,因此永远不会初始化局部变量"c" .

HTH

PS:对于严重的失眠者,请阅读此内容.


Tom*_*ine 13

明确分配的规则非常困难(阅读JLS第3版第16章).在字段上强制执行明确的赋值是不切实际的.就目前而言,甚至可以在初始化之前观察最终字段.

  • "甚至可以在初始化之前观察最终的字段." - 你介意再解释一下吗?谢谢 (5认同)