当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Java中未初始化的变量和成员》经验,为你挑选了3个好方法。

考虑一下:

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"相同的运行时错误,这是一个编译时错误.为什么局部变量和成员之间存在差异?

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



1> jcoder..:

语言以这种方式定义它.

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

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



2> Yuval..:

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

TestClass tc = new TestClass();

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

    在堆上为新对象分配内存.

    将类字段启动为其默认值(数字为0,布尔值为false,对象为null).

    调用构造函数(可能会重新启动字段,也可能不会).

    返回对新对象的引用.

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

HTH

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



3> Tom Hawtin -..:

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


"甚至可以在初始化之前观察最终的字段." - 你介意再解释一下吗?谢谢
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有