在Java中,null是什么?

284

null是什么?

null是任何实例吗?

null属于哪个集合?

它在内存中如何表示?


yegor256。关于JLS中的null。"Null字面值。null类型只有一个值,即null引用,由ASCII字符组成的null字面值,它始终是null类型。" 关于文章中的要点。'可变和不完整对象'是一种特性。'慢失败'是一种设计能力。'计算机思维与对象思维'只是两种思考方式。'模糊语义'太主观了。'特定错误处理'是另一种处理错误的方式。null是JLS中指定的字面值或其他任何东西,与好坏无关。 - Oleksii Kyslytsyn
14个回答

2

Java中的null与C++中的nullptr类似。

C++中的程序:

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

同样的程序在Java中:

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

现在,你是否从上面的代码中理解了Java中的null是什么?如果没有,我建议你学习C/C++中的指针,然后你就会明白。
请注意,在C中,与C++不同,nullptr未定义,但使用NULL代替,这也可以在C++中使用,但在C++中,nullptr比NULL更可取,因为C中的NULL始终与指针相关,所以在C++中,单词末尾添加了后缀“ptr”,并且所有字母现在都是小写,但这不太重要。
在Java中,每个非原始类型类变量始终是对该类型或继承对象的引用,而null是空类对象引用,而不是空指针,因为在Java中没有“指针”这样的东西,而是使用对类对象的引用,null在Java中与类对象引用有关,因此您也可以称其为“nullref”或“nullrefobj”,但这很长,所以只称其为“null”。
在C++中,您可以使用指针和nullptr值作为可选成员/变量,即没有值的成员/变量,如果它没有值,则等于nullptr,因此Java中的null可以用于示例。

2

Java 中有两种主要类型的分类:原始类型引用类型。声明为原始类型的变量存储值;声明为引用类型的变量存储引用。

String x = null;

在这种情况下,初始化语句声明了一个变量“x”。 “x”存储字符串引用。在这里,它是null。首先,null不是有效的对象实例,因此没有为其分配内存。它只是一个值,表示对象引用当前未引用对象。

0

从JLS中简短明了地回答所有问题的正式答案如下:

3.10.7. 空字面量

空类型只有一个值,即空引用,表示为由ASCII字符组成的空字面量null。

空字面量始终是空类型。

仅分配给空引用类型的引用。您不会将任何值(对象)分配给该引用。 这种分配对于JVM来说很具体,它将占用多少引用以及在哪个内存区域中分配。


0
在我看来,Java 中 null 的一个有趣的理解方式是将其视为不表示信息缺失,而只是可以分配给任何类型引用的字面值。如果你仔细想一下,如果它表示信息缺失,那么 a1==a2 为 true 就没有意义了(如果它们都被赋予 null 值),因为它们实际上可能指向任何对象(我们根本不知道它们应该指向哪些对象)...顺便说一句,在 Java 中 null == null 返回 true。如果 Java 比如说像 SQL:1999 那样,null == null 将返回 unknown(SQL:1999 中布尔值可以取三个值:true、false 和 unknown,但在实际系统中,unknown 实现为 null)... http://en.wikipedia.org/wiki/SQL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接