java如何引用对象与变量

时间:2015-02-12 14:28:33

标签: java heap

/*
 * 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'的值;

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

2 个答案:

答案 0 :(得分:4)

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

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

原语赋值会复制,因此int b=a会创建一个具有相同值的第二个int,该值与之后的第一个int无关。

答案 1 :(得分:1)

Java只在堆栈上存储基元(你称之为变量)。 对象是在堆上创建的,只有引用(它们又是基元)在堆栈中传递。

堆栈和堆之间的主要区别是值的生命周期。 堆栈值仅存在于它们创建的函数范围内。一旦返回,它们将被丢弃。 然而,堆值存在于堆上。它们是在某个时间点创建的,并在另一个时间点被破坏(通过GC或手动,取决于语言/运行时)。