类实例的问题,Android

时间:2011-07-10 05:36:59

标签: java android class-instance-variables

我正在尝试为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,但是对于其他位图和画布,我会发送实际的实例。这让我很困惑。有人可以解释一下吗? 或者与原始类型不同,类对象总是如此?它会让垃圾收集器变得疯狂吗?

在此先感谢,如果您不理解我的英语,请告诉我,我会在这里提供伪代码以供澄清;

1 个答案:

答案 0 :(得分:1)

在开始编写Java代码之前,您应该真正阅读Java tutorial

在上面的示例中,您传递了一个原语 - 因此它的值只是传递给方法,放在堆栈上并且该值被更改。这就是基元在Java中的工作方式。这意味着您的number变量仅存在于numIncrementor方法的范围内 - 并且不会影响外部的变量。

您的实际代码适用于对象。传递对象时,实际上会在堆上将引用传递给它。因此,您对它所做的每一项更改都将在实际对象上完成。唯一的例外是你不能将对象“重新分配”给别的东西,因为你只持有对堆的引用 - 你可以“重新分配”你对堆上另一个位置的引用,但原始引用将继续指向原始对象。

至于你对垃圾收集器的问题 - 不,它不会发疯。它实际上非常好用。 (有不止一种类型的GC,但这是一个完全不同的讨论。)

Java不使用Copy Constructors - 如果要将对象的副本传递给方法,则应将其设为cloneable并传递clone。但这可能不是您所需要的 - 请注意Copy Constructors消耗的资源多于仅仅将参考传递给对象。