java类型和空引用
据说 Java编程语言中有两种类型:基元类型(§4.2)和引用类型(§4.3) 及 还有一种特殊的null类型 所以基本上java类型和空引用,java,Java,据说 Java编程语言中有两种类型:基元类型(§4.2)和引用类型(§4.3) 及 还有一种特殊的null类型 所以基本上null类型既不是基元类型,也不是引用类型 但是,如果它不被视为引用类型,为什么它可以保存引用并且始终可以进行扩展引用转换到任何引用类型 或者它最终是某种引用类型?是否可以将其视为参考类型 那么,问题的答案是什么-是否[null]是引用类型Yes或No?实际上,它还说,程序员可以忽略null类型,而只是假装null只是一个特殊的文本,可以是任何引用类型。 因此,它可以被视为可
null
类型既不是基元类型,也不是引用类型
但是,如果它不被视为引用类型,为什么它可以保存引用并且始终可以进行扩展引用转换到任何引用类型
或者它最终是某种引用类型?是否可以将其视为参考类型
那么,问题的答案是什么-
是否[null]是引用类型Yes
或No
?实际上,它还说,程序员可以忽略null类型,而只是假装null只是一个特殊的文本,可以是任何引用类型。
因此,它可以被视为可以分配给任何引用类型的值。null
类型可以被视为引用类型,因为您可以拥有对象o=null
,而int i=null
将给出编译错误。实际上,null
只是一个占位符,什么也不说。在本例中,对象不指向任何对象
因此,如果您调用o.toString()
,您将得到一个NullPointerExeption
,因为您试图不调用任何方法。null
通常被认为更像是一个占位符,用于设置对象引用,以及null
以使对象符合垃圾收集的条件等,它也有很多用途……回到你的Qeeston是的null
也可以被认为是一种特殊的参考类型你已经引用了规范中明确说明null
不是参考类型的部分。引用类型的值始终是引用,将null
指定为引用类型可能需要在JLS周围引入许多特殊情况规定
但是,您最好谨慎地“取消”您的整个问题,因为它对Java编程的任何实际方面都无关紧要,并且只在JLS内部定义的上下文中才有意义。如果考试中出现这种问题,你应该责怪作者问了。作为一个面试问题,它可能只是一个对话的开始。首先,null
不是一个类型,而是一个值。类型为引用类型的变量的值可能为null,但不能在需要引用类型的位置使用null
,不能声明类型为null
的变量,也不能有类型参数null
,例如,不能声明列表
值null
有一个特殊的“null类型”,它仅在编译(和验证)期间相关,以便能够制定“null类型”可分配给引用类型的正式规则。但是
“空类型”不是引用类型
要添加规范中的一些引用,请执行以下操作:
:
还有一种特殊的null类型,表达式null的类型(§3.10.7,§15.8.1),它没有名称
空引用始终可以分配或强制转换到任何引用类型(§5.2、§5.3、§5.5)
实际上,程序员可以忽略null类型,而只是假装null只是一个特殊的文本,可以是任何引用类型
:
“实际上,程序员可以忽略null类型,而只是假装null只是一个特殊的文本,可以是任何引用类型。”但我不是在说实践。所以它最终不是某种引用类型?@user1432980-这没关系。正如Marko Toplonik在他的回答中指出的。。行为很重要,而不是语义。@user1432980 JLS说它不重要,但它是否是引用类型没有实际区别。哇。。很遗憾,每个答案只能投一票在其他语言中,有“bottom”类型,它被定义为所有引用类型的子类型。Java没有选择这种方法,可能是因为Java的方法更简单。@Holger-您的代码将给出一个NPE。。编译器不允许我们直接将空值赋给基元类型。这证明null与基元类型不兼容。。在您的示例中,您是在欺骗编译器。但是与基元类型不兼容并不能证明是引用类型。顺便问一下,inti=true?42:空代码>将在不抛出NPE的情况下工作。我只想强调,是否产生编译器错误,并不是形式规则的真正证明。@Holger-那么为什么您认为不能允许原始类型引用null
?我想您知道答案。原语值的值集中没有包含null
值的位置,例如int
的所有2个可能值都具有有效的数值。原始值的创建是为了提高效率,更接近CPU的工作方式,从而排除了处理可能的null
状态。创建使用“空类型”的正式规则是为了用正式规则证明该务实决策的合理性。正确的说法可能是“引用类型的变量可以有一个null
值”,但类型系统需要一个占位符类型来正式表示这一点。
Verification type hierarchy:
top
____________/\____________
/ \
/ \
oneWord twoWord
/ | \ / \
/ | \ / \
int float reference long double
/ \
/ \_____________
/ \
/ \
uninitialized +------------------+
/ \ | Java reference |
/ \ | type hierarchy |
uninitializedThis uninitialized(Offset) +------------------+
|
|
null