/*
* 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'的值;
但是当我使用简单变量时,为什么它不像对象那样做。为什么对象存储在堆中,而变量存储在堆栈区域中。
答案 0 :(得分:4)
这与堆与堆栈无关,而与基元与引用类型的赋值语义有关。
Java中的对象赋值不会复制,因此Test test1=test;
只会创建另一个" name" (另一个变量),它引用内存中的同一个对象。
原语赋值会复制,因此int b=a
会创建一个具有相同值的第二个int,该值与之后的第一个int无关。
答案 1 :(得分:1)
Java只在堆栈上存储基元(你称之为变量)。 对象是在堆上创建的,只有引用(它们又是基元)在堆栈中传递。
堆栈和堆之间的主要区别是值的生命周期。 堆栈值仅存在于它们创建的函数范围内。一旦返回,它们将被丢弃。 然而,堆值存在于堆上。它们是在某个时间点创建的,并在另一个时间点被破坏(通过GC或手动,取决于语言/运行时)。