Проблема с экземплярами классов, Android

Я пытаюсь сделать игру для 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам