在Java中,请考虑声明和初始化
Object obj = new Object();
在此过程中,我们在某个内存位置创建了一个名为Object的对象,并将内存位置绑定到变量obj。
现在考虑在Java中原始类型的声明和初始化:
int num1Java = 5;
int num2Java = num1Java;
我们再次将它们各自绑定到5的存储位置;是的,我说了内存位置,因为Java似乎对原始类型的处理不同,它在另一个内存位置创建了另一个5实例,然后将num2Java绑定到包含相同信息的新位置,即5。我在这里吗?
考虑一下Python中类似的代码,其输出为true:
num1Py = 5
num2Py = num1Py
print id(num1Py)==id(num2Py)
这个教训似乎是在Python中,从Java的角度来看,像整数这样的“原始类型”被视为对象,换句话说,在python中,我们没有“原始类型”的概念。我对吗?
我浏览了很多有关主题的网络,但是似乎都没有一个完全令人满意的答案。非常感谢您的帮助。
我们再次将它们各自绑定到5的存储位置;是的,我说了内存位置,因为Java似乎对原始类型的处理不同,它在另一个内存位置创建了另一个5实例,然后将num2Java绑定到包含相同信息的新位置,即5。我在这里吗?
不,如果这些
int num1Java = 5;
int num2Java = num1Java;
是局部变量,则它们在堆栈上。每个堆栈帧都包含一个局部变量表,基本上是一个数组,每个变量都有一个元素(比这聪明一点)。
一个int
值用4个字节表示。因此,您的本地变量表将包含为您的变量保留的4个字节的区域num1Java
。当执行以下命令时
int num1Java = 5;
代表该值的四个字节5
被压入堆栈,然后在归因于的偏移量处复制到局部变量表中num1Java
。当你做的时候
int num2Java = num1Java;
读取局部变量表的偏移量为num1Java
,并将存储的相应字节压入堆栈。然后将这些相同的字节以的偏移量复制到局部变量表中num2Java
。
如果这些是实例变量,则会发生类似的情况,但是您要拥有它们所属的对象,而不是局部变量表。每个字段在为该对象分配的内存中都有其自己的偏移量。
对于引用类型,相同的概念适用于如上所述的局部变量和字段,除了存储在变量中的值是对象的引用(或多或少的存储位置)。可以在此处找到JLS引文的深入解释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句