在java中传递对象作为参数

时间:2014-11-07 08:47:25

标签: java object parameter-passing

我试图用Java制作2D游戏。

在这个过程中我很快注意到许多对象需要边界(x1,x2,y1,y2),因此许多方法都有参数(int x1,int x2,int y1,int y2)。

所以我想到了什么,为什么不创建一个具有属性x1,x2,y1,y2的对象IntRectangle(我将其设置为public以提升性能),以及一些有用的方法,如getWidth(),getHeight( )等等。

此时我的代码更清晰,因为变量是公开的,所以我没有失去很多性能。

我很快注意到,与将原始值传递给方法不同,当我在方法中更改它们时,传递的对象的值会发生变化。

例如,使用原始值

`int x = 10;`

subtract5(x);
    print(x);

    void subtract5(int i){
       i -= 5;
    }

这行代码将打印10。 但有一个对象......

class XY{
public int X;
public int Y;
}

main {
 XY xy = new XY();

xy.X = 5;
xy.Y = 10;

changeX (xy);

print xy.X

}

changeX (XY xy2){
xy2.X = 7;
}

打印7;

我开发的理论是int不是指向int的指针,它是存储在寄存器中的int。它在调用方法时被推送,然后在返回时弹回,不变。对象是对对象的引用。对象本身不会被压入堆栈,只是指针。

但是我已经厌倦了用字符串(我知道它们是对象),并且它们在这件事情上表现得像in,这让我感到困惑。也许他们会以某种方式复制出自己的副本?

好吧,我希望有人可以对这个问题有所了解,并告诉我我的推理在哪里出错了,希望能给我一些关于如何清理我的代码,保持性能但不会让它变得令人尊敬的建议。

4 个答案:

答案 0 :(得分:2)

java中的对象是堆空间中的内存块。你传递的只是对这个对象/内存区域的引用。 (引用本身是按值传递的)因此,如果你有一个带有四个整数的Object Rectangle,你的方法将改变堆ara的内存,这是传递的对象引用的引用。

字符串是不可变的 - 因此对象无法更改,并且每个修饰符方法都返回一个新实例。

有关详细信息,请参阅http://javadude.com/articles/passbyvalue.htm

答案 1 :(得分:0)

事实上,Java始终是按值传递的。 特别是Java将对象作为引用传递,并且这些引用按值传递。 在原始类型的情况下,它直接通过值传递。

以下问题的进一步详情:

Is Java "pass-by-reference" or "pass-by-value"?

答案 2 :(得分:0)

字符串是不变的;它们的值在创建后无法更改。如果更改String的值,它将创建一个新的String对象并返回对新String对象的引用,即创建一个新实例.E.g

String str="abc";
str=str+"d";

在这种情况下,在String池中创建一个新的String对象,它现在由str引用。旧字符串是垃圾收集的。

答案 3 :(得分:0)

好吧,我可能有点模糊,但问题不在于java如何传递变量。我只是来自那个线程。我已经想到了,只是String类令我感到困惑。具有公共属性的最终性能提升。我会再做一次尝试,谢谢你的所有答案!