关于对象范围和对象修改的Java

关于对象范围和对象修改的Java,java,arrays,object,scope,Java,Arrays,Object,Scope,我有一个问题,关于我猜对象的范围,以及对象所持有的值在某些条件下是否会改变。 例如,我创建了一个类,其中我需要构造一个以上的对象实例,但这些实例需要在整个程序中使用和修改,并且在创建第一个实例后不应创建新实例(我不知道这将遵循什么设计模式,如果有的话)。我设计对象的方式与以下类似: //basic constructor class public class MyObject { private String var1; private int var2; private boolean vr

我有一个问题,关于我猜对象的范围,以及对象所持有的值在某些条件下是否会改变。 例如,我创建了一个类,其中我需要构造一个以上的对象实例,但这些实例需要在整个程序中使用和修改,并且在创建第一个实例后不应创建新实例(我不知道这将遵循什么设计模式,如果有的话)。我设计对象的方式与以下类似:

//basic constructor class
public class MyObject {

private String var1;
private int var2;
private boolean vr3

public MyObject(String param1, int param2, boolean param3) {
    var1 = param1;
    var2 = param2;
    var3 = param3;
}

//getter and setter methods

}

//in main class
Map<String, MyObject> myObjects = new HashMap<String, MyObject>();
object1.setVar1(“这是objects新的var1字符串值”)

上面的代码应该更改HashMap中键“anObject”下的对象中的字符串值。但我想知道这是否也适用于列表之类的东西?比如说,我有一个列表作为对象中的一个值,如果我从HashMap中获取该对象,并调用类似以下内容:

object1.getList().add("new value in the object1 list"); 
这会给hashMap中的对象添加值吗?我想知道这一点,因为我打过电话: MyObject object1=MyObjects.get(“anObject”); 它似乎可以创建该类的新实例,或者只是将其复制过来,并且对该object1对象的任何更改都不会对HashMap中的对象进行

对从HashMap获取的对象的任何值所做的更改都将放回HashMap中的对象,这一点正确吗?
抱歉这个愚蠢的问题。

Java是按值传递的,而
MyObject
是一个引用,它是按值传递的

这意味着对对象引用的每个副本都是同一个对象,无论您在何处尝试更改它,都会更改同一个对象


对象本身只有在您复制它时才会被复制,而不是隐式复制。

Java是按值传递的,但是
MyObject
是一个引用,它是按值传递的

这意味着对对象引用的每个副本都是同一个对象,无论您在何处尝试更改它,都会更改同一个对象


对象本身只有在您复制时才会被复制,而不是隐式复制。

您是正确的:您从HashMap检索到的对象内部所做的任何更改都将在HashMap中被更改,因为当您从任何数据结构检索对象时,您实际上得到了一个指向对象的指针,因此,HashMap和返回的指针都指向相同的对象数据。只有在存储原语(如int、double、float等)或重建从HashMap接收到的对象时,情况才会有所不同。

您是正确的:对从HashMap检索到的对象内部所做的任何更改都将在HashMap中更改,当您从任何数据结构检索对象时,实际上您得到的是一个指向对象的指针,因此HashMap和返回的指针都指向相同的对象数据。只有在存储原语(如int、double、float等)或重建从HashMap接收到的对象时,情况才会有所不同。

是,因为它们是相同的对象。您只是在传递引用。是的,因为它们是同一个对象。你只是在传递参考资料。好的,很高兴听到!我很生气,因为我对这件事没有把握!我正试图用更多的面向对象方法开始编码,因为我以前没有这样做过。谢谢你的回答!注:C++不这样做。它有默认的复制构造函数,如果您指定“MyObject o=x;`这将把
x
的值复制到另一个对象
o
。在Java中,
MyObject
隐式地只是一个引用,为什么?因为没有其他选项。我还有一个问题,不妨在这里问一下。如果我有一个void delete()方法,如果调用此方法时,它将自身从HashMap中删除,这是否合法?例如:myObject.delete();将是myObject.remove(“anObject”)我很生气,我对自己不积极,我尝试用更多的面向对象方法开始编码,就像以前一样。谢谢:好的答案!注意:C++没有用同样的方式来做。它有默认的复制构造函数,如果你分配了“MyObjultOx=;这将把
x
的值复制到另一个对象
o
。在Java中,
MyObject
隐式地只是一个引用,为什么?因为没有其他选择。我还有一个问题,我不妨在这里问一下。如果我在HashMap中的对象中有一个void delete()方法,并且如果调用此方法时,它将自己从HashMap中删除,这是否合法?比如:myObject.delete();将是MyObject。删除(“anObject”);
object1.getList().add("new value in the object1 list");