Как передать массив в класс
Перейти к содержимому

Как передать массив в класс

  • автор:

Как передать массив в класс 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

Прошу прощения, еще не всё знаю, учусь. Вопрос простой по сути, я знаю что по-жесткачу туплю. Суть вот в чем. У меня в основном классе Data_form происоходят основные действия, и по ним заполняется массив строк, двумерный массив. Необходимо во втором классе GetData, использовать сформировавшийся массив в первом классе (Data_form).

package Massiv; import javax.swing.SwingUtilities; public class Data_form < private GetData getData; private Data_form_Starter data_form_Starter; public String[][] twoDimArray; public static int long_of_lict; public static int getLong_of_lict() < return long_of_lict; >public static void setLong_of_lict(int long_of_lict) < Data_form.long_of_lict = long_of_lict; >public String [][] getTwoDimArray() < return twoDimArray; >public void setTwoDimArray(String[][] twoDimArray) < twoDimArray = twoDimArray; >public Data_form() < long_of_lict=3; System.out.println(" Data_form start "); String [][] twoDimArray = new String [3][3]; for (int i = 0; i < twoDimArray.length; i++) < twoDimArray [i][0] = "first"; twoDimArray [i][1] = "second"; twoDimArray [i][2] = "third"; >this.twoDimArray = twoDimArray.clone(); for (int i = 0; i < twoDimArray.length; i++) < //идём по строкам System.out.print("Data_form " + i + " "); //вывод порядкового номера элемента for (int j = 0; j < 3; j++) System.out.println();//перенос строки ради визуального сохранения табличной формы > System.out.println(" Data_form end " + twoDimArray.length); > public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < public void run() < new Data_form(); new Data_form_Starter(); GetData getData = new GetData(this); >>); > > 

второй класс, в который надо передать массив, и напривер вывести в консоль

package Massiv; import java.util.ArrayList; import java.util.Arrays; import javax.xml.crypto.Data; public class GetData < private Data_form data_form; Data_form d_form; public GetData(Runnable runnable) < // TODO Auto-generated constructor stub System.out.println(" GetData Start runnable "); String[][] NewArray = d_form.getTwoDimArray(); int longOfArray = d_form.getLong_of_lict(); System.out.println(" GetData Start runnable longOfArray " + longOfArray); NewArray = data_form.getTwoDimArray(); for (int i = 0; i < 3; i++) < //идём по строкам System.out.print(" __ " + i + " __ "); //вывод порядкового номера элемента for (int j = 0; j < 3; j++) System.out.println();//перенос строки ради визуального сохранения табличной формы > > > 

прошу прощение за кривой код, только начинаю учится.

Как передать массив в класс

Если функция принимает в качестве параметра массив, то фактически в эту функцию передается указатель на первый элемент массива. То есть как и в случае с указателями нам доступен адрес, по которому мы можем менять значения. Поэтому следующие объявления функции будут по сути равноценны:

void print(int numbers[]); void print(int *numbers);

Передадим в функцию массив:

#include void print(int[]); int main() < int nums[] ; print(nums); > void print(int numbers[]) < std::cout 

В данном случае функция print выводит на консоль первый элемент массива.

Теперь определим параметр как указатель:

#include void print(int*); int main() < int nums[] ; print(nums); > void print(int *numbers)

Здесь также в функцию передается массив, однако параметр представляет указатель на первый элемент массива.

Ограничения

Поскольку параметр, определенный как массив, рассматривается именно как указатель на первый элемент, то мы не сможем корректно получить длину массива, например, следующим образом:

void print(int numbers[]) < int size = sizeof(numbers) / sizeof(numbers[0]); // или так // size_t size = std::size(nums); std::cout

И также мы не сможем использовать цикл for для перебора этого массива:

void print(int numbers[])

Передача маркера конца массива

Чтобы должным образом определять конец массив, перебирать элементы массива, обращаться к этим элементам, необходимо использовать специальный маркер, который бы сигнализировал об окончании массива. Для этого могут использоваться разные подходы.

Первый подход заключается в том, чтобы один из элементов массива сам сигнализировал о его окончании. В частности, массив символов может представлять строку - набор символов, который завершается нулевым символом '\0'. Фактически нулевой символ служит признком окончания символьного массива:

#include void print(char[]); int main() < char chars[] ; print(chars); > void print(char chars[]) < for (unsigned i<>; chars[i] != '\0'; i++) < std::cout >

Однако при таком подходе мы должны быть уверены, что массив содержит такой подобный признак завершения. И если бы в данном случае нулевого байта не оказалось бы в строке, то это привело бы к неприятным последствиям. Поэтому обычно применяется другой подход, который заключается в передаче в функцию размера массива:

#include void print(int[], size_t); int main() < int nums[]; size_t n ; print(nums, n); > void print(int numbers[], size_t n) < for(size_t i <>; i < n; i++) < std::cout >

Третий подход заключается в передаче указателя на конец массива. Можно вручную вычислять указатель на конец массива. А можно использовать встроенные библиотечные функции std::begin() и std::end() :

int nums[] < 1, 2, 3, 4, 5 >; int *begin ; // указатель на начало массива int *end ; // указатель на конец массива

Причем end возвращает указатель не на последний элемент, а адрес за последним элементом в массиве.

Применим данные функции:

#include void print(int*, int*); int main() < int nums[] < 1, 2, 3, 4, 5 >; int *begin ; int *end ; print(begin, end); > void print(int *begin, int *end) < for (int *ptr ; ptr != end; ptr++) < std::cout >

Константные массивы

Поскольку при передаче массива передается фактически указатель на первый элемент, то используя этот указатель, мы можем изменить элемены массива. Если нет необходимости в изменении массива, то лучше параметр-массив определять как константный:

#include void print(const int*, const size_t); void twice(int*, const size_t); int main() < int numbers[]; size_t n = std::size(numbers); print(numbers, n); twice(numbers, n); // увеличиваем элементы массива в два раза print(numbers, n); > void print(const int numbers[], const size_t n) < for(size_t i <>; i < n; i++) < std::cout std::cout void twice(int *numbers, const size_t n) < for(size_t i <>; i < n; i++) < numbers[i] = numbers[i] * 2; >>

В данном случае функция print просто выводит значения из массива, поэтому параметры этой функции помечаются как константные.

Функция twice изменяет элементы массива - увеличивает их в два раза, поэтому в этой функции параметр-массив является неконстантным. Причем поле выполнения функции twice массив numbers будет изменен.

Консольный вывод программы:

1 2 3 4 5 2 4 6 8 10

Передача массив по ссылке

Еще один сценарий передачи массива в функцию представляет передача массива по ссылке. Прототип функции, которая принимает массив по ссылке, выглядит следующим образом:

void print(int (&)[]);

Обратите внимание на скобки в записи (&) . Они указывают именно на то, что массив передается по ссылке. Пример использования:

#include void print(int (&)[], size_t); int main() < int nums[] ; size_t count = std::size(nums); print(nums, count); > void print(int (&numbers)[], size_t count) < for(size_t i<>; i < count; i++) < std::cout >

Подобным образом можпо передавать константные ссылки на массивы.

void print(const int (&)[]);

С одной стороны, может показаться, что в передаче массива по ссылке нет большого смысла, поскольку при передачи массива по значению итак просто передается адрес этого массива. Но с другой стороны, передача массива по ссылке имеет некоторые преимущества. Во-первых, не копируется значение - адрес массива, мы напрямую работаем с оригинальным массивом. Во-вторых, передача массива по ссылке позволяет ограничить размер такого массива, соотвественно при компиляции компилятор уже будет знать, сколько элементов будет иметь массив.

#include void print(const int (&)[5]); // массив строго с 5 элементами int main() < int nums1[] ; print(nums1); > void print(const int (&numbers)[5]) < for(unsigned i<>; i < 5; i++) < std::cout >

Здесь функция print принимает ссылку строго на массив с 5 элементами. И поскольку мы знаем точный размер массива, то нам нет необходимости передавать в функцию дополнительно размер массива.

Если же мы попробуем передать в функцию массив с другим количеством элементов, то на этапе компиляции мы столкнемся с ошибкой, как, например, в следующем случае:

int nums2[] ; print(nums2); // ! Ошибка - в массиве nums2 6 элементов

Передача многомерного массива

Многомерный массив также передается как указатель на его первый элемент. В то же время поскольку элементами многомерного массива являются другие массивы, то указатель на первый элемент многомерного массива фактически будет представлять указатель на массив.

Когда определяется параметр как указатель на массив, размер второй размерности (а также всех последующих размерностей) должен быть определен, так как данный размер является частью типа элемента. Пример объявления:

void print(int (*numbers)[3]);

Здесь предполагается, что передаваемый массив будет двухмерным, и все его подмассивы будут иметь по 3 элемента. Стоит обратить внимание на скобки вокруг имени параметра, которые и позволяют определить параметр как указатель на массив. И от этой ситуации стоит отличать следующую:

void print(int *numbers[3])

В данном случае параметр определен как массив указателей, а не как указатель на массив.

Рассмотрим применение указателя на массив в качестве параметра:

#include void print(const int(*)[3], const size_t); int main() < int table[][3] < , , >; // количество строк или подмассивов size_t rowsCount ; print(table, rowsCount); > void print(const int (*rows)[3], const size_t rowsCount) < // количество столбцов или элементов в каждом подмассиве size_t columnsCount ; for(size_t i<>; i < rowsCount; i++) < for (size_t j<>; j < columnsCount; j++) < std::cout std::cout >

В функции main определяется двухмерный массив - он состоит из трех подмассивов. Каждый подмассив имеет по три элемента.

В функцию print вместе с массивом передается и число строк - по сути число подмассивов. В самой функции print получаем количество элементов в каждом подмассиве и с помощью двух циклов перебираем все элементы. С помощью выражения rows[0] можно обратиться к первому подмассиву в двухмерном массиве, а с помощью выражения rows[0][0] - к первому элементу первого подмассива. И таким образом, манипулируя индексами можно перебрать весь двухмерный массив.

В итоге мы получим следующий консольный вывод:

1 2 3 4 5 6 7 8 9

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

#include void print(const int[][3], const size_t); int main() < int table[][3] < , , >; // количество строк или подмассивов size_t rowsCount ; print(table, rowsCount); > void print(const int rows[][3], const size_t rowsCount) < // количество столбцов или элементов в каждом подмассиве size_t columnsCount ; for( size_t i<>; i < rowsCount; i++) < for (size_t j<>; j < columnsCount; j++) < std::cout std::cout >

Передача массива в метод класса

и есть класс с методом который должен использовать этот массив.
Как мне передать массив в метод класса?
Заранее благодарен за ответ.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Передача массива в метод класса
Здравствуйте, я не могу понять почему я не выходит передать статический массив в метод класса по.

Передача массива классов в метод класса
1. этап. Разработать библиотеку функций(h-файл) для выполнения: – чтения базы данных из файла;.

Передача в функцию метод класса
Не получается передать в функцию метод класса. .

Передача объекта в метод класса
здравствуйте. в процессе написания программы возник такой вопрос. можно ли при вызове метода.

584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
Статический двумерный массив

1 2 3 4 5 6
class Test { . void Print(char map[][],int width,int height ) . };

Динамический двумерный

1 2 3 4 5 6
class Test { . void Print(char **map,int width,int height ) . };

4055 / 3308 / 924
Регистрация: 25.03.2012
Сообщений: 12,447
Записей в блоге: 1

точно также как и в обычную функцию. Если ты решил изучать С++, перескакивая с темы на тему, лучше брось это.
Массивы передаются указателем на первый элемент.

ЦитатаСообщение от egor2116 Посмотреть сообщение

Статический двумерный массив
Динамический двумерный

ИМХО, разницы никакой. Можно поменять местами подписи и передавать хоть статический, хоть динамический. Или ты ради того, чтоб передать динамический массив, объявишь второй раз другую функцию?

584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
объявишь второй раз другую функцию?
Нет, лишь привожу человеку пример вариантов синтаксиса
4055 / 3308 / 924
Регистрация: 25.03.2012
Сообщений: 12,447
Записей в блоге: 1

ЦитатаСообщение от egor2116 Посмотреть сообщение

Нет, лишь привожу человеку пример вариантов синтаксиса

Ясно, просто это прозвучало как "первый вариант работает только для статических массивов, второй только для динамических"

584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
Ясно, просто это прозвучало как
Извеняюсь за туман.
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include class A { public: template int N, int M> void func(char (&map)[N][M]) { std::cout  <"N="   <", M="   ::endl; } }; int main() { char map[10][20]; A a; a.func(map); }

584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169

Да, определенно человек который испытывает проблему при передаче массива в метод, не смутится увидив это

template int N, int M> void func(char (&map)[N][M]) {

Регистрация: 05.01.2013
Сообщений: 6
Всем огромное спасибо. Разобрался

Эксперт С++

5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044

ЦитатаСообщение от egor2116 Посмотреть сообщение

void Print(char map[][],int width,int height )

Это вообще не сработает. Да, записи int foo[] и int *foo в списке формальных параметров функции взаимозаменяемы, но про int foo[][] и int **foo этого сказать нельзя. Писать int foo[][] вообще нельзя, поскольку компилятор обязан знать все размерности массива, кроме первой (они обязаны быть константами времени компиляции).

ЦитатаСообщение от Kuzia domovenok Посмотреть сообщение

Можно поменять местами подписи и передавать хоть статический, хоть динамический

Неверно. В функцию, принимающую type arr[][SIZE], передать двойной указатель нельзя. То же самое наоборот, в функцию, принимающую type **arr, не получится передать статический двумерный массив.

Всё это вытекает из того, что указатель на статический двумерный массив имеет тип не type **, а type (*)[SIZE], именно такой, с учётом SIZE. Таким образом, указатели на массивы int arr1[10][10] и int arr2[10][20] имеют на самом деле разные типы, и они несовместимы.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Передача define в метод класса
Подскажите, есть множество define, как мне передать одну их них в метод класса?

Передача переменных из функции в метод класса
У меня есть главная функция и класс, в котором есть 2 функции. Как мне после выполнения 1-й функции.

Передача класса по ссылки в метод (ругается)
Среда Linux gcc 4.1.2 Есть прототип метода (класса Time) Time Time::Sum(const Time & t)const;.

Передача неизвестного объекта в метод класса
Ситуация такова: имеется класс (в зачаточном состоянии) class Archer < private: double.

Передача переменной в метод open() объекта класса fstream
При попытке передать переменную в метод объекта класса fstream выдаёт ошибку "error: no matching.

Передача строкового многомерного массива в метод Класса
Здравствуйте. Пытаюсь отправить строковый многомерный массив в метод Класса, но выдает ошибки. .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *