在jls-4.1中,它说
Java编程语言中有两种类型:基本类型(第4.2节)和引用类型(第4.3节)
和
还有一种特殊的空类型
所以基本上null
类型既不是原始类型也不是引用类型。
但是,如果它不被视为参考类型,为什么它可以保留引用和can always undergo a widening reference conversion to any reference type
?
或者它到底是某种参考类型?它可以被视为参考类型吗?
那么,问题的答案是什么 - Is [null] a reference type or not
- 应该是什么? Yes
或No
?
答案 0 :(得分:5)
嗯,它也说In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.
因此,可以将其视为可以分配给任何引用类型的值。
答案 1 :(得分:5)
首先,null
不是类型,而是值。类型为引用类型的变量可能具有值 null,但是您不能在需要引用类型的地方使用null
,您不能声明类型的变量null
并且您不能拥有类型参数null
,例如你不能声明List<null>
。
值null
有一个特殊的“null类型”,它只在编译(和验证)期间才能形成能够将“null类型”赋给引用类型的形式规则。但是
“null type”不是引用类型。
从规范中添加一些引号:
还有一个特殊的null类型,表达式的类型为null(§3.10.7,§15.8.1),它没有名称。
...
可以始终为空引用赋值或转换为任何引用类型(第5.2节,第5.3节,第5.5节)。
在实践中,程序员可以忽略null类型,只是假装null只是一个可以是任何引用类型的特殊文字。
Verification type hierarchy: top ____________/\____________ / \ / \ oneWord twoWord / | \ / \ / | \ / \ int float reference long double / \ / \_____________ / \ / \ uninitialized +------------------+ / \ | Java reference | / \ | type hierarchy | uninitializedThis uninitialized(Offset) +------------------+ | | null
答案 2 :(得分:2)
null
类型可以视为引用类型,因为您可以Object o = null
而int i = null
会产生编译错误 。实际上,null
只是一个占位符来说 nothing 。在这种情况下,您的对象指向 nothing 。
因此,如果您致电o.toString()
,您将获得NullPointerExeption
,因为您正试图在 nothing 上调用方法。
答案 3 :(得分:2)
您引用了规范中明确说明null
不是引用类型的部分。引用类型的值始终是引用,并且将null
指定为引用类型可能需要在JLS周围引入许多特殊情况规定。
但是,对于“解开”整个问题是最谨慎的,因为它对Java编程的任何实际方面都无关紧要,并且仅对JLS内部定义的上下文感兴趣。如果在考试中出现过这样的问题,你应该责怪作者提问。作为面试问题,它可能仅作为对话启动者。
答案 4 :(得分:1)
null
通常被视为占位符以设置对象引用,以及null
以使对象符合垃圾收集等条件,它具有还有更多用途...回到你的Qeeston 是 null
也可以被视为特殊参考类型