在java中什么是null?

gg0vcinb  于 2021-07-06  发布在  Java
关注(0)|答案(11)|浏览(404)

是什么 null ?
null 任何事情的示例?
这套是什么 null 属于?
它在记忆中是如何表现的?

7vhp5slm

7vhp5slm1#

java(tm)中为空
在c和c++中,“null”是头文件中定义的常量,其值如下:

0

或:

0L

或:

((void*)0)

取决于编译器和内存模型选项。严格来说,null不是c/c++本身的一部分。
在java(tm)中,“null”不是关键字,而是null类型的特殊文本。它可以转换为任何引用类型,但不能转换为任何基元类型,如int或boolean。空文本的值不一定为零。而且不可能强制转换为null类型或声明这种类型的变量。

iaqfqrcu

iaqfqrcu2#

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中的空值是什么吗?如果没有,那么我建议您学习c/c中的指针,这样您就会理解了。
注意,在c中,与c
不同的是,nullptr是未定义的,但是使用null代替,这也可以在c中使用,但是在c中,nullptr比只使用null更可取,因为c中的null总是空的

lx0bsm1f

lx0bsm1f3#

字节码表示
java 的 null 具有直接的jvm支持:使用三条指令来实现它: aconst_null :例如,将变量设置为 null 如在
Object o = null; ifnull 以及 ifnonnull :例如,将对象与 null 如在 if (o == null) 第6章“java虚拟机指令集”接着提到 null 其他说明:它抛出一个 NullPointerException 对他们中的许多人来说。
2.4. "引用类型和值”也提到 null 一般而言:
一个引用值也可以是特殊的null引用,对no对象的引用,在这里用null表示。空引用最初没有运行时类型,但可以强制转换为任何类型。引用类型的默认值为null。

b5lpy0ml

b5lpy0ml4#

null 是特殊的价值,它不是任何事物的示例。显然,这是不可能的 instanceof 什么都行。

sbdsn5lh

sbdsn5lh5#

什么是空值?
没什么。
null是任何事物的示例吗?
不,因为它什么都不是,它不可能是任何事物的示例。
null属于什么集合?
没有任何设置
它在记忆中是如何表现的?
如果一些参考点指向它,比如:

Object o=new Object();

在堆内存中分配给新创建对象的一些空间。o将指向内存中指定的空间。
现在 o=null; 这意味着现在o将不会指向对象的内存空间。

z0qdvdin

z0qdvdin6#

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

vd2z7a6w7#

null是任何事物的示例吗?
不,这就是为什么 null instanceof X 会回来的 false 对于所有类 X . (不要被你能分配的事实所愚弄 null 类型为对象类型的变量。严格地说,赋值涉及隐式类型转换;见下文。)
“null”属于哪一组?
它是null类型的唯一成员,其中null类型的定义如下:
“还有一种特殊的null类型,即表达式null的类型,它没有名称。因为null类型没有名称,所以不可能声明null类型的变量或强制转换为null类型。空引用是空类型表达式的唯一可能值。空引用始终可以转换为任何引用类型。在实践中,程序员可以忽略null类型,而只是假装null只是一个特殊的文本,可以是任何引用类型
什么是空值?
见上文。在某些情况下, null 用于表示“无对象”、“未知”或“不可用”,但这些含义是特定于应用程序的。
它在记忆中是如何表现的?
这是特定于实现的,您将无法看到 null 在纯java程序中(但是 null 在大多数java实现中(如果不是所有的话)表示为零机器地址/指针

njthzxwz

njthzxwz8#

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

zrfyljdw9#

不,这不是任何事物的示例,示例总是假的。

tvmytwxo

tvmytwxo10#

null关键字是一个表示null引用的文本,它不引用任何对象。null是引用类型变量的默认值。
也可以看看
null:java词汇表

fnvucqvd

fnvucqvd11#

null是任何事物的示例吗?
不,没有哪种类型 null 是一个 instanceof .

15.20.2类型比较运算符instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

在运行时 instanceof 操作员是 true 如果关系表达式的值不是 null 引用可以被强制转换为referencetype而不引发 ClassCastException . 否则结果就是 false .
这意味着对于任何类型 E 以及 R ,对于任何 E o ,在哪里 o == null , o instanceof R 总是 false .
“null”属于哪一组?

jls 4.1类型和值的种类

还有一种特殊的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 .
它也是所有引用类型的默认值(对于包含它们的变量):

jls 4.12.5变量初始值

每个类变量、示例变量或数组组件在创建时都会使用默认值进行初始化:
对于所有引用类型,默认值为 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);
}

我们可以设计api,使终止条件不依赖于 readLine() 返回 null ,但我们可以看到,这种设计有使事情简洁的好处。请注意,空行没有问题,因为空行 "" != null .
让我们再举一个例子,这次从 java.util.Map<K,V> : V get(Object key) 返回指定键Map到的值,或 null 如果此Map不包含键的Map。
如果这张Map允许的话 null 值,然后返回 null 不一定表示Map不包含键的Map;也有可能Map显式地将键Map到 null . 这个 containsKey 手术可以用来区分这两种情况。
在这里,我们开始了解如何使用 null 会使事情复杂化。第一条语句说如果密钥没有Map, null 已返回。第二条语句说即使键被Map, null 也可以退货。
相反, java.util.Hashtable 通过不允许 null 关键和价值观;它 V get(Object key) ,如果返回 null ,明确表示键未Map。
您可以通读其余的api并找到它们的位置和方式 null 已使用。请记住,它们并不总是最佳实践的例子。
一般来说, null 用作特殊值,表示:
未初始化状态
终止条件
不存在的对象
未知值
它在记忆中是如何表现的?
在 java ?不关你的事。最好保持这样。

空是件好事吗?

这现在是主观的边缘。有人这么说 null 导致许多本可以避免的程序员错误。有人说,在一种语言,捕捉 NullPointerException 像java一样,使用它是很好的,因为在程序员出错时会很快失败。有些人避免 null 通过使用空对象模式等。
这本身就是一个巨大的主题,所以最好作为另一个问题的答案来讨论。
最后,我将引用 null 他本人,c.a.r.hoare(因快速排序而出名):
我称之为我的十亿美元的错误。这是人类的发明 null 1965年的参考文献。当时,我正在设计第一个面向对象语言(algolw)中引用的综合类型系统。我的目标是确保引用的所有使用都是绝对安全的,由编译器自动执行检查。但我还是忍不住要把 null 引用,只是因为它很容易实现。这导致了无数的错误、漏洞和系统崩溃,在过去的四十年中,这些错误、漏洞和系统崩溃可能造成了数十亿美元的痛苦和损失。
这个演示的视频更深入;这是推荐的手表。

相关问题