Object
Java中是否为null ?
Null
(实际上是特征)具有一个实例null
。
null instanceof Object
为false,但typeof(null)
返回'object'
。在这种情况下是物体吗?谁知道。
Object
Java中是否为null ?
Null
(实际上是特征)具有一个实例null
。
null instanceof Object
为false,但typeof(null)
返回'object'
。在这种情况下是物体吗?谁知道。
Answers:
如果Object为null,它将支持java.lang.Object
诸如的方法equals()
。但是,事实并非如此-对null的任何方法调用都会导致NullPointerException
。
这是Java语言规范在该主题上必须说的:
还有一个特殊的null类型,即表达式null的类型,它没有名称。由于空类型没有名称,因此无法声明空类型的变量或将其强制转换为空类型。空引用是空类型表达式的唯一可能的值。空引用始终可以转换为任何引用类型。在实践中,程序员可以忽略null类型, 而只是假装null只是可以是任何引用类型的特殊文字。
我认为这可以归结为“ null is special”。
java.lang.Object
。实际上-是的。您无法创建不是java.lang.Object的子类的类,但我从未从更哲学的角度考虑它
NullPointerException
都提到了» null
对象«... :),但是然后,也可以谈论»空指针«…
根据Java 规范,null
是一种可以分配给对象变量的类型(如注释中所述的值)。但是,您无法实例化或创建这种类型的变量,必须使用null
编译器提供的文字。
null
名称是该null
类型的“实例” 。
null
不是变量,而是文字:JLS,3.10.7。空的文字
null
是可以分配的类型 ”:1)null
(在代码中)是null文字,不是null类型 2)通常不能在Java中将类型分配给变量,请参见JLS 4.1:“ 有[...可以存储在变量中的两种数据值:原始值(§4.2)和引用值(§4.3)。 “ 这是可以通过文字分配的空引用null
。...继续...
length
子类的数组java.awt.geom.Point2D
。
空是缺少对象。
JRL写道:
不,这不对, ...
通常,这取决于您从哪里看,谁会相信更多。
根据JLS,是的。特别是如果您将问题改写为:“是null
文字类型Object
吗?”。除了上面迈克尔·伯格沃德(Michael Borgwardt)引用的JLS 4.1:
参见JLS 3.10.7:
空文字始终是空类型。
和JLS 4.10:
类型T的子类型都是U类型,因此T是U的超类型,并且是null类型。
空类型的直接超类型是除空类型本身之外的所有引用类型。
[我的重点。]
根据Eclipse 2019-09的编译器,它不是:
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
根据OpenJDK 12.0.1,javac
它是:
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
尖括号表示那null
不是基本类型。根据JLS 4.1:
Java编程语言中有两种类型:基本类型(...)和引用类型(...)。
如果不是一个,那就是另一个。
克劳迪乌写道:
null有点丑陋。
互惠生,null
是美丽的。您会建议使用什么作为参考类型变量的默认值?任意位组合?欢迎访问冲突,甚至更糟的是指针地狱!
约阿希姆·绍尔(Joachim Sauer)写道:
null是类型和值。
实际上,有三个与null结合使用的项(另请参见JLS 3.10.7):
null
文字。(1)注意,根据上面引用的JLS 4.10.2,null类型不仅对接口而且对类都使用多重继承。众所周知,对于我们的应用程序程序员而言,这是不可能的。
(2)空字面量可以想象为一个变量,定义为:
JVM_global final null_type null = new null_type();
另请注意JLS 3.9:
有时会错误地将各种字符序列假定为关键字:
null
不是关键字,而是null文字(第3.10.7节)。
null instanceof <any type>
考虑到JLS 4.10.2(“ 空类型是每种类型的子类型”)null instanceof <any type>
应该被评估为true
,不是吗?乍一看,是的,但是JLS 15.20.2给出了见解的答案:
[...] 的结果所述的
instanceof
操作者是true
如果该值的的RelationalExpression 不是null
[...]。否则结果为false
。
[我的重点。]
问自己(从应用程序程序员的角度来看)什么更有意义:
给出false
并因此表明引用表达式不是我们公开的类型,即表明它未引用对我们有用的任何东西
或给定true
,从而通知我们该表达式的值是一个特殊引用,即null引用,它引用一个“对象”,我们不知道该对象甚至不存在,并且是没有名称的特殊null类型,也不会暴露给该对象我们,但是通过null常量,是包含多重继承的任何类型的子类型,并且无论如何都将被忽略?还考虑更实际的示例:
class Car implements Vehicle {
...
Vehicle car = null;
...
boolean b = car instanceof Car; // True? There's not even an instance
... // which could be of type Car.
这也导致:
instanceof
没有适当的方式来谈论null
“对象性”的?叫做instanceof
not sameorsubtypeof
。这意味着我们正在将实例的类型与一个类型而不是两个类型进行比较。现在null
表示:“没有实例”,如果没有实例,则没有实例的类型。很明显,什么都没有做应该导致false
。
或在“更多”的真实世界示例中:
正如迈克尔所总结的:“零是特别的”。
如Java语言规范的4.1类型和值的种类中所述,null是一种具有一个值的类型,该值是null引用(并由文字表示null
):
还有一个特殊的null类型,即expression的类型
null
,它没有名称。由于空类型没有名称,因此无法声明空类型的变量或将其强制转换为空类型。空引用是空类型表达式的唯一可能的值。空引用始终可以转换为任何引用类型。在实践中,程序员可以忽略null类型,而只是假装这null
只是可以是任何引用类型的特殊文字。
但是,您可能想了解有关Null对象模式的信息(我不建议这样做)。有关此模式的更多信息,请参见C2 Wiki或Wikipedia。
否。即使是这样,它也没有用,因为它没有任何方法或字段。
不,不是一个对象,因为null的instanceof对象将始终返回false,并且只有一个null,而不是每个类一个。
null instanceof <anytype>
也会返回false
。
Java通过引用处理对象。Null是Java的OO-ness的细目,因为它使您降至OO级以下。不,它不是对象,它是引用的VALUE。它与对象范例无关,而是与启用对象的Java管道有关。
No null
不是对象,它是一个引用类型,其值不引用任何对象,因此null
在内存中没有表示形式。
Object
,而不是对象(例如type)。而如果一个rephrases相应的问题...