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

关于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 * 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
from
main

诀窍在于,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
来实现。