2 Простые и ссылочные типы


1 Как работают объектные ссылки

В Java есть восемь простых ("primitive") типов данных: byte, short, int, long, float, double, boolean, char. Подробнее

Все остальные типы (т.е. массивы и классы) конструируются на их основе и являются ссылочными.

Ссылки в Java на 90% аналогичны указателям в Си или Паскале.

2 Эксперимент

Проведем небольшой эксперимент с классом java.util.Date (см. справку) (он инкапсулирует в себе некоторый момент времени (день и время суток).
Для этого воспользуемся окном "Interactions" DrJava:

Действия 
Результат
import java.util.Date;
Date d1 = new Date();
d1            // посмотреть, чему равно d1
Date d2 = new Date();
d1            // посмотреть, чему равно d2
d1=d2;
проверьте, что объекты d1 и d2 стали одинаковыми
 Вопрос: как изменилась картинка?
Поменяем каким-нибудь образом содержимое одного из объектов:

Вопрос: каково теперь содержимое d2?
 

Вопросы для самостоятельного исследования:
  1. Какое значение имеет ссылочная переменная, если ее не инициализировать при объявлении? А какое - "обычная"?
  2. Что получится, если у неинициализированной ссылки (как в п.1) вызвать какой-нибудь метод? (скажем, getTime()?)
  3. Как создать два отдельных объекта класса Date - но с одинаковым содержимым? (подсказка: почитайте справку)
  4. Как ведет себя оператор "==" с переменными типа Date? Зачем в классе Date придумали метод equals? (см. справку)

Помощь в поиске ответов можно получить, прочитав пункт "Объекты и объектные переменные" книги Хорстманна (глава 4, стр. 134).

3 Массивы

Массивы в Java являются объектами. Поэтому доступ к ним осуществляется через объектные ссылки, аналогичные d1 и d2 из приведенных выше примеров.

// Объявление объектной ссылки на массив целых чисел
int[] arr;
// Выделение памяти под массив, на который она теперь будет ссылаться:
arr = new int[10];

Доступ к элементам массива по индексу в Java абсолютно такой же, как в Паскале.

Задания для самостоятельного исследования:

  1. Попробуйте вывести массив на экран с помощью System.out.println(). Появятся цифры, которые явно что-то значат!
  2. А как вывести на экран элементы массива?
  3. Проведите с двумя массивами эксперимент, аналогичный тому, что вы проводили с объектами d1 и d2 класса Date() (по таблице выше). Промежуточные результаты (значения переменных d1 и d2) выводите с помощью System.out.println(массив). Какие отличия от эксперимента с Date'ами вы заметили?
  4. Что получится, если создать массив объектов Date и в цикле вывести его содержимое на экран?

Подробное объяснение см. в Хорстманне, гл.3, пункт "Массивы", с. 112.

4 "Неровные" двумерные массивы

Если вы дошли до этого пункта - создайте и распечатайте двумерный массив, который в первой строке содержит 1 элемент, во 2-ой - два элемента, в 3-ей - три и так далее.

Контрольный вопрос: как поменять местами две строки такого массива?

См. Хорстманн, глава 3, "Неровные массивы", с. 123.

Comments