我正在学习Java中的链表,我有三个文件Main.java
,List.java
和Node.java
。当我这样做时,我得到一个问题为什么我应该初始化一个在方法中声明的局部变量,而不是在类中声明的类变量。
在第一张图中,我将head声明为类变量,它不会抛出任何错误。
但是在第二张图中我将head初始化为局部变量。现在,它会抛出一个错误来初始化局部变量。
声明为类变量时会有什么不同?
Java初学者。
更新:我知道如何解决这个问题,但我不清楚为什么Java默认只初始化类变量而不是局部变量。
答案 0 :(得分:2)
the Java Language Specification(特别是§4.12.5)对此进行了相当好的解释:
程序中的每个变量在使用其值之前必须具有值:
- 每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10):
- 对于所有引用类型(§4.3),默认值为null。
- 局部变量(§14.4,§14.14)必须在使用之前显式赋值,通过初始化(§14.4)或赋值(§15.26) ),以可以使用明确赋值规则(§16)验证的方式。
为了扩展一点,§16进入definite assignment的规则,这是原因的关键:
每个局部变量(第14.4节)和每个空白最终字段(§4.12.4,§8.3.1.2)在对其值进行任何访问时都必须具有明确赋值。
对于本地变量或空白最终字段x的每次访问,必须在访问之前明确分配x,否则会发生编译时错误。
简单地说:Java将为类/实例变量分配默认值,但不会为本地变量分配默认值。必须以这种方式明确分配局部变量(通过初始化或赋值),否则将发生编译时错误(如您所见)。
如果您从另一个角度考虑它,当您初始化包含特定字段的类时,您可能不希望首先初始化为值的那些(想想JavaBeans)。如果你在一个代码块中并且声明一个变量,那么期望开发人员在块中控制该对象的生命周期。
简单地声明变量并尝试使用执行某些操作没有为其分配值是没有意义的,因为该变量不会拥有 a值。
答案 1 :(得分:0)
在第一种情况下,当您将值分配给节点" head"时,java无法知道。你可以在打电话之前接听电话"添加" 在第二种情况下,命令采用相同的方法,执行顺序清晰。
在每种情况下,您都应该初始化每个变量。如果我记得正确的成员变量被初始化为null,但我不确定它是否适用于每个jvm
答案 2 :(得分:0)
默认情况下,Node
初始化非null
的静态/非静态字段。
原始的静态/非静态字段将获得其默认值。
还有一种情况是使用默认值初始化某些变量:实例化数组时。每个单元格表示默认值,关于类型:
0
int
{li> null
Integer
但是,在本地方法中,编译器不会为本地变量分配默认值 这就是你的IDE警告的原因:“可能没有初始化!”。
要了解原因,您可能会对此post感兴趣。
答案 3 :(得分:0)
为什么语言以这种方式工作,因为最喜欢的风格是延迟声明局部变量,直到它们首次使用。 Java的设计使得您不必在首次使用变量之前声明变量(例如,JavaScript,由于缺少块级范围而且由于提升您而导致的变量)。最好在方法或函数的开头声明变量),因此不应该是局部变量不能获得默认值的问题。
同样对于局部变量,我们的想法一定是分配默认值的价值相对较小。即使我确实想要初始化局部变量,也可以明确它。
当然,例如,班级成员声明首次使用并不适用,因为没有说明什么可以称之为。如果没有分配某些内容,则需要接收默认值。