Java Null行为

Gan*_*esh 10 java null nullpointerexception

我试图了解nullJava中的工作原理.

如果我们分配null给任何对象,那么场景背后会发生什么?它是否指定了指向null"对象"或其他内容的内存位置地址?

我已经尝试了以下程序,我已经明白所有人都null指向同一个位置.

但任何人都可以告诉我Java如何抛出NullPointerException以及如何null在Java中运行?

class Animal{
}

class Dog{
}


public class testItClass {

    public static void main(String args[]){
        Animal animal=null;
        Dog dog=null;

        if(((Object)dog) == ((Object)animal))
            System.out.println("Equal");
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

等于.

Nik*_*sov 4

如果我们将 null 分配给任何对象,它实际上是堆中的某个内存位置或其他任何东西。

应区分referenceobject。您可以分配null给参考。通常使用运算符在堆中创建对象new。它返回给您一个对象的引用。

A a = new A();
Run Code Online (Sandbox Code Playgroud)

具有类型的对象A是在堆中创建的。您将得到返回参考a。如果现在你分配

a = null;
Run Code Online (Sandbox Code Playgroud)

对象本身仍然驻留在堆中,但您将无法使用引用来访问它a

请注意,对象稍后可能会被垃圾收集。

更新:

我创建了这个类来查看它的字节码(对我来说是第一次):

public class NullTest {
    public static void main (String[] args) {
        Object o = new Object();
        o = null;
        o.notifyAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

它产生:

C:\Users\Nikolay\workspace\TestNull\bin>javap -c NullTest.class
Compiled from "NullTest.java"
public class NullTest {
  public NullTest();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #3                  // class java/lang/Object
       3: dup
       4: invokespecial #8                  // Method java/lang/Object."<init>":()V
       7: astore_1
       8: aconst_null
       9: astore_1
      10: aload_1
      11: invokevirtual #16                 // Method java/lang/Object.notifyAll:()V
      14: return
}
Run Code Online (Sandbox Code Playgroud)

可以看到设置null为参考结果:

8: aconst_null
9: astore_1
Run Code Online (Sandbox Code Playgroud)

字节码指令列表

基本上,它将 null 值放入堆栈顶部,然后保存到引用中。但这种机制和参考实现是 JVM 内部的。

java对象的引用是如何实现的?