【问题标题】:Java Regarding Object Scope and Modification on the ObjectJava关于对象范围和对象修改
【发布时间】:2013-06-07 16:48:12
【问题描述】:

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

//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>();

在我的程序开始时,我搜索了一些文件以构造新的 MyObject 对象,然后将它们放入 HashMap 中,这是唯一应该创建新的 MyObject 的时间。因此,在整个程序中,我通过获取与 String 键匹配的值来获取 HashMap 中的对象,一旦获得该对象,我就可以使用如下不同的 setter 方法对其进行处理:

MyObject object1 = MyObjects.get("anObject");

object1.setVar1("This is the objects new var1 string value");

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

object1.getList().add("new value in the object1 list"); 

这会将值添加到 hashMap 中的对象吗?我想知道这是因为自从我打电话以来: MyObject object1 = MyObjects.get("anObject"); 似乎它可能正在创建该类的新实例或只是将其复制过来,并且对该 object1 对象的任何更改都不会对 HashMap 中的对象进行。

我是否正确,对从 HashMap 获得的对象的任何值所做的更改将被放回 HashMap 中的对象? 抱歉这个愚蠢的问题。

【问题讨论】:

  • 是的,因为它们是同一个对象。你只是在传递引用。

标签: java arrays object scope


【解决方案1】:

您是对的:您从 HashMap 中检索到的对象内部的任何更改都将在 HashMap 中发生更改,因为当您从任何数据结构中检索对象时,您实际上得到的是一个指向对象的指针,所以 HashMap 和你得到的指针都指向同一个对象数据。唯一不同的情况是您存储原语(如 int、double、float 等)或重构从 HashMap 接收到的对象。

【讨论】:

    【解决方案2】:

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

    这意味着对您的 Object 的引用的每个副本都是同一个对象,无论您尝试更改它的任何位置,都会更改相同的对象。

    对象本身只会在你复制的时候被复制,而不是隐式复制。

    【讨论】:

    • 好听!我对我自己很生气,我对此并不积极!我正在尝试使用更多的 OO 方法开始编码,因为我以前没有。谢谢你的好答案!
    • 注意:C++ 不会以同样的方式做到这一点。它具有默认的复制构造函数,如果您分配“MyObject o = x;”,这会将x 的值复制到另一个对象o。在Java 中,MyObject 隐含地只是一个引用,为什么?因为没有其他选项。
    • 我还有一个问题,不妨在这里问一下。如果我在 HashMap 中的对象中有一个 void delete() 方法,并且当调用此方法时,它会将自身从哈希图中删除,这是否合法?比如:myObject.delete();将是 myObjects.remove("anObject");
    猜你喜欢
    • 2014-02-12
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多