java - 在java中将对象作为参数传递

标签 java object parameter-passing

我正在尝试用 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 内存。您传递的只是对此对象/内存区域的引用。 (引用本身是按值传递的)因此,如果您有一个包含四个整数的对象矩形,您的方法将更改堆区域的内存,该堆区域是通过传递的对象引用进行引用的。

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

参见http://javadude.com/articles/passbyvalue.htm了解更多信息。

关于java - 在java中将对象作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26797354/

相关文章:

java - 为什么程序在我的 showPanel 方法中的 setVisible 处抛出错误 "cannot find symbol"?

java - 如何动态创建串行命名的类对象?

javascript - 子对象未定义

java - Play Billing Library v1.0 过期订阅

java - 如何使用 JPA 和 Hibernate 复制 INSERT/UPDATE/DELETE 语句

java - java中有没有返回类成员变量的方法

html - embed、object 和 video 的 HTML 标签之间的区别?

python - 我可以这样理解[Python中的传递值]吗?

javascript - 将命名参数传递给 JavaScript 函数的方法。任何问题?

c# - linq to list<object> 并获取每行的值