分配给null的变量与未在java中分配的其他变量之间有什么区别。
我知道方法的块存在差异,这意味着我可以使用已初始化为null的变量,但我无法使用未初始化的
你可以告诉我为什么吗?编辑: 感谢所有回答的人
我的问题是内存中的行为和引用形式
答案 0 :(得分:7)
分配给
null
的变量与未分配的变量有什么区别?
null
(这就是为什么无法读取)null
,5
或"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 布尔值假
局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。
希望帮助你!