gpt4 book ai didi

Java 空行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:24 24 4
gpt4 key购买 nike

我想了解 null 在 Java 中是如何工作的。

如果我们将 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");
}

}

输出

等于。

最佳答案

if we assign null to any object what it actually is it some memory location in heap OR anything else.

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

A a = new A();

A 类型的对象在堆中创建。您将返回引用 a。如果现在你分配

a = null;

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

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

更新:

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

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
}

可以看到set null to a reference结果:

8: aconst_null
9: astore_1

List of byte code instructions

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

How is reference to java object is implemented?

关于Java 空行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14620869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com