对象是null吗?

Reg*_*ser 120 java null

Object在Java中是null 吗?

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".


Dan*_*ane 31

根据Java 规范,null是一种可以分配给对象变量的类型(作为注释中指出的值).但是,您无法实例化或创建此类型的变量,您必须使用null编译器提供的文字.

  • null是类型和值. (8认同)
  • 显然,`null`名称是`null`类型的"实例". (5认同)

Dar*_*rov 28

绝对不是:null instanceof Object返回false.

  • 然而,它与所有参考类型兼容. (17认同)

Eri*_*ler 12

不,它不是一个对象.


Tom*_*ier 12

Null是缺少一个对象.

  • Tommy:JLS 4.1:"还有一个特殊的null类型,表达式的类型为null,没有名称." (3认同)

Ger*_*ica 12

JRL写道:

不,这不对, ...

通常情况下,这取决于你从哪里看,你相信谁.

根据JLS,是的,确实如此.特别是如果你将问题改为:"是null文字的类型Object吗?".除了Michael Borgwardt引用的JLS 4.1之外:

JLS 3.10.7:

null文字始终为null类型.

JLS 4.10:

类型T的子类型都是类型U,使得T是U的超类型,并且是null类型.

JLS 4.10.2:

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):

  1. (否则未命名)null类型.
  2. null 文字.
  3. 空引用值.(通常缩写为空值或简称为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对象的正确方法?

它叫做instanceofsameorsubtypeof.这意味着我们将实例的类型与类型进行比较,而不是两种类型.现在null意味着:"没有实例",如果没有实例,则没有实例的类型.显而易见的是,与某事物的比较不应该导致false.

或者在"更多"现实世界的例子中:

  • 我手上有一个苹果(=参考类型)的真实尺寸图片,上面写着"Big Apple"(=参考类型名称).
  • 在我面前有一张桌子(=堆).
  • 如果桌子上有苹果(=实例),则连接有一根绳子(=参考).
  • 我手里拿着这根电线的另一端(=参考变量).
  • 我沿着绳索跟踪苹果并将其与我的图片(= instanceof)进行比较.
  • 如果苹果的大小与图片大小相同或大于"大苹果"的写作(=真).
  • 如果它更小,那么不是(=假).
  • 如果桌子上没有苹果,因此没有绳子存在(= null),写作也不适用(= false).原因如下:没有苹果大苹果?不,这不对.


正如迈克尔总结的那样:"确实是无效的".

  • Apple和null?你不是害怕诉讼吗?:) (2认同)

che*_*vim 9

不,它不是Class的实例,也不是Class的实例.它是对任何东西的引用.

编辑:没有阅读规格,所以上面可能不是100%准确.


Pas*_*ent 5

如Java语言规范的4.1类型和值的种类中所述,null是一种具有一个值的类型,即null引用(并由文字表示null):

还有一个特殊的null类型,即expression的类型null,它没有名称。由于空类型没有名称,因此无法声明空类型的变量或将其强制转换为空类型。空引用是空类型表达式的唯一可能的值。空引用始终可以转换为任何引用类型。在实践中,程序员可以忽略null类型,而只是假装这null只是可以是任何引用类型的特殊文字。

但是,您可能想了解有关Null对象模式(我不推荐)的信息。有关此模式的更多信息,请参见C2 WikiWikipedia


Tho*_*sen 5

否。即使是这样,它也没有用,因为它没有任何方法或字段。