Проблема с экземплярами классов, 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
потреблять больше ресурсов, чем просто передать ссылку на объект.