Java内存管理对象与基本类型
关于Java内存管理的几点,我有点困惑 理解了堆栈和堆之间的区别,我去看了一个适当的例子,当我们执行一些代码时,这些内存是什么 我以这几行为例Java内存管理对象与基本类型,java,memory,memory-management,jvm,Java,Memory,Memory Management,Jvm,关于Java内存管理的几点,我有点困惑 理解了堆栈和堆之间的区别,我去看了一个适当的例子,当我们执行一些代码时,这些内存是什么 我以这几行为例 public static void main(String[] args) { int a = 5; calculate(a); System.out.println(a); //will print 5 not 50 } private static void calculatee(int a) { a = a * 1
public static void main(String[] args)
{
int a = 5;
calculate(a);
System.out.println(a); //will print 5 not 50
}
private static void calculatee(int a)
{
a = a * 10;
}
我了解堆栈和堆中发生的事情。没有返回变量,在本例中没有对堆的引用
在本例中:
public static void maina(String[] args)
{
Customer customer = new Customer("John");
setAName(customer);
System.out.println(customer.getName()); // this will return Philip
}
private static void setAName(Customer c)
{
c.setName("Philip");
}
我可以看到对象的状态这次发生了变化
堆栈不是共享的思想线程,但堆是共享的!这对我来说很有意义,当我打印时,对象客户已经将其价值从Jhon更改为Philip!
伟大的一切都有道理
然而,我希望如果我能做到这一点
public static void main(String[] args)
{
Integer i = new Integer(5);
calculate(i);
System.out.println(i); // printing 5 and not 50
}
private static void calculate(Integer i)
{
i = i * 10;
}
我会得到50而不是5
在本例中,Integer是一个对象,我假设它是在堆中创建的
有趣的是,如果我将整数包装在Customer中,我将得到50而不是5
为什么会这样?整数类型不是在堆中创建的吗?这是引用的问题,而不是堆和堆栈的问题 调用方法
calculate
时,传递一个引用(在本例中为i
frommain
)
诀窍在于,Java将在calculate
中创建一个新的引用。因此,i
内部的calculate
和i
内部的main
最初可能“指向”相同的对象,但它们不是“相同的”
因此,如果将i
的calculate
内部更改为乘法生成的对象,则不会自动更改i
的main
内部的引用
对于客户
,情况就不同了。您永远不会更改setAName
中c
指向的位置。您在对象内部更改了一个引用,但customer
在main
内部和setAName
中的c
仍然指向该对象
这里有两张拙劣的绘画图来解释我的意思(前缀为0x
的数字是参考):
对于整数示例:
对于客户示例:
如果有任何问题,请不要犹豫
我希望这能有所帮助。相关:(与堆和堆栈无关,您的术语很混乱。)明白了。。。如果我尝试在setAName()内部执行“c=new Cusotmer(…)”,实际上不会改变客户价值。。。这是因为name是一个成员变量。多谢各位much@OEH好主意!欢迎来到不变性的世界,在这个世界上,引用一旦设置,就永远不会再被更改。(相反,任何转换都将产生一个“新”对象)。这使您可以更简单地思考代码,因为您永远不必记住对象可能在哪里更改—它不会更改。在Java中,这可以通过使用
final
来实现。