为什么具有未初始化成员变量的类在java中可编译?

时间:2014-02-15 20:13:40

标签: java variables initialization

在测试中询问了这个问题。我想知道你对它的看法。

私有方法中使用的未初始化的本地成员变量(例如b)。

“为什么可以编辑?”

编辑:

class Class
{
    private int a=0; // this is an initialized member variable and I knew already that c# & java initializes all variables but that was NOT the question.
    private int b; // to me this is an uninitialized member variable
    private void Method()
    {
        b++; //no compiler error here in java. and the question was why is that so?
    }
}

我不知道成员变量在java中被称为属性。我对你对我发现的奇怪问题的看法更感兴趣。当然编译器设计者决定这样做,但问题是为什么可编辑?我认为老师质疑的理由。但我不再质疑教师奇怪的问题了。无论如何,谢谢你的答案。

3 个答案:

答案 0 :(得分:2)

“成员”是一个在C ++中更常用的术语,但可能在这里指的是实例变量。答案是:因为实例变量根据Java语言规范(http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5)具有默认值。 (与具有默认值的局部变量相比)

答案 1 :(得分:1)

我假设通过本地成员变量,你的意思是属性?

即使没有初始化,它也有明确定义的语义。对象将初始化为null,数字为0,布尔值为false

使用未分配的变量是否是一个好的做法是有争议的。从语言的角度来看,至少你没有未定义的行为。

答案 2 :(得分:0)

未初始化的变量是“兼容的”,因为规范允许它并且它是必要的,因为某些情况需要它。例如,考虑一个try..catch块,其中try catch中的变量必须在块外部使用。

    BufferedReader br = null;

        try {

            String sCurrentLine;

            br = new BufferedReader(new FileReader("C:\\testing.txt"));

            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println(sCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
//Do something with br