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");
        }
    }
}