Передача массива из метода в метод
Необходимо создать класс, реализующий методы: инициализация массива, заполнение массива из консоли, сортировка и т.д.
В первом методе я инициализировала массив и уже именно в другом нужно его заполнить, записав этот массив в аргумент функции выдаёт ошибку: Exception in thread «main» java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
Как можно по-другому передать массив в другие функции или что исправить в этом способе??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
package lab1; import java.util.Scanner; class Matrix { private static int i, Row; //Инициализация массива public void MyArray() { Scanner in = new Scanner(System.in); System.out.println("Введите размерность массива:"); int i = in.nextInt(); int [] array = new int[i]; } //Заполнение массива из консоли public void Zapolnenie(int array []) { Scanner in = new Scanner(System.in); System.out.println("Введите элементы матрицы:"); for (Row = 0; Row i; Row++) { array[Row] = in.nextInt(); } for (Row = 0; Row i; Row++) { System.out.println(array[Row]); } } //Нахождение максимального и минимального элементов public void MM(int array []) { int max = array[0], min = array[0]; for (Row = 0; Row i; Row++) { if (max array[Row]) { max = array[Row]; } if (min > array[Row]) { min = array[Row]; } } System.out.println("Минимальный элемент равен = " + min); System.out.println("Максимальный элемент равен = " + max); } //Копирование массива public void Copy(int array []) { int[] copy = array.clone(); System.out.println("Копия матрицы:"); for (Row = 0; Row i; Row++) { System.out.println(copy[Row]); } } //Сортировка массива public void Sort(int array []) { boolean changes; do { changes = false; for (Row = 0; Row i - 1; Row++) { if (array[Row] > array[Row + 1]) { int _current = array[Row]; array[Row] = array[Row + 1]; array[Row + 1] = _current; changes = true; } } } while (changes); System.out.println("Отсортированный массив:"); for (Row = 0; Row i; Row++) { System.out.println(array[Row]); } } //Сумма положительных элементов public void Sum(int array []) { int sum = 0; for (Row = 0; Row i; Row++) { if (array[Row] > 0) { sum += array[Row]; } } System.out.println("Сумма всех положительных элементов:" + sum); } //Количество четных элементов public void Chet(int array []) { int kol = 0; for (Row = 0; Row i; Row++) { if ((array[Row] % 2 == 0) && (array[Row] != 0)) { kol++; } } System.out.println("Количество четных элементов:" + kol); } //Количество отрицательных элементов public void Otr(int array []) { int otr = 0; for (Row = 0; Row i; Row++) { if (array[Row] 0) { otr++; } } System.out.println("Количество отрицательных элементов:" + otr); } //Среднее значение всех элементов public void Sred(int array []) { int sred; int sum = 0; for (Row = 0; Row i; Row++) { if (array[Row] > 0) { sum += array[Row]; } } for (Row = 0; Row i; Row++) { sum += array[Row]; } sred = sum / array.length; System.out.println("Среднее значение:" + sred); } //Количество элементов в заданном диапазоне public void Kol(int array []) { Scanner in = new Scanner(System.in); int col = 0; System.out.println("Введите начало диапазона:"); int a = in.nextInt(); System.out.println("Введите конец диапазона:"); int b = in.nextInt(); for (Row = 0; Row i; Row++) { if (b >= array[Row] && a = array[Row]) { col++; } } System.out.println("Количество элементов в дипазоне:" + col); } }
Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода?
Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода? Почему? А если передать примитив?
Отслеживать
задан 27 окт 2021 в 12:05
53 1 1 серебряный знак 8 8 бронзовых знаков
Зачем спрашивать — напишите код и проверьте.
27 окт 2021 в 12:18
1) В зависимости от того какие объекты/примитивы содержатся в массиве и как именно они были «изменены» внутри метода — могут измениться, а могут и остаться прежними. 2) Философский вопрос. 3) Примитив не изменится.
27 окт 2021 в 12:52
@AlexRudenko спасибо за ответ!
27 окт 2021 в 13:55
собственно, одна из практик заключается в том, чтобы не менять значения в функциях, а возвращать новое значение. Но это не всегда применимо, в том числе по соображениям эффективности.
27 окт 2021 в 18:20
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Запомни раз и навсегда! в java всё передаётся по значению (pass by value).
Это значит, что при передаче в метод примитива, у нас создаётся копия, ты можешь крутить и менять её значение внутри метода как угодно, но на само значение это никак ни повлияет.
public class Solution < static void test(int num) < System.out.println(num); // копия num += 1; // пробуем увеличить на 1 System.out.println("после увеличения " + num); >public static void main(String[] args) < int a = 5; test(a); System.out.println(a); >>
5 после увеличения 6 5
А вот со ссылкой посложнее.
На примере массива, массив — это объект, находящийся в куче(она же хип), который может хранить данные, например примитивы.
Передавая массив(объект) в метод, мы получаем копию ссылки, по ссылке мы можем изменить состояние объекта в хипе, но не можем поменять саму ссылку.
public class Solution < static void test(int[] arr, int[] arr2) < arr[0] = 777; // меняем значение 1го элемента в массиве arr = arr2;//указываем ссылкой на другой массив System.out.println(Arrays.toString(arr)); // вывод [0] >public static void main(String[] args) < int[] arr = ; int[] arr2 = ; test(arr, arr2); System.out.println(Arrays.toString(arr)); // вывод [777, 2, 3] > >
Нечто похожее происходит и с ключевым словом final если обозначить примитив словом final мы не можем изменить значение, если пометить ссылочный тип, значение можем менять (кроме immutable объектов), а вот адрес, куда указывает ссылка нет.
Как передать массив в класс java
Для передачи массива в класс Java , вам необходимо создать переменную типа массива в вашем классе и передать массив в качестве аргумента в конструктор или метод класса.
public class MyClass private int[] myArray; public MyClass(int[] myArray) this.myArray = myArray; > public void printArray() for (int i : myArray) System.out.println(i); > > > // пример использования int[] numbers = 1, 2, 3, 4, 5>; MyClass myObject = new MyClass(numbers); myObject.printArray(); // => [1, 2, 3, 4, 5]
- Здесь мы создаем класс MyClass с переменной экземпляра myArray типа int[]
- Затем мы создаем конструктор, который принимает myArray в качестве аргумента и устанавливает его как значение переменной экземпляра myArray .
- Далее мы определяем метод printArray() , который просто выводит элементы массива на консоль.
- Когда мы создаем объект MyClass , мы передаем массив numbers в качестве аргумента конструктора, что приводит к тому, что значения в numbers будут присвоены myArray .
- Затем мы вызываем метод printArray() , который выводит содержимое myArray на консоль.
Как передать массив в метод java
Чтобы передать массив в метод Java , нужно в качестве аргумента указать имя массива, который нужно передать. Например:
public void myMethod(int[] myArray) // some code here >
В данном примере myMethod принимает аргумент myArray типа int[] .
Чтобы вызвать этот метод и передать в него массив, можно сделать так:
int[] myArray = 1, 2, 3, 4, 5>; myMethod(myArray);
В этом примере мы создаем массив myArray и инициализируем его некоторыми значениями, а затем передаем его в метод myMethod вызовом myMethod(myArray)
