这有效:
class MyClass
{
int a;
public MyClass()
{
int b = a;
}
}
但这会产生编译错误(“使用未分配的局部变量'a'”):
class MyClass
{
public MyClass()
{
int a;
int b = a;
}
}
据我所知,这是因为在第一个例子中,从技术上讲,编译器不知道没有分配'a'。在后一个例子中,'a'是在本地定义的,因此很容易跟踪。
但为什么后一个例子不起作用?
整数默认为0吗?这是编译器对“最佳实践”强制执行的操作。或者还有其他原因吗?
答案 0 :(得分:34)
在第一个示例中,它是字段。 Fields自动默认为0 / false / null。在第二个示例中,它是变量。变量不默认,并且在使用之前必须具有“明确赋值”。
基本上,在创建对象(或初始化结构)时,它会将内存归零(或者在非默认结构的情况下,强制您手动初始化所有内容)。但是,变量是如此常见(在每种方法中),它不希望总是必须将堆栈归零。它会强制您指示初始值。
答案 1 :(得分:11)
不要将整数默认为0吗?
当它们是类的数据成员时,它们会这样做,但是当它们是局部变量时它们不会这样做:局部变量需要在使用之前显式初始化,因此编译器错误。
答案 2 :(得分:2)
当你实例化一个类的新实例时,对象需要的所有内存都是“归零”的整数被设置为0字符串被设置为null等。这是为了避免很多奇怪的内存错误和黑客可能用C(++)。不幸的是,这也有一个很小的处理成本,所以当你创建一个局部变量时,语言假定你将很快自己设置值,并且不会将它归零以减少所需指令的总数。为了抵消使用未设置内存的风险,这会引入编译器检查以确保在允许您使用变量之前设置了值。
答案 3 :(得分:2)
这可能是因为在类级别声明的变量不能在同一范围内赋值(除了声明时)
e.g
class Test
{
int a;
a = 0; // this is not allowed at class level & hence a initialized to default
}
,而
class Test
{
void test()
{
int a;
int b = a;
a = 20; // this is allowed
}
}
答案 4 :(得分:-1)
据我所知,当我们在类中声明一个变量并创建一个对象时,默认构造函数会初始化变量,因此不需要初始化类变量。但是来到类中的方法没有构造函数或任何东西来初始化这些变量,所以我们不能在方法中分配未初始化的变量。