我试图用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,这让我感到困惑。也许他们会以某种方式复制出自己的副本?
好吧,我希望有人可以对这个问题有所了解,并告诉我我的推理在哪里出错了,希望能给我一些关于如何清理我的代码,保持性能但不会让它变得令人尊敬的建议。
答案 0 :(得分:2)
java中的对象是堆空间中的内存块。你传递的只是对这个对象/内存区域的引用。 (引用本身是按值传递的)因此,如果你有一个带有四个整数的Object Rectangle,你的方法将改变堆ara的内存,这是传递的对象引用的引用。
字符串是不可变的 - 因此对象无法更改,并且每个修饰符方法都返回一个新实例。
有关详细信息,请参阅http://javadude.com/articles/passbyvalue.htm。
答案 1 :(得分:0)
事实上,Java始终是按值传递的。 特别是Java将对象作为引用传递,并且这些引用按值传递。 在原始类型的情况下,它直接通过值传递。
以下问题的进一步详情:
答案 2 :(得分:0)
字符串是不变的;它们的值在创建后无法更改。如果更改String的值,它将创建一个新的String对象并返回对新String对象的引用,即创建一个新实例.E.g
String str="abc";
str=str+"d";
在这种情况下,在String池中创建一个新的String对象,它现在由str引用。旧字符串是垃圾收集的。
答案 3 :(得分:0)
好吧,我可能有点模糊,但问题不在于java如何传递变量。我只是来自那个线程。我已经想到了,只是String类令我感到困惑。具有公共属性的最终性能提升。我会再做一次尝试,谢谢你的所有答案!