分配给null的变量和未分配的变量之间有什么区别

时间:2015-04-02 13:53:16

标签: java

分配给null的变量与未在java中分配的其他变量之间有什么区别。

我知道方法的块存在差异,这意味着我可以使用已初始化为null的变量,但我无法使用未初始化的

你可以告诉我为什么吗?

编辑: 感谢所有回答的人

我的问题是内存中的行为和引用形式

5 个答案:

答案 0 :(得分:7)

  

分配给null的变量与未分配的变量有什么区别?

  • 未初始化的变量没有值,甚至没有null(这就是为什么无法读取)
  • 初始化变量确实有一个值(例如null5"hello")。

请注意,成员变量会自动获取分配给它们的默认值(引用类型的默认值为null)。因此,虽然看起来你可以阅读"未初始化的"成员变量,事实是 实际上是初始化的。

答案 1 :(得分:1)

明确的意图与暗示。如果您没有将对象设置为任何,您可能已经忘记了,因此编译器会提醒您。如果显式设置为null,则编译器确信您已做出选择。此外,对于某些类型,unset值可能不是null,因此允许编译器做出选择是危险的(参见C ++默认情况不同的实现)。

答案 2 :(得分:1)

分配给null的变量意味着它不指向任何不是assigned的变量,如果它是局部变量则意味着它甚至没有被初始化

Test t1=null; ----> Not Pointing to any Object 
Test t2; ------> Not even initialized 

如果t2是局部变量并且您将使用它,那么您将获得编译错误,因为在使用之前首先进行初始化,因为此变量不存在默认值

答案 3 :(得分:1)

请参阅JLS 4.12.5. Initial Values of Variables

  

对于所有引用类型(§4.3),默认值为null

ReferenceType:
    ClassOrInterfaceType
    TypeVariable
    ArrayType

因此成员变量没有区别,如果您没有明确地将其分配给null,则会隐式分配。

答案 4 :(得分:1)

直接来自Oracle site

声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。但是,依赖于这样的默认值通常被认为是糟糕的编程风格。

下表总结了上述数据类型的默认值。

数据类型默认值(对于字段) 字节0 短0 int 0 长0L 浮点数0.0f 双0.0d char'\ u0000' 字符串(或任何对象)null 布尔值假

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

希望帮助你!