unj*_*nj2 242 java null terminology
什么是null?
是null一个什么的实例?
什么集合null属于?
它是如何在记忆中表现出来的?
pol*_*nts 302
null是什么的实例?
没有,没有任何类型的null是instanceof.
instanceofRun Code Online (Sandbox Code Playgroud)RelationalExpression: RelationalExpression instanceof ReferenceType在运行时,
instanceof运算符的结果是true如果RelationalExpression的值不是,null并且可以将引用强制转换为ReferenceType而不引发aClassCastException.否则结果是false.
这意味着对于任何类型的E和R,对于任何E o,在那里o == null,o instanceof R永远是false.
"null"属于哪个集合?
还有一个特殊的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.
对于所有引用类型,它也是默认值(对于具有它们的变量):
- 在创建时,每个类变量,实例变量或数组组件都使用默认值进行初始化:
- 对于所有引用类型,默认值为
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引用参考的诱惑,仅仅因为它很容易实现.这导致了无数的错误,漏洞和系统崩溃,这可能在过去四十年中造成了数十亿美元的痛苦和损害.
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不会指向对象的内存空间.
null关键字是表示空引用的文字,不引用任何对象.null是引用类型变量的默认值.
也许可以看看
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)
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类型或声明此类型的变量.
字节码表示
Java null具有直接的JVM支持:用于实现它的三个指令:
aconst_null:例如,将变量设置null为Object o = null;ifnull和ifnonnull:例如,一个对象比较null,如if (o == null)然后,第6章“ Java虚拟机指令集”提到了null其他指令的影响:它NullPointerException为许多指令抛出了。
2.4。“引用类型和值”还null以通用术语提及:
引用值也可以是特殊的空引用,即无对象的引用,此处将以空表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为null。