Java中什么是null?
什么是Java中什么是null?,java,null,terminology,Java,Null,Terminology,什么是null null是任何事物的实例吗 null属于哪个集合 它在内存中是如何表示的?null关键字是一个表示空引用的文本,一个不引用任何对象的文本。null是引用类型变量的默认值 也可以看看 不,这不是任何事情的实例,instanceof将始终为false null是任何东西的实例吗 否,没有类型null是的实例 在运行时,如果RelationalExpression的值不是null,则instanceof运算符的结果是true,并且可以将引用转换为ReferenceType,而不引发Cl
null
null
是任何事物的实例吗
null
属于哪个集合
它在内存中是如何表示的?null关键字是一个表示空引用的文本,一个不引用任何对象的文本。null是引用类型变量的默认值 也可以看看
不,这不是任何事情的实例,instanceof将始终为false null是任何东西的实例吗 否,没有类型
null
是的实例
在运行时,如果RelationalExpression的值不是null
,则instanceof
运算符的结果是true
,并且可以将引用转换为ReferenceType,而不引发ClassCastException
。否则结果为false
这意味着对于任何类型的E
和R
,对于任何eo
,其中o==null
,o R
的实例总是false
“null”属于哪个集合
还有一种特殊的null类型,即表达式null
的类型,它没有名称。因为null类型没有名称,所以不可能声明null类型的变量或强制转换为null类型。null
引用是null类型表达式的唯一可能值。null
引用始终可以强制转换为任何引用类型。实际上,程序员可以忽略null类型,而只是假装null
只是一个特殊的文本,可以是任何引用类型
什么是空的
正如上面引用的JLS所说,在实践中,您可以简单地假装它“只是一个特殊的文本,可以是任何引用类型”
在Java中,null==null
(在其他语言中并不总是这样)。另请注意,根据合同,其还具有以下特殊属性:
公共布尔等于(对象obj)
对于任何非null
参考值x
,x.equals(null)
应返回false
它也是所有引用类型的默认值(对于包含它们的变量):
- 每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化:
- 对于所有引用类型,默认值为
null
使用方法各不相同。您可以使用它来启用所谓的字段延迟初始化,在实际使用之前,字段的初始值为null
,替换为“真实”值(计算成本可能很高)
还有其他用途。让我们从一个真实的例子来看:
公共静态控制台()
返回:系统控制台(如果有),否则null
这是一种非常常用的模式:null
用于表示对象不存在
下面是另一个用法示例,这次来自:
publicstringreadline()抛出IOException
返回:包含行内容的字符串
,不包括任何行终止字符,或者null
(如果已到达流的结尾)
因此,这里,readLine()
将为每一行返回instanceof String
,直到它最终返回一个null
来表示结束。这允许您按如下方式处理每一行:
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
我们可以设计API,使终止条件不依赖于readLine()
返回null
,但是我们可以看到这种设计的好处是使事情变得简洁。请注意,空行没有问题,因为空行“”!=空
让我们再举一个例子,这次来自:
V get(对象键)
返回指定键映射到的值,如果此映射不包含该键的映射,则返回null
如果此映射允许null
值,则返回值null
不一定表示映射不包含键的映射;映射也可能将键显式映射到null
。containsKey
操作可用于区分这两种情况
在这里,我们开始了解使用null
如何使事情复杂化。第一条语句表示,如果未映射密钥,则返回null
。第二条语句表示,即使映射了密钥,也可以返回null
相反,通过不允许null
键和值使事情变得更简单;其vget(objectkey)
,如果返回null
,则明确表示该键未映射
您可以通读其余的API并找到null
的使用位置和方式。请记住,它们并不总是最佳实践示例
一般来说,null
用作特殊值,表示:
- 未初始化状态
- 终止条件
- 不存在的对象
- 未知值
它在内存中是如何表示的
在爪哇?不关你的事。最好保持这样
null
是件好事吗?
这现在是主观的边缘。有人说null
会导致许多本可以避免的程序员错误。有人说,在像Java这样捕获NullPointerException
的语言中,使用它是很好的,因为在程序员出错时,您会很快失败。有些人通过使用等来避免null
这本身就是一个巨大的话题,所以最好作为答案t来讨论
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
// this is false
boolean nope = (null instanceof String);
// but you can still use it as a String
String x = null;
"abc".startsWith(null);
0
0L
((void*)0)
Object o=new Object();
String x = null;
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}