Чтение онлайн

на главную - закладки

Жанры

Программирование на Java
Шрифт:

Ссылочные типы

Итак, выражение ссылочного типа имеет значение либо null, либо ссылку, указывающую на некоторый объект в виртуальной памяти JVM.

Объекты и правила работы с ними

Объект (object) – это экземпляр некоторого класса, или экземпляр массива. Массивы будут подробно рассматриваться в соответствующей лекции. Класс – это описание объектов одинаковой структуры, и если в программе такой класс используется, то описание присутствует в единственном экземпляре. Объектов этого класса может не быть вовсе, а может быть создано сколь угодно много.

Объекты всегда

создаются с использованием ключевого слова new, причем одно слово new порождает строго один объект (или вовсе ни одного, если происходит ошибка). После ключевого слова указывается имя класса, от которого мы собираемся породить объект. Создание объекта всегда происходит через вызов одного из конструкторов класса (их может быть несколько), поэтому в заключение ставятся скобки, в которых перечислены значения аргументов, передаваемых выбранному конструктору. В приведенных выше примерах, когда создавались объекты типа Point, выражение new Point (3,5) означало обращение к конструктору класса Point, у которого есть два аргумента типа int. Кстати, обязательное объявление такого конструктора в упрощенном объявлении класса отсутствовало. Объявление классов рассматривается в следующих лекциях, однако приведем правильное определение Point:

class Point {

int x, y;

/**

* Конструктор принимает 2 аргумента,

* которыми инициализирует поля объекта.

*/

Point (int newx, int newy) {

x=newx;

y=newy;

}

}

Если конструктор отработал успешно, то выражение new возвращает ссылку на созданный объект. Эту ссылку можно сохранить в переменной, передать в качестве аргумента в какой-либо метод или использовать другим способом. JVM всегда занимается подсчетом хранимых ссылок на каждый объект. Как только обнаруживается, что ссылок больше нет, такой объект предназначается для уничтожения сборщиком мусора (garbage collector). Восстановить ссылку на такой "потерянный" объект невозможно.

Point p=new Point(1,2);

// Создали объект, получили на него ссылку

Point p1=p;

// теперь есть 2 ссылки на точку (1,2)

p=new Point(3,4);

// осталась одна ссылка на точку (1,2)

p1=null;

Ссылок на объект-точку (1,2) больше нет, доступ к нему утерян и он вскоре будет уничтожен сборщиком мусора.

Любой объект порождается только с применением ключевого слова new. Единственное исключение – экземпляры класса String. Записывая любой строковый литерал, мы автоматически порождаем объект этого класса. Оператор конкатенации +, результатом которого является строка, также неявно порождает объекты без использования ключевого слова new.

Рассмотрим пример:

"abc"+"def"

При выполнении этого выражения будет создано три объекта класса String. Два объекта порождаются строковыми литералами, третий будет представлять результат конкатенации.

Операция создания объекта – одна из самых ресурсоемких в Java. Поэтому следует избегать ненужных порождений. Поскольку при работе со строками их может создаваться довольно много, компилятор, как правило, пытается оптимизировать такие выражения. В рассмотренном примере, поскольку все операнды

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

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

Point p = null;

try {

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

// текстовое имя класса Point, порождается

// объект без применения ключевого слова

new p=(Point)Class.forName("Point").newInstance;

} catch (Exception e) { // обработка ошибок

System.out.println(e);

}

Объект всегда "помнит", от какого класса он был порожден. С другой стороны, как уже указывалось, можно ссылаться на объект, используя ссылку другого типа. Приведем пример, который будем еще много раз использовать. Сначала опишем два класса, Parent и его наследник Child:

// Объявляем класс Parent

class Parent {

}

// Объявляем класс Child и наследуем

// его от класса Parent

class Child extends Parent {

}

Пока нам не нужно определять какие-либо поля или методы. Далее объявим переменную одного типа и проинициализируем ее значением другого типа:

Parent p = new Child;

Теперь переменная типа Parent указывает на объект, порожденный от класса Child.

Над ссылочными значениями можно производить следующие операции:

* обращение к полям и методам объекта

* оператор instanceof (возвращает булево значение)

* операции сравнения == и != (возвращают булево значение)

* оператор приведения типов

* оператор с условием ?:

* оператор конкатенации со строкой +

Обращение к полям и методам объекта можно назвать основной операцией над ссылочными величинами. Осуществляется она с помощью символа . (точка). Примеры ее применения будут приводиться.

Используя оператор instanceof, можно узнать, от какого класса произошел объект. Этот оператор имеет два аргумента. Слева указывается ссылка на объект, а справа – имя типа, на совместимость с которым проверяется объект. Например:

Parent p = new Child;

// проверяем переменную p типа Parent

// на совместимость с типом Child

print(p instanceof Child);

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

Поделиться:
Популярные книги

Имаджика

Баркер Клайв
7. Книга-загадка, книга-мистика
Фантастика:
фэнтези
7.56
рейтинг книги
Имаджика

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Торнан-варвар и жезл Тиамат

Лещенко Владимир
Фантастика:
героическая фантастика
5.00
рейтинг книги
Торнан-варвар и жезл Тиамат

Народ, да!

Коллектив авторов
Старинная литература:
мифы. легенды. эпос
5.00
рейтинг книги
Народ, да!

Опыт предпринимателя

Довгань Владимир Викторович
Деловая литература:
управление, подбор персонала
5.00
рейтинг книги
Опыт предпринимателя

Серия "Афган. Чечня. Локальные войны". Компиляция. Книги 1-34

Бобров Глеб Леонидович
Антология военной литературы
Проза:
военная проза
5.00
рейтинг книги
Серия Афган. Чечня. Локальные войны. Компиляция. Книги 1-34

А ЕСТЬ А

Рэнд Айн
3. Атлант расправил плечи
Фантастика:
социально-философская фантастика
6.88
рейтинг книги
А ЕСТЬ А

Иномиры (сборник)

Казанцев Александр Петрович
Классическая библиотека приключений и научной фантастики
Фантастика:
научная фантастика
7.00
рейтинг книги
Иномиры (сборник)

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Твен Марк
Проза:
классическая проза
5.00
рейтинг книги
Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Суть науки Каббала. Том 2

Лайтман Михаэль Семенович
Научно-образовательная:
прочая научная литература
религиоведение
5.00
рейтинг книги
Суть науки Каббала. Том 2

Кристалл Альвандера. Корабль Альвандера.Дилогия

Садов Сергей Александрович
Фантастика:
боевая фантастика
8.38
рейтинг книги
Кристалл Альвандера. Корабль Альвандера.Дилогия

Масоны

Писемский Алексей Феофилактович
Проза:
русская классическая проза
6.25
рейтинг книги
Масоны

Тевтонский крест

Мельников Руслан Викторович
1. Тевтонский крест
Фантастика:
альтернативная история
6.32
рейтинг книги
Тевтонский крест