我可以为同一个变量使用两个名字吗?

时间:2010-03-19 09:27:23

标签: java oop variable-assignment

问题的简短版本:

我这样做:x = y。然后我更改xy保持不变。我想要的是“绑定”xy,以便每当我更改y时我都会更改x

扩展版(包含一些细节):

我写了一个类(“第一”类),它生成另一个类(“第二”类)的对象。更详细地说,第二类的每个对象都有一个名称作为唯一标识符。我使用第二个类中的对象名称调用第一个类的静态方法。第一个类检查是否已生成此类对象(如果它存在于第一个类的静态HashMap中)。如果已经存在,则返回。如果它还没有,则创建它,添加到HashMap并返回。

然后我遇到以下问题。在我的程序的某个阶段,我从第一个类的HashMap中获取一个具有特定名称的对象。我对此对象执行某些操作(例如,更改某些字段的值)。但是HashMap中的对象看不到这些变化!所以,实际上,我没有从HashMap中“获取”一个对象,我“创建了这个对象的副本”,这是我想要避免的。

增加:

正如答案中提到的那样,我不应该有所描述的行为。而我实际上没有它(我误解了我的程序的行为)。我用对象的名字弄错了。我希望通过名称来引用现有对象,并且使用了错误的名称,因此我实际创建了一个新对象,这就是为什么我没有看到我对旧对象所做的任何更改。

但无论如何,我了解到如果我从HashMap中获取一个对象并对该对象进行一些更改,它们也将应用于HashMap中的“坐”对象。所以,我可以给同一个对象提供不同的引用,我可以使用这些引用中的任何一个来改变对象的状态。

感谢您的回答。

5 个答案:

答案 0 :(得分:6)

好吧,你不能为变量添加别名。但是,您应该知道,如果您对xy引用的对象进行了更改,那么这些更改将通过任一变量显示。引用类型变量的值是引用,而不是对象本身。

声音就像你的情况一样 - 除非你明确地放置了一些克隆,每个名字实际上应该只有一个对象,并且你对它做了任何改变通过一个变量的对象应该通过其他人或通过地图可见。对象克隆不仅会自动发生。

我建议你尝试创建一个简短但完整的示例程序来演示这个问题 - 我怀疑在这样做的过程中,你会在你的代码中找到一个解释行为的错误。

答案 1 :(得分:1)

我开始写一个很长的答案,但Jon更快。正如他所说,你想要的行为应该是默认行为,除非你自己做了一些事情。

答案 2 :(得分:1)

这是一个有趣的问题,它将把我们带入=运营商背后的魔力。

此运算符是赋值运算符,它将为变量x分配变量y的引用。也就是说,如果引用y处的对象发生变化,则引用的对象也将被更改。

当您致电addd时,通常就是收藏品的情况。如果x和y是对同一集合的引用,则在此集合上调用add将更新两个引用。

但是,我认为你就是这种情况,String对象的情况并非如此。当您尝试更新String时,例如通过调用+,Java编译器实际上使用新值创建另一个变量并更改引用。因此,分配先前的值不会反映新值的变化。

答案 3 :(得分:1)

  

在我的程序的某个阶段,我从第一个类的HashMap中获取一个具有特定名称的对象。我对此对象执行某些操作(例如,更改某些字段的值)。但是HashMap中的对象看不到这些变化!所以,实际上,我没有从HashMap中“获取”一个对象,我“创建了这个对象的副本”,这是我想要避免的。

HashMapget()获取对象不是复制操作。因此,除非您自己明确地复制它,否则这听起来像是一个线程问题;实际上,从线程X更改对象的字段可能对线程Y可见也可能不可见,即使它与您正在查看的对象完全相同。这是一个非常棘手的领域;我建议获得Java Concurrency In Practice的副本。

答案 4 :(得分:0)

使用JavaFX:

var y = 10;
def x = bind y;

println(x); // prints 10

y = 12;

println(x); // prints 12

好吧,不是你问题的答案,但我喜欢它的约束机制^^。