unj*_*nj2 242 java null terminology
什么是null
?
是null
一个什么的实例?
什么集合null
属于?
它是如何在记忆中表现出来的?
pol*_*nts 302
null是什么的实例?
没有,没有任何类型的null
是instanceof
.
instanceof
Run 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(快速成名)的引言结束这个:
我称之为十亿美元的错误.这是
null
1965年的参考文献的发明.那时,我正在设计第一个用于面向对象语言(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。