繁体   English   中英

在Java中将对象作为参数传递

[英]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

事实是Java总是按值传递。 特别是Java将对象作为引用传递,而这些引用则按值传递。 如果是基本类型,则按值直接传递。

以下问题的更多详细信息:

Java是“按引用传递”还是“按值传递”?

字符串是常量; 它们的值创建后就无法更改。如果更改String的值,它将创建一个新的String对象,并返回对该新String对象的引用,即创建了一个新实例。

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

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

好的,我可能有点含糊,但问题不在于java如何传递变量。 我只是来自那个话题。 我发现,只是String类使我感到困惑。 并最终获得具有公共属性的性能。 我将再尝试一次,谢谢您的回答!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM