Проблема с экземплярами классов, Android - PullRequest
0 голосов
/ 10 июля 2011

Я пытаюсь создать игру для Android. У меня есть экземпляр растрового изображения и холста в моем основном классе.

У меня есть другой экземпляр, скажем, класса рендерера.Этот класс рендерера находится в том же пакете, но не подклассе моего основного класса.

Если я передаю экземпляр растрового изображения и холста методу этого класса рендерера, и этот метод будет отрисовывать этот переданный битовый массив переданномуcanvas, передаются ли фактические экземпляры или создаются и затем передаются новые копии экземпляров?Ну, я попробовал и увидел, что фактические случаи были переданы.Потому что я видел растровое изображение, нарисованное на холсте.

Вот мой вопрос, почему передаются фактические экземпляры?если это было что-то вроде этого ->


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 Ответ

1 голос
/ 10 июля 2011

Вы должны действительно прочитать учебник по Java перед началом написания кода Java.

В приведенном выше примере вы передали примитив - поэтому его значение просто передается методу, помещается в стек, и это значение изменяется.Вот как примитивы работают в Java.Это означает, что ваша переменная number существует только в области действия метода numIncrementor и не влияет на то, что находится за ее пределами.

Фактический код работает с объектами.Когда вы передаете объект, вы фактически передаете ссылку на него в куче.Таким образом, каждое изменение, которое вы вносите в него, будет сделано на реальном объекте.Единственное исключение состоит в том, что вы не можете «переназначить» объект чему-либо еще, поскольку вы удерживаете только ссылку на кучу - вы можете «переназначить» вашу ссылку в другое место в куче, но исходная ссылка будетукажите на исходный объект.

Что касается вашего вопроса о сборщике мусора - нет, он не сойдет с ума.Это на самом деле работает довольно хорошо.(Существует более одного типа GC, но это совсем другое обсуждение).

Java не использует Copy Constructors - если вы хотите передать копию объекта в метод, вы должны сделатьэто cloneable и передать clone этого.Но это, вероятно, не то, что вам нужно - обратите внимание, что Copy Constructors потребляет больше ресурсов, чем просто передает ссылку на объект.

...