2014-01-19 6 views
1

Я сейчас читаю Sam Teach Yourself Java в 21 день 6-е издание от Rogers Cadenhead.Java: Создание объектов без их именования?

В книге приводится пример создания объекта с использованием цикла for в одной из разделов статических переменных и методов.

Код выглядит следующим образом:

public class InstanceCounter { 
    private static int numInstances = 0; 

    protected static int getCount() { 
     return numInstances; 
    } 

    private static void addInstance() { 
     numInstances++; 
    } 

    InstanceCounter() { 
     InstanceCounter.addInstance(); 
    } 

    public static void main(String[] arguments) { 
     System.out.println("Starting with " + 
      InstanceCounter.getCount() + " objects"); 
     for (int i = 0; i < 500; ++i) 
      new InstanceCounter(); 
     System.out.println("Created " + 
      InstanceCounter.getCount() + " objects"); 
    } 
} 

Я не понимаю, как цикл может создавать объекты фактически не давая эти 500 новых имен объектов. Вот как меня научили создавать объекты:

Объект Имя_информации = new Object();

Является ли цикл for просто собирающимся создавать эти объекты и сразу их отбрасывать, поскольку они не имеют Имя_источника?

Я вижу, что когда я ввожу код в Netbeans, подсказка говорит, что «New Instance игнорируется».

+0

'T x = new T()' заставляет новый экземпляр 'T' ссылаться на переменную' x'. Это в значительной степени напоминает отслеживание объектов, которые вы создаете на листе бумаги. Если вы не запишите его, то он все равно будет существовать, но вы не можете его определить, потому что его нельзя назвать; если вы его записываете, вы можете ссылаться на него по имени, которое вы указали в своем списке. –

ответ

1

Объекты не имеют имен, поэтому вы создаете столько, сколько хотите, без имени.

Ссылки на такие поля и локальные переменные могут называть имена. Вы можете повторно использовать эти переменные и имена в цикле столько раз, сколько хотите, или нет. Если вы назначаете ссылку на объект на имя или нет, зависит от вас.

2

На линии new InstanceCounter(); новый объект создан. Однако, если у вас нет ссылки на него, вы не сможете получить к нему доступ, и, вероятно, скоро это будет сбор мусора. Если вы хотите сохранить ссылку на него, просто добавьте что-то вроде того, что вы написали здесь Object objectname = new Object();. Тогда objectname будет ссылкой класса Object.

Ваши статические методы не относятся к вашим объектам, они относятся к классу InstanceCounter. Даже если некоторые экземпляры будут мусором, собранным GC, количество экземпляров, которые были созданы, будет храниться в переменной numInstances.

1

Их можно отбросить или не удалить после создания. Когда больше нет ссылок на объект, GC (сборщик мусора) в конечном итоге удалит его, поэтому эти объекты без ссылки будут в конечном итоге получать GC'ed, когда GC запускается. С помощью статического метода addInstance() вы просто отслеживаете, сколько из этих «анонимных объектов» было создано. Это не показатель того, сколько из них все еще существует, поскольку это всего лишь статический int, который подсчитал, сколько было создано.

1

Что вы называете, говоря, что Objectname называется ссылкой в ​​Java и используется для доступа к объекту после его создания. Если не создать ссылку и назначить объект к нему, вы можете работать с ним в рамках единого выражения, например:

(new Random()).nextInt(); 

будет возвращать случайный объект Integer, а затем оставить дело сборщик мусора с объект типа Random. Это означает, что вы не можете снова использовать один и тот же объект, поэтому кажется, что вы правы.

Конечно, чтобы использовать один и тот же объект, что нужно какой-то ссылки, как:

Random someGenerator = new Random(); 

, где левая сторона присваивания является декларация ссылки, или же вы можете поместить новый объект в некоторых вид сбора:

List<Random> randList = new LinkedList<Random>(); 
randList.add(new Random()); 

Таким образом, вы можете получить доступ к этим объектам, даже если они не имеют отдельной ссылки. Эти коллекции можно рассматривать как групповую ссылку на объекты того же типа.

1

Создание instance - это просто действие new SomeInstance(). Мы выбираем все, чтобы сохранить их для дальнейшего использования или игнорировать их, и в обычном случае мы обычно сохраняем их.

Традиционный способ, чтобы сохранить их, как это:

SomeInstance mySomeInstance = new SomeInstance() 

Если мы решили создать их без сохранения их ИЛИ где-то в коде мы больше не нужны им чем всемогущий Garabage Collection будет очистите их.

Смежные вопросы