java种类型和null引用

时间:2014-10-29 13:50:44

标签: java

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 - 应该是什么? YesNo

5 个答案:

答案 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”不是引用类型。

从规范中添加一些引号:

JLS §4.1

  

还有一个特殊的null类型,表达式的类型为null(§3.10.7,§15.8.1),它没有名称。

     

...

     

可以始终为空引用赋值或转换为任何引用类型(第5.2节,第5.3节,第5.5节)。

     

在实践中,程序员可以忽略null类型,只是假装null只是一个可以是任何引用类型的特殊文字。


JVMS §4.10.1.2

  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 = nullint i = null会产生编译错误 。实际上,null只是一个占位符来说 nothing 。在这种情况下,您的对象指向 nothing

因此,如果您致电o.toString(),您将获得NullPointerExeption,因为您正试图在 nothing 上调用方法。

答案 3 :(得分:2)

您引用了规范中明确说明null 是引用类型的部分。引用类型的值始终是引用,并且将null指定为引用类型可能需要在JLS周围引入许多特殊情况规定。

但是,对于“解开”整个问题是最谨慎的,因为它对Java编程的任何实际方面都无关紧要,并且仅对JLS内部定义的上下文感兴趣。如果在考试中出现过这样的问题,你应该责怪作者提问。作为面试问题,它可能仅作为对话启动者。

答案 4 :(得分:1)

null通常被视为占位符以设置对象引用,以及null以使对象符合垃圾收集等条件,它具有还有更多用途...回到你的Qeeston null也可以被视为特殊参考类型