Кажется, здесь происходит ряд разных проблем, поэтому я постараюсь их решить.
На самом деле вы не используете varags
- вы используете overloading
. Вместо того, чтобы иметь несколько методов с увеличивающимся числом переменных, вы можете просто объявить:
void methodName(dataType...variableName) {
// method code here
}
Который даст вам массив типа входных данных (так что в этом случае вы получите массив массивов). Часто на varags ссылаются в цикле foreach
. Единственным условием их использования является то, что они должны быть объявлены как последний параметр; также важно помнить, что их фактическое предоставление не является обязательным.
- 2)
static
проблемы с ключевыми словами
Проблема, с которой вы сталкиваетесь при использовании ключевого слова static
, заключается в том, что вы пытаетесь получить доступ к экземплярам переменных внутри метода static (на уровне класса). Методы static
могут обращаться только к static
переменным и переменным, которые были предоставлены как часть входных параметров. Чтобы обойти «статические ошибки», вам нужно будет передать либо экземпляр класса (через ссылку this
), либо определенный массив, либо изменить ссылку на массив, чтобы она была статической:
Статические ссылки:
public class Main {
static double[] arr = new double[10];
public static void main(String...args) {
arr[0] = 5;
}
}
Передача в экземпляре ссылки:
public class Main {
double[] arr = new double[10];
static void modifyArray(double[] modArr) {
modArr[0] = 3;
}
public static void main(String...args) {
Main inst = new Main();
modifyArray(inst.arr);
}
}
- 3) Внешнее редактирование массивов
Похоже, у вас возникла путаница по поводу того, как java обрабатывает входные параметры.
Java обрабатывает все входные параметры как передачу по значению, иногда называемую передачей копии. Это подробно описано в других разделах этого сайта, поэтому я не буду подробно останавливаться на этом.
Что это значит для вашего кода, это:
EditArrays(double[] arrayToEdit) {
thisHereArray = arrayToEdit;
thisHereArray[6] = 4.678;
}
фактически изменяет один массив - на который есть три (или более) ссылок. То есть thisHereArray
и arrayToEdit
, а также любая ссылка (скажем, localArray1
из Another
) была передана, все указывают на точно такой же массив в памяти. Этот код производит эквивалентный эффект:
EditArrays(double[] arrayToEdit) {
thisHereArray = arrayToEdit;
arrayToEdit[6] = 4.678;
}
Все, что вы сделали, это продублировали ссылки, не фактический массив. В зависимости от ваших требований, это может быть хорошо или плохо. В многопоточной среде это вызовет огромное количество (почти не поддающихся отслеживанию / воспроизводимых) ошибок. В однопоточной среде вы, вероятно, в порядке.
- Предоставление дополнительной обратной связи
Не зная ваших точных требований, немного сложно дать дополнительную обратную связь. Я могу дать некоторые общие рекомендации:
- Используйте массивы только для коллекций с определенным или постоянным размером. В противном случае используйте члены
Collections
framework.
- Не создавайте и не называйте переменные в формате
variableSameTypeSameName1
, variableSameTypeSameName2
. У вас либо есть коллекция одних и тех же вещей (как вы, кажется, здесь), и все они должны быть помещены в коллекцию (массив), или они все представляют разных вещей и должны быть названы как таковые (peopleToInvite
, peopleToExclude
, peopleToKill
).
- Do NOT выполняет редактирование внешних (передаваемых как параметр) объектов внутри конструктора. Вы можете передать ссылку на редактируемый объект, а затем вызвать метод для его редактирования.
- Не используйте
System.out.println()
внутри «обычных» или производственных методов (если вы не создаете консольное приложение, в чем я сомневаюсь). Это хорошо для отладки / разного тестирования, когда вы проверяете вещи.
- Вы упоминаете, что этот код работает в
an internal frame in the GUI
, хотя вы не предоставляете никакого кода Swing / AWT. Никогда не смешивать любой код пользовательского интерфейса с «бэкендом» или кодом модели напрямую (трудно сказать, что вы пытаетесь сделать, поэтому это не может быть проблемой) - следует избегать головной боли, которую он вызывает.