我正在尝试为Android制作游戏 我的主类中有一个位图和画布实例。
我有另一个实例,比方说,渲染器类。 该渲染器类位于同一个包中,但不是我主类的子类。
如果我将位图和画布实例传递给该渲染器类的方法,并且该方法将绘制的传递位图传递给传递的画布,是否传递实际实例或创建新实例副本然后传递?好吧,我试过并看到实际的实例正在通过。因为我看到位图被绘制到画布上。
这是我的问题,为什么实际实例会通过? 如果它是这样的 - >
public class instanceTest
{
static int num;
static void numIncrementor(int number)
{
number++;
}
public static void main(String[] args)
{
num = 0;
numIncrementor(num);
System.out.println(num);
}
}
这里,当我打印num时,我仍然会得到0,但是对于其他位图和画布,我会发送实际的实例。这让我很困惑。有人可以解释一下吗? 或者与原始类型不同,类对象总是如此?它会让垃圾收集器变得疯狂吗?
在此先感谢,如果您不理解我的英语,请告诉我,我会在这里提供伪代码以供澄清;
答案 0 :(得分:1)
在开始编写Java代码之前,您应该真正阅读Java tutorial。
在上面的示例中,您传递了一个原语 - 因此它的值只是传递给方法,放在堆栈上并且该值被更改。这就是基元在Java中的工作方式。这意味着您的number
变量仅存在于numIncrementor
方法的范围内 - 并且不会影响外部的变量。
您的实际代码适用于对象。传递对象时,实际上会在堆上将引用传递给它。因此,您对它所做的每一项更改都将在实际对象上完成。唯一的例外是你不能将对象“重新分配”给别的东西,因为你只持有对堆的引用 - 你可以“重新分配”你对堆上另一个位置的引用,但原始引用将继续指向原始对象。
至于你对垃圾收集器的问题 - 不,它不会发疯。它实际上非常好用。 (有不止一种类型的GC,但这是一个完全不同的讨论。)
Java不使用Copy Constructors
- 如果要将对象的副本传递给方法,则应将其设为cloneable
并传递clone
。但这可能不是您所需要的 - 请注意Copy Constructors
消耗的资源多于仅仅将参考传递给对象。