为什么必须在Java中初始化局部变量(包括基元)?为什么在实例变量的情况下不相同?
我熟悉C#规范,第5.3节,它说在使用之前必须分配一个变量.
在C和非托管C++中,这是有道理的,因为堆栈没有被清除,并且用于指针的内存位置可能在任何地方(导致难以追踪错误).
但我的印象是运行时不允许真正的"未分配"值.特别是未初始化的引用类型将始终具有空值,而不是先前调用方法或随机值所遗留的值.
这是正确的,还是我错误地假设这些年来检查null是否足够?你可以在C#中使用非真实的变量,或者CLR是否会处理这个变量并且总是设置了一些值.
考虑一下:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白."b"永远不会被初始化,但会产生与"c"相同的运行时错误,这是一个编译时错误.为什么局部变量和成员之间存在差异?
编辑:让会员私密是我最初的意图,问题仍然存在......
我一直想知道为什么在下面的例子中可以不初始化实例字段(依赖它将具有其默认值)并访问它,而局部变量显然必须初始化,即使我将其初始化为默认值无论如何它会得到......
public class TestClass
{
private bool a;
public void Do()
{
bool b; // That would solve the problem: = false;
Console.WriteLine(a);
Console.WriteLine(b); //Use of unassigned local variable 'b'
}
}
Run Code Online (Sandbox Code Playgroud) 请考虑Java中的以下代码段.它不会编译.
package temppkg;
final public class Main
{
private String x;
private int y;
private void show()
{
String z;
int a;
System.out.println(x.toString()); // Causes a NullPointerException but doesn't issue a compiler error.
System.out.println(y); // Works fine displaying its default value which is zero.
System.out.println(z.toString()); // Causes a compile-time error - variable z might not have been initialized.
System.out.println(a); // Causes a compile-time error - variable a might not have been initialized.
}
public static void main(String []args)
{
new …Run Code Online (Sandbox Code Playgroud) 我读到Java为类属性提供了默认值,但没有为局部变量提供默认值.那是对的吗?如果是这样的话背后的原因是什么?当你做一些好事时,为什么不一直这样做呢?
谢谢,
罗杰
声明时,Java中的每个类型都具有原始值.本文包含原始数据类型原始数据类型的描述.知道这一点,为什么Eclipse显示错误告诉我变量可能尚未初始化?如果我有例如
int x;
x++;
Run Code Online (Sandbox Code Playgroud) 我正在学习Java中的链表,我有三个文件Main.java,List.java和Node.java.当我这样做时,我得到一个问题为什么我应该初始化一个在方法中声明的局部变量,而不是在类中声明的类变量.
在第一张图片中,我将head声明为类变量,它不会抛出任何错误.

但是在第二张图中我将head初始化为局部变量.现在,它会抛出一个错误来初始化局部变量.
声明为类变量时有什么区别?

Java初学者.
更新:我知道如何解决这个问题,但我不清楚为什么Java默认只初始化类变量而不是局部变量.
为什么在Java类字段中将其初始化为null/0而局部变量不是?这种语言设计选择有原因吗?