我试图在这样的方法中操纵一个对象:
我的班级Problem
:
public class TaxiProblem {
public Problem(final World world, final Agent agent) {
_world = world;
_world.setRandomAgent(_agentPlace);
}
private Place _agentPlace;
// Various other functions
}
并在类.setRandomAgent()
中的函数World
中,我试图按照我想要的那样操纵Place
对象:
public void setRandomAgent(Place agentPlace) {
int rand = _random.nextInt(25);
agentPlace = _places.get(rand);
agentPlace.setHasAgent(true);
}
我基本上想从列表Place
中抓取一个随机_places
并将其放在agentPlace
中的变量.setRandomAgent()
中,而_agentPlace
中的变量将Problem
在_agentPlace
类中。我认为这样可行,因为Java在方法中通过引用传递对象,但它没有,{{1}}保持为空。
答案 0 :(得分:1)
通过这样做
agentPlace = _places.get(rand);
您正在覆盖传递给该方法的引用,并且无法访问您想要更改的对象。
在setRandomAgent
方法中,agentPlace
确实是指向您的_agentPlace
字段的引用,而不是字段本身。在上面粘贴的行中,您所做的是将该引用指向另一个对象。
答案 1 :(得分:0)
_agentPlace = _world.getRandomAgent();
public Place getRandomAgent() {
int rand = _random.nextInt(25);
Place agentPlace = _places.get(rand);
agentPlace.setHasAgent(true);
return agentPlace();
}
将agentPlace
传递给方法时,您将创建引用的副本。因此,如果您修改对象,那么当您返回堆栈时它将起作用。但是重新分配变量会让你失去你正在使用的对象。
答案 2 :(得分:0)
我怀疑你的问题在于实现,因为你对参考传递的理解我认为是正确的。以下代码将产生您期望的结果 - 也就是说,它将首先打印"在更改之前"然后"我被更改了!"。
class Program
{
static void Main(string[] args)
{
var problem = new Problem();
}
}
public class Problem
{
public Problem()
{
var toChange = new ClassToChange();
toChange.ChangeMe = "Before change";
Console.WriteLine(toChange.ChangeMe);
var changer = new ClassThatChanges();
changer.ChangeSomething(toChange);
Console.WriteLine(toChange.ChangeMe);
Console.ReadLine();
}
}
public class ClassToChange
{
public string ChangeMe { get; set; }
}
public class ClassThatChanges
{
public void ChangeSomething(ClassToChange classToChange)
{
classToChange.ChangeMe = "I am changed!";
}
}