Java中的null是什么?

时间:2010-04-25 05:57:39

标签: java null terminology

什么是null

null是否是任何事实?

null属于哪一套?

它如何在记忆中表现出来?

14 个答案:

答案 0 :(得分:295)

答案 1 :(得分:29)

  

null是否为任何实例?

没有。这就是null instanceof X将为所有类false返回X的原因。 (不要被你可以将null分配给类型为对象类型的变量这一事实所愚弄。严格地说,赋值涉及隐式类型转换;请参阅下文。)

  

'null'属于哪个集合?

它是null类型的唯一成员,其中null类型定义如下:

“还有一个特殊的null类型,表达式的类型为null,没有名称。因为null类型没有名称,所以无法声明null类型的变量或者转换为null类型.null引用是null类型表达式唯一可能的值。null引用总是可以转换为任何引用类型。实际上,程序员可以忽略null类型,只是假装null只是一个特殊的可以是任何引用类型的文字。“ JLS 4.1

  

什么是null?

见上文。在某些情况下,null用于表示“无对象”或“未知”或“不可用”,但这些含义是特定于应用程序的。

  

它如何在记忆中表现出来?

这是特定于实现的,您将无法在纯Java程序中看到null的表示。 (但是null在大多数(如果不是全部)Java实现中都表示为零机器地址/指针。)

答案 2 :(得分:13)

什么是null?

没什么。

null是否为任何实例?

不,因为它什么都不是它不能成为任何事物的实例。

null属于哪个集合?

没有任何设置

它在内存中的表现如何?

如果某些参考指向它:

Object o=new Object();

在堆内存中分配给新创建对象的一些空间。 o将指向内存中指定的空间。

现在o=null;

这意味着现在o不会指向对象的内存空间。

答案 3 :(得分:8)

不,它不是任何实例,instanceof总是错误的。

答案 4 :(得分:6)

null关键字是表示空引用的文字,不引用任何对象的文字。 null是引用类型变量的默认值。

也许可以看看

null : Java Glossary

答案 5 :(得分:5)

Java中的空(tm)

在C和C ++中,“NULL”是头文件中定义的常量,其值如下:

    0

或:

    0L

或:

    ((void*)0)

取决于编译器和内存模型选项。严格来说,NULL不是C / C ++本身的一部分。

在Java(tm)中,“null”不是关键字,而是null类型的特殊文字。它可以转换为任何引用类型,但不能转换为任何基本类型,如int或boolean。 null文字不一定具有零值。并且无法转换为null类型或声明此类型的变量。

答案 6 :(得分:4)

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

答案 7 :(得分:4)

字节代码

Java的null具有直接的JVM支持:使用三条指令来实现它:

  • aconst_null:例如将变量设置为null,如Object o = null;
  • ifnullifnonnull:例如:将对象与null
  • 中的if (o == null)进行比较

Chapter 6 "The Java Virtual Machine Instruction Set "然后提及null对其他指令的影响:它会为其中许多指令抛出NullPointerException

2.4. "Reference Types and Values"也用通用术语提到null

  

参考值也可以是特殊的空引用,对无对象的引用,这里将用null表示。 null引用最初没有运行时类型,但可以转换为任何类型。引用类型的默认值为null。

答案 8 :(得分:3)

null是特殊值,它不是任何事物的实例。显然,它不能是instanceof任何东西。

答案 9 :(得分:2)

null是一个特殊值,不是任何类的实例。以下程序说明了这一点:

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

答案 10 :(得分:1)

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是null类对象引用,但不是空指针,因为在Java中没有这样的东西“指针”,但是相反,使用对类对象的引用,而Java中的null与类对象引用相关,因此您也可以将其称为“nullref”或“nullrefobj”,但这很长,所以只需将其称为“null”。

在C ++中,你可以使用指针和可选成员/变量的nullptr值,即没有值的成员/变量,如果它没有值,那么它等于nullptr,所以如何null例如,可以使用Java。

答案 11 :(得分:0)

在我看来,在java中看到null的有趣方法是将其视为不表示缺少信息的东西,而只是作为可以分配给任何类型的引用的文字值。如果你考虑它,如果它表示缺少信息,那么a1 == a2为真是没有意义的(如果它们都被赋值为null),因为它们可能真的可以指向任何对象(我们只是不知道他们应该指向哪些对象)...顺便说一句,null == null在java中返回true。如果java例如就像SQL:1999然后null == null将返回unknown(SQL中的布尔值:1999可以采用三个值:true,false和unknown但实际上未知在实际系统中实现为null)... {{3 }}

答案 12 :(得分:0)

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

String x = null;

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

答案 13 :(得分:0)

简短而精确的答案,正式回答了JLS的所有问题:

  
    

3.10.7。 Null Literal

  
     

null类型有一个值,空引用,由   null literal null,由ASCII字符组成。

     

null文字始终为null类型。

仅分配分配给null的类型的引用。您没有为引用分配任何值(对象)。 这种分配特定于JVM将花费多少引用以及将分配哪个内存区域。