为什么带有未初始化成员变量的类可以在java中编译?
这个问题是在一次测验中提出的。我想知道你是怎么想的
私有方法中使用的未初始化的局部成员变量(如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中称为属性。我更感兴趣的是你对这个问题的看法,我觉得这个问题很奇怪。当然,编译器设计者决定这样做,但问题是为什么这是可编译的?我想老师在质疑这个理由。但我不再问老师奇怪的问题。无论如何,谢谢你的回答
# 1 楼答案
我假设通过局部成员变量,你是指属性
即使没有初始化,它也有明确定义的语义。对象将被初始化为
null
,数字将被初始化为0,布尔值将被初始化为false
使用未分配的变量是否是一种好的做法是有争议的。从语言的角度来看,至少你没有未定义的行为
# 2 楼答案
未初始化的变量是“兼容的”,因为规范允许它,而且它是必要的,因为某些情况需要它。比如尝试一下…catch块,其中try catch内的变量必须在块外使用
# 3 楼答案
成员是C++中更常用的术语,但这里可能是指实例变量。答案是:因为根据Java语言规范(http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5),实例变量有一个默认值。(与局部变量相反,没有有默认值)