Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2013, 21:46   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию массивы объектов

Есть класс
Код:
public class M_Class
{
    int i;
    M_Class(){i = 0;}
    public void init(int _i){i = _i;}
}
создадим массив объектов
Код:
M_Class array[] = new M_Class[100];
вызываем метод init() и получаем ошибку времени исполнения
Код:
for (int i = 0; i < 100; i++)
    array[i].init(i);
Пол дня убил на то что бы понять в чем дело

Но потом до меня дошло. Не знаю может я и не прав, если что поправте.
Как я понимаю массив объектов это по сути массив ссылок. И если массив не иницилизирован ссылки равны null.
В общем я поступил так:
Код:
for (int i = 0; i < 100; i++)
    array[i] = new M_Class(); // Выделяем память для каждого элемента
for (int i = 0; i < 100; i++)
    array[i].init(i);
Так работает. Может это криво, я сам додумался, и правельнее по другому? подскажите

И что получается? В с/с++ элементы в памяти следуют подряд. В джаве это не так?

Все это тестировалось на платформе Android, но думаю разницы нет? принцип java один и тот же
SAMOUCHKA вне форума Ответить с цитированием
Старый 04.08.2013, 22:09   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вы всё правильно поняли, лишь добавлю, что создание и инициализацию можно поместить в один цикл.
Код:
for (int i = 0; i < 100; i++) {
  array[i] = new M_Class();
  array[i].init(i);
}
Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
И что получается? В с/с++ элементы в памяти следуют подряд. В джаве это не так?
Ну почему же, тоже так. Но, как Вы правильно заметили, это массив ссылок, то есть эквивалентен массиву указателей в C/C++. Для примитивных типов массив содержит сами данные, а не ссылки.
netrino вне форума Ответить с цитированием
Старый 04.08.2013, 22:53   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

да потребуется время что бы привыкнуть.
Скажите, а в java бывают случаи когда нужен конструктор копий?
SAMOUCHKA вне форума Ответить с цитированием
Старый 04.08.2013, 23:37   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И что получается? В с/с++ элементы в памяти следуют подряд. В джаве это не так?
в С++ аналог то не такой.
Код:
Obj** t=new Obj*[100];
а так все верно сделали, только цикла одного достаточно.
Цитата:
Скажите, а в java бывают случаи когда нужен конструктор копий?
в Java нет такого понятия как такого.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление своих объектов в Добавление своих объектов в двунаправленный кольцевой список voidmain C# (си шарп) 3 21.03.2013 13:08
Массивы объектов в С++ _Vova_ Помощь студентам 1 05.11.2012 18:21
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
Создание и уничтожение объектов. Время жизни объектов C++/C# Anett// Помощь студентам 0 24.10.2011 23:26
Динамические массивы объектов, проблема с перекрестной индексацией. Василиск Общие вопросы Delphi 16 25.01.2011 00:30