Mic*_*rdt 167
如果null是一个Object,它将支持java.lang.Object诸如的方法equals().但是,情况并非如此 - 对null的任何方法调用都会导致a NullPointerException.
这就是Java语言规范在这个主题上所说的:
还有一个特殊的null类型,表达式的类型为null,没有名称.由于null类型没有名称,因此无法声明null类型的变量或转换为null类型.空引用是null类型表达式的唯一可能值.null引用始终可以强制转换为任何引用类型.实际上,程序员可以忽略null类型 ,只是假装null只是一个可以是任何引用类型的特殊文字.
我认为这可以归结为"null is special".
Ger*_*ica 12
JRL写道:
不,这不对, ...
通常情况下,这取决于你从哪里看,你相信谁.
根据JLS,是的,确实如此.特别是如果你将问题改为:"是null文字的类型Object吗?".除了Michael Borgwardt引用的JLS 4.1之外:
null文字始终为null类型.
和JLS 4.10:
类型T的子类型都是类型U,使得T是U的超类型,并且是null类型.
null类型的直接超类型都是 null类型本身以外的引用类型.
[由我强调.]
根据Eclipse Juno的编译器,它不是:
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
Run Code Online (Sandbox Code Playgroud)
根据JDKs 1.7.0_07,javac 它是:
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
Run Code Online (Sandbox Code Playgroud)
尖括号对我来说意味着null不是原始类型.并根据JLS 4.1:
Java编程语言中有两种类型:基本类型和引用类型.
所以,如果它不是那个,那就是另一个.
Claudiu写道:
null有点难看.
Au逆转,null很美.你会建议什么作为参考类型变量的默认值?任意位组合?欢迎访问违规,或者更糟糕的是,指针地狱!
Joachim Sauer写道:
null是类型和值.
实际上有三个项与null一起使用(另请参阅JLS 3.10.7):
null 文字.(1)注意,根据上面引用的JLS 4.10.2,null类型不仅对接口使用多继承,对类也使用多继承.对于我们的应用程序员来说,我们都知道这是不可能的.
(2)null文字可能被想象为一个变量被定义为:
JVM_global final null_type null = new null_type();
另请注意JLS 3.9:
[...]虽然
null看起来可能是关键字,但从技术上讲它是空文字.
关于null instanceof <anytype>:
考虑到JLS 4.10.2(" null类型是每种类型的子类型")null instanceof <anytype>应该被评估为true,不应该吗?乍一看,是的,但JLS 15.20.2给出了深刻见解:
[...] 如果 RelationalExpression 的值不为null [...] ,则instanceof运算符的结果为true.否则结果是错误的.
[由我强调.]
问问自己什么更有意义(从应用程序员的角度来看):
给出false并因此表明引用表达式不是暴露给我们的类型,即表明它没有引用对我们有用的任何内容
或者给出true,从而通知我们表达式求值为一个特殊的引用,空引用,引用一个"对象",我们不知道它是否存在,哪个属于没有名称的特殊null类型,不会暴露给我们但是通过null文字,是包含多重继承的任何类型的子类型,无论如何都要被忽略?还要考虑更实用的例子:
RedBullStratosBalloon balloon = null;
boolean b = balloon instanceof Aircraft; // True? There's not even an instance
// which could be of type Aircraft.
Run Code Online (Sandbox Code Playgroud)这也导致:
为什么instanceof不是说出null对象的正确方法?
它叫做instanceof不sameorsubtypeof.这意味着我们将实例的类型与类型进行比较,而不是两种类型.现在null意味着:"没有实例",如果没有实例,则没有实例的类型.显而易见的是,与某事物的比较不应该导致false.
或者在"更多"现实世界的例子中:
正如迈克尔总结的那样:"确实是无效的".
如Java语言规范的4.1类型和值的种类中所述,null是一种具有一个值的类型,即null引用(并由文字表示null):
还有一个特殊的null类型,即expression的类型
null,它没有名称。由于空类型没有名称,因此无法声明空类型的变量或将其强制转换为空类型。空引用是空类型表达式的唯一可能的值。空引用始终可以转换为任何引用类型。在实践中,程序员可以忽略null类型,而只是假装这null只是可以是任何引用类型的特殊文字。
但是,您可能想了解有关Null对象模式(我不推荐)的信息。有关此模式的更多信息,请参见C2 Wiki或Wikipedia。