Краткий ответ:
изменить
this.visited = onetimevisit;
на
this.visited = new ArrayList (onetimevisit);
Более длинный ответ:
ArrayLists
не обязательно static
.Я думаю, что вы ошибочно заключаете, что ArrayList
должен был каким-то образом быть установлен на статическое состояние из-за того, что существует только одна копия ArrayList
, когда вы передаете его так, как вы его передали.Следует понимать, что когда вы передаете объект в Java (например, ArrayList
), вы передаете объекту ссылку .Ссылка - это нечто похожее на указатель в стиле C с тем отличием, что арифметика указателей не допускается.Когда вы вызываете метод и передаете объект, вызываемый метод просто получает копию ссылки, а не копию объекта.Аналогично, когда вы используете оператор =, чтобы назначить один объект другому, вы только назначаете ссылки равными друг другу, и все еще остается только одна копия объекта.В вашем коде и this.visited
, и onetimevisit
являются ссылками, указывающими на один и тот же объект в памяти.
С другой стороны, ArrayList
имеет нечто, похожее на конструктор копирования.Этот конструктор, который вызывается в моем примере кода выше, создает поверхностную копию заданного ArrayList
, что, по-видимому, является тем, что вам нужно.Стоит отметить, что ArrayList
не копирует добавленные к нему объекты (он хранит ссылки на них), поэтому, возможно, вам действительно нужно создавать копии этих объектов.Это можно сделать, вызвав их конструкторы копирования (если они позволяют копирование, предоставив такой конструктор), прежде чем вставлять их в ArrayList
.