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

标签 java python binding

在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/

相关文章:

java - 如何使我的查询选择更快地超过 200 万条记录

java - 如何在java中录制声音时减少噪音?

python - from_logits=True 和 from_logits=False 为 UNet 的 tf.losses.CategoricalCrossentropy 获得不同的训练结果

python - 运行带参数的 python 脚本

所有列的 WPF GridView 共享单元格模板

java - 将字符串转换为日期的问题

Python Pandas 连接多个数据框

silverlight - 如何修复 HTTPS Silverlight 应用程序上下文中的 WCF maxClockSkew 问题?

c# - 绑定(bind)到通用属性

php - openJDK 和 PHP SSL 连接失败