Java 在main方法发生更改后,传递给构造函数的TreeMap实例的行为是什么

Java 在main方法发生更改后,传递给构造函数的TreeMap实例的行为是什么,java,reference,scope,stack,pass-by-reference,Java,Reference,Scope,Stack,Pass By Reference,假设我有以下设置: TreeMap<Long,ClassA> derkMap = new TreeMap<Long,ClassA>(); derkMap.put(1L,new ClassA()); TreeMap-derkMap=newtreemap(); derkMap.put(1L,新的ClassA()); 请注意,ClassA具有public void doSomething(),调用该函数时将永久更改实例的状态(具体方式与此问题无关)。请注意,一旦调用了doS

假设我有以下设置:

TreeMap<Long,ClassA> derkMap = new TreeMap<Long,ClassA>();
derkMap.put(1L,new ClassA());
TreeMap-derkMap=newtreemap();
derkMap.put(1L,新的ClassA());
请注意,
ClassA
具有
public void doSomething()
,调用该函数时将永久更改实例的状态(具体方式与此问题无关)。请注意,一旦调用了
doSomething()
ClassA
有一个
公共布尔hasItBeenCalled()
,它将返回
true
;否则,如果未调用
doSomething()
,它将返回
false

如果我在主方法中运行以下序列:

  • (1) 将
    derkMap
    实例传递给某些
    ClassB
    的构造函数(即在我的主方法中实例化
    ClassB objectB=newclassb(derkMap);
  • (2) 调用
    derkMap.get(1L.doSomething()来自主方法
  • (3)
    ClassB
    的实例中(即
    objectB
    ),尝试
    derkMap.get(1L).hasItBeenCalled()

将(3)返回
true
false

Java中的所有内容都是按值传递的。推荐阅读:和

编辑:更多推荐阅读:


另一个编辑:这个答案在问题被编辑后不再有意义了,但我离开了它,因为我认为这是OP真正困惑的地方。

它应该返回true。这是因为当您将map作为classB的参数传递时,它的引用是按值复制的,并且它仍然指向原始map。如果在映射内调用元素的方法,它仍然在原始映射上执行这些方法

编辑


顺便说一下,在回答这个问题后,我花了3分钟通过编写示例代码来验证它。我只是想知道你为什么没有亲自尝试过。

我的问题更多的是关于(3)是否会返回
true
false
,而标题就是我回答的。我仍然认为我发布的文章会消除你的困惑。Java总是(按值)传递对对象的引用。总是永远不要复制对象。如果你想要一份,您需要明确地创建它。@Magnilex亲自尝试不会揭示有经验的开发人员可以教给我的边缘案例(如果存在)。@user2763361在您的示例中只有一个ClassA实例-因此,您对它所做的任何更改都将从代码中包含该实例引用的其他部分可见(假设没有线程复杂性)。@user2763361它肯定会回答你的问题。我用不到60秒的时间检查自己(比写问题快),但这不会显示边缘情况。如果将任何对象传递给任何方法,则其引用将按值复制,并始终指向同一对象,直到将其更改为另一个对象。因此,如果没有derkMap=new TreeMap()在您的ClassB中,它仍然指向同一个对象。这意味着您在该引用上调用的任何方法都将在原始对象本身上执行。