[英]passing objects as parameters in java
我正在尝试用Java制作2D游戏。
在此过程中,我很快注意到许多对象需要边界(x1,x2,y1,y2),因此许多方法因此具有参数(int x1,int x2,int y1,int y2)。
因此,我想了一下,为什么不使用属性x1,x2,y1,y2(为提高性能而设置为公共属性)以及一些有用的方法(例如getWidth(),getHeight()等)来创建对象IntRectangle 。
在这一点上,我的代码更加简洁,由于变量是公共的,因此我并没有损失太多性能。
我很快注意到,与将原始值传递给方法不同,当我在方法中更改传递的对象的值时,传递的对象的值也会更改。
例如,使用原始值
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。 在调用方法时将其推送,然后在返回时弹出,且保持不变。 对象是对对象的引用。 对象本身不只是指针而被压入堆栈。
但是我对字符串(我知道是对象)感到厌倦,并且在此问题上它们的行为就像int一样,这使我感到困惑。 也许他们以某种方式自己制作了副本?
好吧,我希望有人能对此事有所启发,并告诉我我的推理在哪里转错了,并希望给我一些有关如何清理代码,保持性能的建议,但又不要使它变得令人尊敬。
Java中的对象是堆空间中的一块内存。 您传递的所有内容都是对此对象/内存区域的引用。 (引用本身是通过值传递的)因此,如果您的对象矩形具有四个整数,则您的方法将更改堆ara的内存,该内存是通过传递的对象引用进行引用的。
字符串是不可变的-因此对象无法更改,每个修改器方法都返回一个新实例。
有关更多信息,请参见http://javadude.com/articles/passbyvalue.htm 。
字符串是常量; 它们的值创建后就无法更改。如果更改String的值,它将创建一个新的String对象,并返回对该新String对象的引用,即创建了一个新实例。
String str="abc";
str=str+"d";
在这种情况下,将在字符串池中创建一个新的字符串对象,现在将它用str引用。旧字符串将被垃圾回收。
好的,我可能有点含糊,但问题不在于java如何传递变量。 我只是来自那个话题。 我发现,只是String类使我感到困惑。 并最终获得具有公共属性的性能。 我将再尝试一次,谢谢您的回答!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.