0

我正在尝试为 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);
    }
}

在这里,当我打印数字时,我仍然会得到 0,但是对于其他位图和画布,我确实会发送实际实例。这让我真的很困惑。有人可以解释一下吗?还是与原始类型不同的类对象总是如此?它会让垃圾收集器发疯吗?

在此先感谢,如果您不理解我的英语,请告诉我,我将在此处放置伪代码以进行澄清;

4

1 回答 1

1

在开始编写 Java 代码之前,您真的应该阅读Java 教程。

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

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

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

Java 不使用Copy Constructors- 如果你想将一个对象的副本传递给一个方法,你应该制作它cloneable并传递clone它。但这可能不是您所需要的 - 请注意,Copy Constructors消耗的资源不仅仅是将引用传递给对象。

于 2011-07-10T05:58:24.667 回答