1

据我了解null,是Tfor all reference type的实例T

问题 1.的定义是什么nullnull在内存中如何表示?

考虑以下情况:我们定义了类

public class MyClass{
    Integer i;
}

现在null可以转换为MyClass,但我没有明确定义。

问题 2.从哪个编译器知道null可以转换为MyClass

4

4 回答 4

11

null其实instanceof什么都不是!

Java 语言规范(第 15.20.2 节)中的 instanceof 运算符:

在运行时,如果 RelationalExpression 的值不为 null并且可以将引用强制转换(第 15.16 节)到 ReferenceType 而不会引发 ClassCastException,则 instanceof 运算符的结果为真。否则结果为假。

4.1。类型和值的种类

Java 编程语言中有两种类型:原始类型(§4.2)和引用类型(§4.3)。相应地,有两种数据值可以存储在变量中、作为参数传递、由方法返回并对其进行操作:原始值(第 4.2 节)和参考值(第4.3节)。

类型:PrimitiveType ReferenceType 还有一种特殊的 null 类型,即表达式 null 的类型(第3.10.7 节、第15.8.1),它没有名称。

因为 null 类型没有名字,所以不可能声明一个 null 类型的变量或强制转换为 null 类型。

空引用是空类型表达式的唯一可能值。

空引用始终可以进行扩展引用转换为任何引用类型。

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

于 2013-10-12T16:37:17.830 回答
10

形式上,null是该null类型的单例成员,它被定义为所有其他 Java 类型的子类型。

null是一个引用类型,它的值是唯一不引用任何对象的引用值。null因此在内存中没有表示。引用类型变量的二进制值,其值null只是零(所有零位)。即使没有明确指定,它也遵循对象的一般初始化语义,任何其他值都会给实现带来重大问题。

于 2013-10-12T16:42:18.567 回答
2
  1. Null没有任何意义。没有对象。完全没有。可以将空值分配给任何类型的对象引用。

  2. Null 可以转换为任何类型,因为它可以分配给该类型的对象引用。在某种程度上,它可以充当每种类型,除了在尝试进行字段/方法访问时它是无用的(将抛出 NullPointerException)并且不是每种类型。请注意,null instanceof Foo无论是什么,它总是错误foo的。

于 2013-10-12T16:37:03.903 回答
2

在 Java 中,变量是对对象的引用。因此,一个null值表示一个未设置的引用(即没有引用)。

您可以将变量视为容器(*),您可以在其中放置给定类型的对象,当变量为 时null,表示您的容器为空。很明显,任何容器都可以是空的(无论它应该承载的对象类型如何),您只需要在其中放置任何内容(或删除里面的内容)。尽管如此,void 不是任何类型的对象,它只是从容器中取出内容时剩下的东西。

(*) 我知道容器对于参考值来说不是一个好的抽象,但它们对于这个具体的解释很有用。

于 2013-10-12T16:45:49.767 回答