在测试中询问了这个问题。我想知道你对它的看法。
私有方法中使用的未初始化的本地成员变量(例如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中被称为属性。我对你对我发现的奇怪问题的看法更感兴趣。当然编译器设计者决定这样做,但问题是为什么可编辑?我认为老师质疑的理由。但我不再质疑教师奇怪的问题了。无论如何,谢谢你的答案。
答案 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