对象是否为null?
在Java中是空的Object
?
如果null是Object,它将支持equals()
等java.lang.Object
的方法。 但是,情况并非如此 – 对null的任何方法调用都会导致NullPointerException
。
这就是Java语言规范在这个话题上所要说的:
还有一个特殊的空types,expression式为null的types,它没有名字。 因为nulltypes没有名称,所以不可能声明nulltypes的variables或转换为nulltypes。 空引用是空typesexpression式的唯一可能值。 空引用总是可以转换为任何引用types。 实际上,程序员可以忽略空types ,只是假装null只是一个特殊的文字,可以是任何引用types。
我认为这可以归结为“空是特别的”。
根据Java 规范 , null
是一种可以分配给对象variables的types(作为注释中指出的值)。 您不能实例化或创build此types的variables,但必须使用编译器提供的字面值null
。
绝对不是: null instanceof Object
返回false。
不,这不是一个对象。
空是缺less一个对象。
不,它不是一个类或一个类的实例。 这是一无所有的参考。
编辑 :没有阅读规范,所以上述可能不是100%准确。
JRL写道:
不,这不对, …
通常情况下,这取决于你从哪里看,你更相信谁。
根据JLS, 是的,这是 。 特别是如果你把这个问题改为:“ Object
是否是null
文字?”。 除了上面Michael Borgwardt引用的JLS 4.1之外,
参见JLS 3.10.7 :
null文字总是空types。
和JLS 4.10 :
Ttypes的子types都是Utypes,所以T是U的超types和空types。
或JLS 4.10.2 :
nulltypes的直接超types都是空types本身之外的所有引用types 。
[重点由我。]
根据Eclipse Juno的编译器, 它不是 :
true.toString(); // Cannot invoke toString() on the primitive type boolean null.toString(); // Cannot invoke toString() on the primitive type null
根据JDK 1.7.0_07 javac
它是 :
true.toString(); // error: boolean cannot be dereferenced null.toString(); // error: <null> cannot be dereferenced
尖括号表示null
是基本types以外的null
。 而根据JLS 4.1 :
Java编程语言中有两种types:基本types和引用types。
所以,如果不是那个是另一个呢
Claudiu写道:
null是一种丑陋的。
Au对应, null
是美丽的。 你会build议作为引用typesvariables的默认值,而不是? 一个任意的位组合? 欢迎来访问违规,甚至更糟的是,指针地狱!
Joachim Sauer写道:
null是一个types和一个值。
实际上有三个与null结合的项目(参见JLS 3.10.7 ):
- (否则未命名) 空types 。
-
null
文字 。 - 空引用值。 (通常缩写为空值或简单为空) 。
(1)注意,根据上面引用的JLS 4.10.2 , nulltypes不仅用于接口,而且用于类的多重inheritance。 我们都知道这对我们的应用程序员是不可能的。
(2) 空字面可能被想象为一个variables被定义为:
JVM_global final null_type null = new null_type();
还要注意JLS 3.9 :
而
null
可能看起来是一个关键字,在技术上它是空字面。
关于null instanceof <anytype>
:
考虑到JLS 4.10.2(“ nulltypes是每种types的子types”), null instanceof <anytype>
应该被认为是true
,不是吗? 乍一看,是的,但是JLS 15.20.2给出了有洞察力的答案:
如果 RelationalExpression 的值 不为空 […],则instanceof运算符的结果 为true 。 否则结果是错误的 。
[重点由我。]
问自己什么更有意义(从应用程序员的angular度来看):
-
给予
false
,从而表明参考expression式不是一种暴露给我们的types,即表明它没有引用对我们有用的任何东西 -
或给出
true
,从而通知我们expression式评估为特殊引用, 空引用 ,引用一个“对象”,我们不知道它是否存在,哪一个是没有名称的特殊的空types ,没有暴露给我们,但通过空字面 ,是任何types的子types,包括多重inheritance,是否被忽略呢? 考虑更实际的例子:RedBullStratosBalloon balloon = null; boolean b = balloon instanceof Aircraft; // True? There's not even an instance // which could be of type Aircraft.
这也导致:
为什么instanceof
不是一个正确的方式来谈论null
的Object – ness?
它被称为instanceof
不sameorsubtypeof
。 这意味着我们将实例的types与types进行比较,而不是两种types。 现在null
表示:“没有实例”,如果没有实例,则没有实例的types。 很明显,将某事与某事进行比较应该会导致false
。
或者在“更多”现实世界的例子中:
- 我有一个苹果( =参考types )的实际大小的图片在我的手中写有»大苹果«( =引用types名称 )写在它上面。
- 在我面前有一张桌子( =堆 )。
- 如果桌子上有一个苹果( =实例 ),则连接一条线( =参考 )。
- 我把手的另一端拿在手里( =参考variables )。
- 我沿着绳索跟踪苹果,并将其与我的照片( = instanceof )进行比较。
- 如果苹果尺寸相同或大于图片“大苹果”(“Apple”)适用于它( =真 )。
- 如果它更小,则不( = false )。
- 如果桌子上没有苹果,并且因此不存在线( =空 ),则书写不适用( =假 )。 因为:苹果不是一个大苹果吗? 不,这不对。
正如迈克尔所总结的那样:“空是特别的”。
不,不是一个对象,因为null instanceof Object总是会返回false,所以每个类只有一个null,而不是一个。
正如在第4.1节“ Java语言规范的types和值的种类”中所解释的那样, null是一个具有一个值的types,即空引用 (由null
表示):
还有一个特殊的空types,expression式为
null
的types,它没有名字。 因为nulltypes没有名称,所以不可能声明nulltypes的variables或转换为nulltypes。 空引用是空typesexpression式的唯一可能值。 空引用总是可以转换为任何引用types。 实际上,程序员可以忽略空types,只是假装null
只是一个特殊的文字,可以是任何引用types。
虽然你可能想阅读关于空对象模式 (我不推荐)。 有关此模式的更多信息,请参阅C2 Wiki或Wikipedia 。
根据Java规范 ,
还有一个特殊的空字符,可以用作任何引用types的值。 null可以被分配给任何variables,除了原始types的variables。 除了testing它的存在之外,您可以使用空值来做很less的事情。 因此,在程序中经常使用null作为标记来指示某个对象不可用。
不,即使是这样,它没有任何方法或领域,是无用的。
Java通过引用处理对象。 Null是Java的OO-ness的细分,因为它使你低于OO级别。 不,它不是一个对象,它是一个引用的值。 它与对象范式无关,而是涉及Java的pipe道,使对象成为可能。
null是java.lang.Object
的实例吗? 没有。
是空的对象 ? 取决于“ 是 ”的定义。
Object foo = null; System.out.println(foo.toString());
第一行显示null
可以分配给Object
types,但是第二行将显示它肯定不是Object
。
不, null
不是一个对象,它是一个引用types,它的值不涉及任何对象,所以在内存中没有null
表示。