русс | укр

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

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

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

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


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

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


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


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

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

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

class Point { intx, у;

/••

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

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

V

Point (int newx, int newy){ x=newx; y=newy;}}

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



Point p=new Point(1,2); // Создали объект, получили на него

ссылку

Point р1=р; //теперь есть 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 р = null;

try{// в следующей строке, используя лишь текстовое // имя класса Point, порождается объект без // применения ключевого слова new р - (Point)Class.forName("Point").newlnstance();

} catch (Exception е) {// обработка ошибок System.out.println(e);}

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

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

class Parent {}

// Объявляем класс Child и наследуем // его от класса Parent class Child extends Parent { }

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

Parent р = new Child();

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

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

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

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

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

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

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

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

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

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

Parent р = new Child(); // проверяем переменную р типа Parent // на совместимость с типом Child pnnt(p instanceof Child);

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

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

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

class ChildOfChild extends Child {}

Теперь заведем переменную нового типа:

Parent р = new ChildOfChlldO; print(p instanceof Child);

В первой строке объявляется переменная типа Parent, которая иници­ализируется ссылкой на объект, порожденный от ChildOfChild. Во второй строке оператор instanceof анализирует совместимость ссылки типа Parent с классом Ciiild, причем задействованный объект не порожден ни от перво­го, ни от второго класса. Тем не менее, оператор вернет true, поскольку класс, от которого этот объект порожден, наследуется от Child.

Добавим еще один класс:

class Child2 extends Parent { }

И снова объявим переменную типа Parent:

Parent p=new Child(); print(p instanceof Child); print(p instanceof Child2);

Переменная p имеет тип Parent, a значит, может ссылаться на объек­ты типа Child или Child2. Оператор instanceof помогает разобраться в си­туации:

true false

Для ссылки, равной null, оператор instanceof всегда вернет значение false.

С изучением свойств объектной модели Java мы будем возвращаться к алгоритму работы оператора instanceof.

Операторы сравнения = и != проверяют равенство (или неравен­ство) объектных величин именно по ссылке. Однако часто требуется альтернативное сравнение — по значению. Сравнение по значению имеет дело с понятием состояние объекта. Сам смысл этого выраже­ния рассматривается в ООП, что же касается реализации в Java, то со­стояние объекта хранится в его полях. При сравнении по ссылке ни тип объекта, ни значения его полей не учитываются, true возвращает­ся только в том случае, если обе ссылки указывают на один и тот же объект.

Point p1=new,Point(2,3);

Point р2=р1;

Point p3=new Point(2,3);

print(p1==p2);

print(p1==p3);

Результатом будет:

true false

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

Если один из аргументов оператора = равен null, а другой - нет, то значение такого выражения будет false. Если же оба операнда null, то ре­зультат будет true.

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

String S = "abc"; 8=8+1; print(s.equal8("abc1"));

Операция с условием ? : работает как обычно и может принимать 1ГГОрой и третий аргументы, если они оба одновременно ссылочного типа. Результат такого оператора также будет иметь объектный тип.

Как и простые типы, ссылочные величины можно складывать со строкой. Если ссылка равна null, то к строке добавляется текст "nuH". Если же ссылка указывает на объект, то у него вызывается специальный метод (он будет рассмотрен ниже, его имя toStringO) и текст, который он вер­нет, будет добавлен к строке.

Класс Object

В Java множественное наследование отсутствует. Каждый класс Может иметь только одного родителя. Таким образом, мы можем про­следить цепочку наследования от любого класса, поднимаясь все выше. Существует класс, на котором такая цепочка всегда заканчивается, это класс Object. Именно от него наследуются все классы, в объявлении которых явно не указан другой родительский класс. А значит, любой класс напрямую, или через своих родителей, является наследником Object. Отсюда следует, что методы этого класса есть у любого объекта (поля в Objectотсутствуют), а потому они представляют особенный интерес.

Рассмотрим основные из них.



<== предыдущая лекция | следующая лекция ==>
Булевский тип | Класс String


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


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

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

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


 


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

 
 

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

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