对象是否为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 ):

  1. (否则未命名) 空types
  2. null 文字
  3. 空引用值。 (通常缩写为空值或简单为空)

(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?

它被称为instanceofsameorsubtypeof 。 这意味着我们将实例的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可以分配给Objecttypes,但是第二行将显示它肯定不是Object

不, null不是一个对象,它是一个引用types,它的值不涉及任何对象,所以在内存中没有null表示。