Java 当我们访问实例变量时,JVM是否创建了一个新引用?

Java 当我们访问实例变量时,JVM是否创建了一个新引用?,java,reference,jvm,Java,Reference,Jvm,假设我有一个指向对象的实例变量。当我访问该实例变量时,它会在内存中创建一个新引用吗 public class Test { public Test2 t1= new Test2(); } public class Test2 { } Test obj = new Test(); 当我们访问obj.t1时,下面这行是否在内存中创建了一个新的引用 System.out.println(obj.t1==null) 你必须考虑你例子中的事件顺序。 您正在实例化一个Test实例并

假设我有一个指向对象的实例变量。当我访问该实例变量时,它会在内存中创建一个新引用吗

public class Test {

    public Test2 t1= new Test2();

}

public class Test2 {


}


Test obj = new Test();

当我们访问obj.t1时,下面这行是否在内存中创建了一个新的引用

System.out.println(obj.t1==null)

你必须考虑你例子中的事件顺序。

您正在实例化一个Test实例并将其分配给引用obj。在您的示例中,t1是Test的实例变量,因此在实例化obj的同时,在堆中为Test2的实例分配空间。最终的效果是在分配obj时分配所有堆空间


调用println时,您使用的是对obj的现有引用,因此不会通过它为obj或t1引用进行分配。

“下面的行是否在内存中创建新引用”否。
obj.t1
Test obj=new Test()上初始化行。你认为它为什么需要这样做?引用是一个值。该值可以有很多副本,不一定“在内存中”。例如,引用可以存储在CPU寄存器中
System.out.println(obj.t1==null)
临时创建存储在
obj.t1
中的引用的副本,就像您执行
System.out.println(obj.someIntField==0)操作时它会临时创建int值的副本一样这种“复制”是最简单的操作之一…这里没有静态初始化。