操作方法内的对象

时间:2014-05-01 15:14:11

标签: java object methods global-variables pass-by-reference

我试图在这样的方法中操纵一个对象:

我的班级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}}保持为空。

3 个答案:

答案 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!";
    }
}