русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Примитивные и ссылочные типы данных


Дата добавления: 2015-06-12; просмотров: 1833; Нарушение авторских прав


Теперь на примере переменных можно проиллюстрировать различие между примитивными и ссылочными типами данных. Рассмотрим пример, когда объявляются две переменные одного типа, приравниваются другдругу, а затем значение одной их них изменяется. Что произойдет со старой переменной?

Возьмем простой тип Int:

int а=5; // объявляем первую переменную и инициализируем ее Int b=a; // объявляем вторую переменную и приравниваем ее к первой а=3; // меняем значение первой print(b); // проверяем значение второй

Здесь и далее мы считаем, что функция print(...) позволяет нам некоторым HM (неважно, каким именно) способом узнать значение ее аргумента (как правило, для этого используют функцию из стандартной библиотеки %Stem.out.printing(...), которая выводит значение на системную консоль). В результате мы увидим, что значение переменной b не изменилось, осталось равным 5. Это означает, что переменные простого типа непосредственно свои значения и при приравнивании двух переменных происходит копирование данного значения. Чтобы еще раз подчерк­нуть эту особенность, приведем еще один пример:

byte b=3; int a=b;

В данном примере происходит преобразование типов (оно подробно рассматривается в соответствующей лекции). Для нас сейчас важно кон­статировать, что переменная b хранит значение 3 типа byte, а переменная а — значение 3 типа int. Это два разных значения, и во второй строке при присваивании произошло копирование.

Теперь рассмотрим ссылочный тип данных. Переменные таких ти­пов всегда хранят ссылки на некоторые объекты. Рассмотрим для приме­ра класс, описывающий точку на координатной плоскости с целочислен­ными координатами. Описание класса — это отдельная тема, но в нашем простейшем случае оно тривиально:

class Point { int X, у;}

Теперь составим пример, аналогичный приведенному выше для int-переменных, считая, что выражение new Point(3,5) создает новый объ­ект-точку с координатами (3,5).



Point р1 = new Point(3,5);

Point р2=р1;

р1.х=7;

print(p2.x);

В третьей строке мы изменили горизонтальную координату точки, на которую ссылалась переменная р1, и теперь нас интересует, как это сказалось на точке, на которую ссылается переменная р2. Проведя та­кой эксперимент, можно убедиться, что в этот раз мы увидим обновлен­ное значение. То есть объектные переменные после приравнивания ос­таются "связанными" друг с другом, изменения одной сказываются на другой.

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

Point р1 = new Point(3,5);

Point р2=р1;

pi = newPoint(7,9);

print(p2.x);

В этом примере мы получим 3, то есть после третьей строки пере­менные р1 и р2 ссылаются на различные объекты и поэтому имеют раз­ные значения.

Теперь легко понять смысл литерала null. Такое значение может при­нять переменная любого ссылочного типа. Это означает, что ее ссылка никуда не указывает, объект отсутствует. Соответственно, любая попытка обратиться к объекту через такую переменную (например, вызвать метод или взять значение поля) приведет к ошибке.

Также значение null можно передать в качестве любого объектного аргумента при вызове функций (хотя на практике многие методы счита­ют такое значение некорректным).

Память в Java с точки зрения программиста представляется не нуля­ми и единицами или набором байтов, а как некое виртуальное простран­ство, в котором существуют объекты. И доступ к памяти осуществляется не по физическому адресу или указателю, а лишь через ссылки на объек­ты. Ссылка возвращается при создании объекта и далее может быть сохра­нена в переменной, передана в качестве аргумента и т.д. Как уже говори­лось, допускается наличие нескольких ссылок на один объект. Возможна и противоположная ситуация — когда на какой-то объект не существует ни одной ссылки. Такой объект уже недоступен программе и является "мусо­ром", то есть без толку занимает аппаратные ресурсы. Для их освобожде­ния не требуется никаких усилий. В состав любой виртуальной машины обязательно входит автоматический сборщик мусора garbagecollector фоновый процесс, который как раз и занимается уничтожением ненуж­ных объектов.

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

Теперь рассмотрим примитивные и ссылочные типы данных более подробно.



<== предыдущая лекция | следующая лекция ==>
Переменные | Целочисленные типы


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.889 сек.