据我了解null
,是T
for all reference type的实例T
。
问题 1.的定义是什么null
?null
在内存中如何表示?
考虑以下情况:我们定义了类
public class MyClass{
Integer i;
}
现在null
可以转换为MyClass
,但我没有明确定义。
问题 2.从哪个编译器知道null
可以转换为MyClass
?
null
其实instanceof
什么都不是!
Java 语言规范(第 15.20.2 节)中的 instanceof 运算符:
在运行时,如果 RelationalExpression 的值不为 null并且可以将引用强制转换(第 15.16 节)到 ReferenceType 而不会引发 ClassCastException,则 instanceof 运算符的结果为真。否则结果为假。
Java 编程语言中有两种类型:原始类型(§4.2)和引用类型(§4.3)。相应地,有两种数据值可以存储在变量中、作为参数传递、由方法返回并对其进行操作:原始值(第 4.2 节)和参考值(第4.3节)。
类型:PrimitiveType ReferenceType 还有一种特殊的 null 类型,即表达式 null 的类型(第3.10.7 节、第15.8.1节),它没有名称。
因为 null 类型没有名字,所以不可能声明一个 null 类型的变量或强制转换为 null 类型。
空引用是空类型表达式的唯一可能值。
空引用始终可以进行扩展引用转换为任何引用类型。
在实践中,程序员可以忽略 null 类型,只是假装 null 只是一个可以是任何引用类型的特殊文字。
形式上,null
是该null
类型的单例成员,它被定义为所有其他 Java 类型的子类型。
null
是一个引用类型,它的值是唯一不引用任何对象的引用值。null
因此在内存中没有表示。引用类型变量的二进制值,其值null
只是零(所有零位)。即使没有明确指定,它也遵循对象的一般初始化语义,任何其他值都会给实现带来重大问题。
Null没有任何意义。没有对象。完全没有。可以将空值分配给任何类型的对象引用。
Null 可以转换为任何类型,因为它可以分配给该类型的对象引用。在某种程度上,它可以充当每种类型,除了在尝试进行字段/方法访问时它是无用的(将抛出 NullPointerException)并且不是每种类型。请注意,null instanceof Foo
无论是什么,它总是错误foo
的。
在 Java 中,变量是对对象的引用。因此,一个null
值表示一个未设置的引用(即没有引用)。
您可以将变量视为容器(*),您可以在其中放置给定类型的对象,当变量为 时null
,表示您的容器为空。很明显,任何容器都可以是空的(无论它应该承载的对象类型如何),您只需要在其中放置任何内容(或删除里面的内容)。尽管如此,void 不是任何类型的对象,它只是从容器中取出内容时剩下的东西。
(*) 我知道容器对于参考值来说不是一个好的抽象,但它们对于这个具体的解释很有用。