我正在努力了解
Java中的null是如何工作的.
如果我们为任何对象分配null,那么场景后面会发生什么?它是否分配指向空“对象”或其他内容的内存位置地址?
我已经尝试了以下程序,我已经明白,所有的null指向相同的位置.
但是有人可以告诉我Java如何引发NullPointerException和Java中的null如何工作?
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"); } }
产量
等于.
解决方法
if we assign null to any object what it actually is it some memory location in heap OR anything else.
应该区分参考和对象.您可以为引用分配null.
对象通常使用新的操作符在堆中创建.它返回一个对象的引用.
A a = new A();
类型为A的对象在堆中创建.你被给予参考a.如果现在你分配
a = null;
对象本身仍然驻留在堆中,但是您将无法使用引用a访问它.
请注意,对象可能稍后垃圾回收.
UPD:
我已经创建了这个类来看它的字节码(第一次给我):
public class NullTest { public static void main (String[] args) { Object o = new Object(); o = null; o.notifyAll(); } }
它产生:
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 }
你可以看到设置为null给引用结果:
8: aconst_null 9: astore_1
List of byte code instructions
基本上它把值的值放到堆栈顶部,然后保存到引用.但这种机制和参考实现是JVM内部的.