Java中的null是什么?

unj*_*nj2 242 java null terminology

什么是null

null一个什么的实例?

什么集合null属于?

它是如何在记忆中表现出来的?

pol*_*nts 302

null是什么的实例?

没有,没有任何类型的nullinstanceof.

15.20.2类型比较运算符 instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType
Run Code Online (Sandbox Code Playgroud)

在运行时,instanceof运算符的结果是true如果RelationalExpression的值不是,null并且可以将引用强制转换为ReferenceType而不引发a ClassCastException.否则结果是false.

这意味着对于任何类型的ER,对于任何E o,在那里o == null,o instanceof R永远是false.


"null"属于哪个集合?

JLS 4.1类型和值的种类

还有一个特殊的null类型,表达式的类型,null没有名称.由于null类型没有名称,因此无法声明null类型的变量或转换为null类型.所述null参考是一个表达式的唯一可能的值无效的类型.该null参考总是可以被转换为任何引用类型.实际上,程序员可以忽略null类型,只是假装它null只是一个可以是任何引用类型的特殊文字.


什么是null?

正如上面的JLS引用所说,在实践中你可以简单地假装它"仅仅是一个可以是任何引用类型的特殊文字".

在Java中,null == null(在其他语言中并非总是如此).另请注意,通过合同,它还具有此特殊属性(来自java.lang.Object):

public boolean equals(Object obj)

对于任何非null参考值x,x.equals(null)应该return false.

对于所有引用类型,它也是默认值(对于具有它们的变量):

JLS 4.12.5变量的初始值

  • 在创建时,每个类变量,实例变量或数组组件都使用默认值进行初始化:
    • 对于所有引用类型,默认值为null.

这是如何使用的.您可以使用它来启用所谓的字段的延迟初始化,其中字段的初始值null应该是实际使用的,其中它将替换为"实际"值(计算可能很昂贵).

还有其他用途.让我们从一个真实的例子java.lang.System:

public static Console console()

返回:否则为系统控制台(如果有)null.

这是一种非常常见的使用模式:null用于表示对象的不存在.

这是另一个用法示例,这次来自java.io.BufferedReader:

public String readLine() throws IOException

返回:A String包含行的内容,不包括任何行终止字符,或者null是否已到达流的末尾.

所以在这里,readLine()将返回instanceof String每一行,直到它最终返回一个null表示结束.这允许您按如下方式处理每一行:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}
Run Code Online (Sandbox Code Playgroud)

可以设计API以使终止条件不依赖于readLine()返回null,但可以看出这种设计具有使事情简洁的好处.请注意,空行没有问题,因为空行"" != null.

让我们再看一个例子,这次来自java.util.Map<K,V>:

V get(Object key)

返回指定键映射到的值,或者null此映射是否不包含键的映射.

如果此映射允许null值,则返回值null不一定表示映射不包含键的映射; 地图也可能明确地将密钥映射到null.该containsKey操作可用于区分这两种情况.

在这里,我们开始看到使用null如何使事情变得复杂.第一个语句表示如果未映射键,null则返回.第二个声明说,即使按键映射,null被退回.

相反,java.util.Hashtable通过不允许null键和值来保持事情更简单; 它的V get(Object key),如果回报率null,明确表示该键没有映射.

您可以阅读其余的API并查找使用的位置和方式null.请记住,它们并不总是最佳实践示例.

一般来说,null用作表示的特殊值:

  • 未初始化的状态
  • 终止条件
  • 不存在的对象
  • 一个未知的值

它是如何在记忆中表现出来的?

在Java?你没关系.并且最好保持这种方式.


null一件好事吗?

现在这是主观的边缘主义.有些人说这null会导致许多程序员错误,而这些错误本可以避免.有人说,用一种NullPointerException像Java一样的语言,使用它是很好的,因为你会在程序员错误上快速失败.有些人null通过使用Null对象模式等来避免.

这本身就是一个很大的话题,因此最好将其作为另一个问题的答案进行讨论.

我将以null他自己的发明者CAR Hoare(快速成名)的引言结束这个:

我称之为十亿美元的错误.这是null1965年的参考文献的发明.那时,我正在设计第一个用于面向对象语言(ALGOL W)的参考综合类型系统.我的目标是确保所有引用的使用绝对安全,并由编译器自动执行检查.但我无法抗拒null引用参考的诱惑,仅仅因为它很容易实现.这导致了无数的错误,漏洞和系统崩溃,这可能在过去四十年中造成了数十亿美元的痛苦和损害.

这个演讲视频更深入; 这是推荐的手表.

  • Hoare并没有试图声称发明空引用; 他只是声称他在一个特别有影响力的地方提供这些服务.有许多语言,包括Java,显然从Algol那里获得灵感,如果他们使用空引用甚至部分受到Algol的启发或复制,那么Hoare对于承担这些费用的一些责任是正确的.不过,我确实觉得他的估计相当低.一万亿美元可能更接近真实成本. (6认同)
  • 在1960年,可能更早,LISP(作为"NIL")存在空引用.但我不认为Hoare真的*试图在该引用中声称发明了空引用. (3认同)

Ste*_*n C 30

null是什么的实例?

不,这就是为什么null instanceof X会返回false所有课程X.(不要被可以分配null给类型为对象类型的变量这一事实所迷惑.严格来说,赋值涉及隐式类型转换;请参阅下文.)

"null"属于哪个集合?

它是null类型的唯一成员,其中null类型定义如下:

"还有一个特殊的null类型,表达式的类型为null,它没有名称.因为null类型没有名称,所以不可能声明null类型的变量或者转换为null类型. reference是null类型表达式唯一可能的值.null引用总是可以转换为任何引用类型.实际上,程序员可以忽略null类型,只是假装null只是一个特殊的文字,可以是任何引用类型.参考类型." JLS 4.1

什么是null?

往上看.在某些情况下,null用于表示"无对象"或"未知"或"不可用",但这些含义是特定于应用程序的.

它是如何在记忆中表现出来的?

这是特定于实现的,您将无法null在纯Java程序中看到它的表示.(但null在大多数(如果不是全部)Java实现中,它表示为零机器地址/指针.)


San*_*ain 14

什么是null?

没什么.

null是什么的实例?

不,因为它不是什么它不能是任何事情的例子.

null属于什么集合?

没有任何设定

它是如何在记忆中表现出来的?

如果有一些参考指向它:

Object o=new Object();
Run Code Online (Sandbox Code Playgroud)

在堆内存中,一些空间分配给新创建的对象.o将指向内存中分配的空间.

现在 o=null;

这意味着现在o不会指向对象的内存空间.


Tom*_*Tom 9

不,它不是任何实例,instanceof将永远是假的.


Adr*_*der 7

null关键字是表示空引用的文字,不引用任何对象.null是引用类型变量的默认值.

也许可以看看

null:Java词汇表

  • 它不是关键字,它是[literal](http://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.7).质量差和非规范性引用. (2认同)

Thi*_*ilo 6

Null不是任何类的实例。

但是,您可以将null分配给任何(对象或数组)类型的变量:

 // this is false   
 boolean nope = (null instanceof String);

 // but you can still use it as a String
 String x = null;
 "abc".startsWith(null);
Run Code Online (Sandbox Code Playgroud)


p27*_*p27 6

Java中的空(tm)

在C和C++中,"NULL"是头文件中定义的常量,其值如下:

    0
Run Code Online (Sandbox Code Playgroud)

要么:

    0L
Run Code Online (Sandbox Code Playgroud)

要么:

    ((void*)0)
Run Code Online (Sandbox Code Playgroud)

取决于编译器和内存模型选项.严格来说,NULL不是C/C++本身的一部分.

在Java(tm)中,"null"不是关键字,而是null类型的特殊文字.它可以转换为任何引用类型,但不能转换为任何基本类型,如int或boolean.null文字不一定具有零值.并且无法转换为null类型或声明此类型的变量.


Cir*_*四事件 5

字节码表示

Java null具有直接的JVM支持:用于实现它的三个指令:

  • aconst_null:例如,将变量设置nullObject o = null;
  • ifnullifnonnull:例如,一个对象比较null,如if (o == null)

然后,第6章“ Java虚拟机指令集”提到了null其他指令的影响:它NullPointerException为许多指令抛出了。

2.4。“引用类型和值”null以通用术语提及:

引用值也可以是特殊的空引用,即无对象的引用,此处将以空表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为null。