在java中,两个对象是否需要具有相同的内存地址才能指向相同的对象
在java中创建两个对象时,如果将一个对象设置为另一个对象,会发生什么情况。当我们将该对象的哪一部分设置为与另一部分相等时,该对象的哪一部分会发生变化。是存储在堆栈中的内存地址被更改了,还是它们都开始指向堆内存中的同一个对象而不更改存储在堆栈中的内存地址 我知道最初创建时,它们没有相同的内存地址,也没有指向相同的对象 e、 g 测试t1=新测试() 测试t2=新测试() t2=t1 这个语句“t2=t1”实际上要改变t2的哪一部分 在java中创建两个对象时,分配一个对象会发生什么 相等 这是没有意义的-您不会将对象指定给另一个对象 有两件事很简单——指向内存中对象的指针(实际上是引用)和内存中的对象。您不会将对象彼此分配,而是将内存位置分配给指针。因此,最终将有两个指针指向同一内存区域+垃圾回收幻影对象在java中,两个对象是否需要具有相同的内存地址才能指向相同的对象,java,Java,在java中创建两个对象时,如果将一个对象设置为另一个对象,会发生什么情况。当我们将该对象的哪一部分设置为与另一部分相等时,该对象的哪一部分会发生变化。是存储在堆栈中的内存地址被更改了,还是它们都开始指向堆内存中的同一个对象而不更改存储在堆栈中的内存地址 我知道最初创建时,它们没有相同的内存地址,也没有指向相同的对象 e、 g 测试t1=新测试() 测试t2=新测试() t2=t1 这个语句“t2=t1”实际上要改变t2的哪一部分 在java中创建两个对象时,分配一个对象会发生什么 相等 这是没
Test t1= new Test();
此行创建一个新的Test
对象,并将其分配给t1
Test t2= new Test();
此行创建一个附加的Test
对象,并将其分配给t2
t2=t1;
这类似于将分配给t1
的对象分配给t2
。原来的t2对象现在丢失,并将在下次运行垃圾回收器时销毁
This statement "t2=t1" is going to change actually what part of t2?
把t2看作一个指针。直到那一行指向一个对象,现在它指向另一个对象。这两个对象的内部不会被这一行改变,只有指针。我的建议是忘记“内存地址”和“堆栈”之类的东西。它们不是Java编程所需要的概念 您需要的概念是“对象”和“引用” 类似于
newtest()
的表达式创建类Test的对象。表达式的结果是对对象的引用
变量(不包括int、double等基本类型)是一个包含引用的插槽,或者是一个根本不是引用的null
。类似于testt1
的声明表示名为t1的变量可以保存对类Test对象的引用
t1不是一个对象,它是一个引用。对象不称为t1,引用它的变量(当前)称为t1。(尽管我们可以随意地说‘objectt1’,因为这个对象没有其他名称)
赋值/初始化(我们可以将它们视为等价的)将右侧表达式的值存储到左侧的变量中
把所有这些放在一起,testt1=newtest()
声明了一个名为t1的变量,该变量可以保存对测试对象的引用;创建一个测试对象;对该测试对象的引用存储在t1中。注意t1不是对象;t1指的是对象
同样地,testt2=newtest()
声明一个名为t2的变量,该变量获取对不同测试对象的引用
现在我们执行t2=t1
——t2的内容被t1的内容替换。换句话说,t2和t1具有相同的值,该值恰好是对创建的第一个测试对象的引用。自然,t2现在没有第二个测试对象的参考;在本例中,没有任何内容引用第二个对象,因此它是不可访问的,并且必须保持这种状态(因为访问它的唯一方法是通过我们不再拥有的引用)
强调这一点:指定引用不会更改对象本身
我们一次也不需要在这里提到内存地址。它们
都开始指向堆内存中的同一个对象
,所以答案是否定的。。。???它们可以指向相同的东西而不改变堆栈中的内存地址?对吗?t2的值也会改变。实际上,你的问题没有意义,因为这两个事件都发生了,让你知道我从哪里得到了这个解释,你写这篇文章的时候实际上在做什么,把t1对象的地址分配给t2对象。假设t1的内存地址是0x33d444,t2的地址是0x99f775。在执行上述赋值之后,t2现在在堆栈内存中保存这个地址:0x99f775,它引用与t1相同的对象。堆上的t2对象仍然存在,但无法访问No-assign意味着赋值。“assign”意味着“set it equal”不,assign意味着赋值。没有“将其设置为相等”操作。我认为,如果你使用正确的命名,你就不会有这个问题,因为“赋值”是一种自我解释。你的意思是指针独立于存储在堆栈中的内存地址值吗?更清楚地说,我的问题是,一个对象指向不同对象有多少种方式。1:更改其内存地址值,从而使其指向其他内容。还有什么?测试t1=新测试()//假设t1有内存地址“ABC”Test t2=new Test()//假设t2具有内存地址“DEF”t2=t1//t2现在的内存地址改为“DEF”,因为这是t2开始指向和t1相同的对象的唯一方式,对吗?你说的“has”是什么意思?这是不明确的,因为它可能指的是t2的“地址”或t2包含的内容。如果将“has”替换为“contains”,那么您是正确的,但有一点需要注意:我们不知道,也不需要知道,对对象的引用是否实际上是该对象的内存地址。它以语言理解的方式“指”它;这才是最重要的。