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)。
/*
* 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)。