我正在尝试用 Java 制作 2d 游戏。
在这个过程中,我很快注意到许多对象需要边界(x1,x2,y1,y2),因此许多方法都有参数(int x1,int x2,int y1,int y2)。
所以我想到底是怎么回事,为什么不创建一个具有 x1、x2、y1、y2 属性(我将其设置为公共(public)以提高性能)的对象 IntRectangle,以及一些有用的方法,如 getWidth()、getHeight( )等
此时我的代码更加简洁,并且由于变量是公共(public)的,因此我没有损失太多性能。
我很快注意到,与将原始值传递到方法中不同,当我在方法中更改传递对象的值时,它们的值会发生变化。
例如,使用原始值
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。它在调用方法时被推送,然后在返回时弹出,保持不变。对象是对对象的引用。对象本身并没有被压入堆栈,只是指针被压入堆栈。
但是我已经厌倦了字符串(我知道它们是对象),并且它们在这件事上的行为就像整数一样,这让我感到困惑。也许他们以某种方式复制了自己?
好吧,我希望有人能对这个问题有所了解,并告诉我我的推理在哪里出现了错误,并希望给我一些关于如何清理代码、保持性能但又不使其受人尊敬的建议。
最佳答案
java中的对象是堆空间中的一 block 内存。您传递的只是对此对象/内存区域的引用。 (引用本身是按值传递的)因此,如果您有一个包含四个整数的对象矩形,您的方法将更改堆区域的内存,该堆区域是通过传递的对象引用进行引用的。
字符串是不可变的 - 因此对象不能更改,并且每个修饰符方法都会返回一个新实例。
关于java - 在java中将对象作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26797354/