Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同一个变量可以有两个名称吗?_Java_Oop_Variable Assignment - Fatal编程技术网

Java 同一个变量可以有两个名称吗?

Java 同一个变量可以有两个名称吗?,java,oop,variable-assignment,Java,Oop,Variable Assignment,问题的简短版本: 我知道:x=y。然后我改变x,而y则保持不变。我想要的是“绑定”x和y,这样每当我更改x时,我都会更改y 扩展版本(包含一些详细信息): 我编写了一个类(“第一”类),它生成另一个类(“第二”类)的对象。更详细地说,第二个类的每个对象都有一个名称作为唯一标识符。我使用第二个类的对象名调用第一个类的静态方法。第一个类检查是否已经生成了这样的对象(如果它存在于第一个类的静态HashMap中)。如果已经存在,则返回。如果它还不存在,则创建它,将其添加到HashMap并返回 然后我有以

问题的简短版本:

我知道:
x=y
。然后我改变
x
,而
y
则保持不变。我想要的是“绑定”
x
y
,这样每当我更改
x
时,我都会更改
y

扩展版本(包含一些详细信息):

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

然后我有以下问题。在程序的某个阶段,我从第一个类的HashMap中获取一个具有特定名称的对象。我用这个对象做了一些事情(例如更改一些字段的值)。但是HashMap中的对象没有看到这些更改!所以,事实上,我并没有从HashMap中“获取”一个对象,而是“创建一个副本”,这是我想要避免的

添加:

正如回答中提到的,我不应该有所描述的行为。实际上我没有(我误解了我程序的行为)。我把物体的名字弄错了。我想通过名称引用现有对象,但使用了错误的名称,因此我实际上创建了一个新对象,这就是为什么我没有看到对旧对象所做的任何更改

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


谢谢你的回答

嗯,你不能给变量加别名。但是,您应该注意,如果您对
x
y
都引用的对象进行了更改,则这些更改将通过任一变量可见。引用类型变量的值是引用,而不是对象本身

听起来在您的情况下应该是这样的-除非您明确地进行了一些克隆,否则每个名称实际上应该只有一个对象,并且您通过一个变量对该对象所做的任何更改都应该通过其他变量或映射可见。对象克隆并不是自动发生的


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

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

这是一个有趣的问题,这将给我们带来
=
操作符背后的魔力

此运算符是赋值运算符,它将变量
x
的引用赋值给变量
y
。也就是说,如果参考
y
处的对象发生变化,则参考处的obejct也会发生变化

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

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

在程序的某个阶段,我从第一个类的HashMap中获取一个具有特定名称的对象。我用这个对象做了一些事情(例如更改一些字段的值)。但是HashMap中的对象没有看到这些更改!所以,事实上,我并没有从HashMap中“获取”一个对象,而是“创建一个副本”,这是我想要避免的

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

使用JavaFX:

var y = 10;
def x = bind y;

println(x); // prints 10

y = 12;

println(x); // prints 12

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

为了完整性:除了使用原语时,比如int。@Thilo:他说的是“类的对象”,以及改变对象中字段的值。真的吗?如果我在一个线程中更改对象,我将不会在另一个线程中看到这些更改?这会让我的生活变得复杂!现在我很沮丧,不幸的是这是真的。这个问题可以通过使用锁/同步或易变变量来解决——合适的方法取决于很多事情——但这确实是一个很长的问题,需要学习才能正确理解。从上面的书开始,或者从Riduidel开始,我尝试:
y=2;x=y;y=3
。然后我打印了
x
y
x
仍然等于
2
。所以,
x
是对
y
的引用,我改变了
y
,而
x
没有改变。酷!很高兴知道。谢谢。这太复杂了。字符串的工作原理与任何其他引用类型相同:变量的值是引用,而不是对象。当您执行赋值时,它只是根据exp的RHS将变量的值作为引用