java 如何引用对象与变量

How does java reference objects vs variables

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package corejava;

/**
 *
 * @author Administrator
 */
public class CoreJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Test test=new Test();
        test.setx(20);
        test.printx();

        Test test1=test;
        test1.setx(40);
        test1.printx();
        test.printx();


        int a=20;
        int b=a;
        a=40;
        System.out.println(a);
        System.out.println(b);

    }
}

输出:

run:
X is 20
X is 40
X is 40
40
20

现在,当我在 'a' 中设置 'x' 的值并将对象 'a' 分配给 'b' 时,'b' 将指向相同的对象对象的值 'a'。所以对 'a' 的任何更改也会更改 'b';

的值

但是当我使用简单变量时,为什么它不像对象那样做。为什么对象存放在堆区,变量存放在栈区

这与堆与堆栈无关,与基元与引用类型的赋值语义有关。

Java 中的对象赋值不会复制,因此 Test test1=test; 只是创建另一个 "name"(另一个变量),它引用内存中的同一对象。

原始赋值确实复制,所以int b=a创建了第二个具有相同值的int,之后它独立于第一个。

Java 仅在堆栈上存储原语(您称之为变量)。 对象是在堆上创建的,只有引用(又是基元)在堆栈上传递。

栈和堆的主要区别在于值的生命周期。 堆栈值仅存在于创建它们的函数范围内。一旦 returns,它们将被丢弃。 然而,堆值存在于堆上。它们在某个时间点创建,并在另一个时间点销毁(通过 GC 或手动,取决于 language/runtime)。