gpt4 book ai didi

java - 当您将变量绑定(bind)到某些数据时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 10:46:22 25 4
gpt4 key购买 nike

在Java中,考虑声明和初始化

Object obj = new Object();

在此过程中,我们在某个内存位置创建了一个名为 Object 的对象,并将该内存位置绑定(bind)到变量 obj。

现在考虑java中基本类型的声明和初始化:

int num1Java = 5;
int num2Java = num1Java;

我们再次将它们中的每一个绑定(bind)到 5 的内存位置;是的,我说内存位置是因为 Java 似乎以不同方式处理原始类型,它在另一个内存位置创建 5 的另一个实例,然后将 num2Java 绑定(bind)到包含相同信息的新位置,即 5。我就在这里吗?

考虑 Python 中类似的代码,它打印出 true:

num1Py = 5
num2Py = num1Py
print id(num1Py)==id(num2Py)

教训似乎是,在Python中,像整数这样的“原始类型”被当作Java意义上的对象,换句话说,在python中,我们没有“原始类型”的概念。我说得对吗?

我浏览了很多关于相关主题的网页,但似乎没有一个给出完全满意的答案。非常感谢您的帮助。

最佳答案

We again bind each of them to the memory locations of 5; yes, I said memory locations because Java seems to treat primitive types differently, it creates another instance of 5 at another memory location and then binds num2Java to that new location containing the same information, namely 5. Am I right here?

没有。如果这些

int num1Java = 5;
int num2Java = num1Java;

是局部变量,那么就是在栈上。每个栈帧包含一个 local variable table ,基本上是一个数组,每个变量都有一个元素(比那更聪明)。

int 值用 4 个字节表示。因此,您的局部变量表将包含为您的变量 num1Java 保留的 4 个字节的区域。当以下执行时

int num1Java = 5;

表示值 5 的四个字节被压​​入堆栈,然后复制到局部变量表中属于 num1Java 的偏移量。当你然后做

int num2Java = num1Java;

num1Java 的偏移处读取局部变量表,并将存储的相应字节压入堆栈。然后将那些相同的字节复制到局部变量表中 num2Java 的偏移处。

如果这些是实例变量,那么会发生类似的事情,但不是局部变量表,而是它们所属的对象。每个字段在为该对象分配的内存中都有自己的偏移量。

对于引用类型,相同的概念适用于如上所述的局部变量和字段,除了存储在变量中的值是对对象的引用(或多或少是内存位置)。可以找到引用 JLS 的深入解释 here .

关于java - 当您将变量绑定(bind)到某些数据时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36562052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com