Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 6. Введение в классы 139

Рис. 6.1. Объявление объекта типа Box

Операция new

Как только что было указано, операция new динамически распределяет па-мятъ для объекта. Он имеет следующую общую форму:

class-vaf = new classname();

Здесь ciass-var — переменная типа "класс", которая создается; ciassname — имя класса, экземпляр которого создается. За именем класса следуют круг­лые скобки, устанавливающие конструктор класса. Конструктор (construc­tor) определяет, что происходит, когда объект класса создается. Это важная часть всех классов. Конструкторы имеют много существенных атрибутов. Большинство классов явно определяют свои собственные конструкторы (внутри своих определений). Однако если явный конструктор не определен, то Java автоматически обеспечит так называемый "конструктор по умолча­нию" (default constructor) или умалчиваемый конструктор. Именно так обсто­ит дело с классом box. Пока мы будем использовать конструктор по умолча­нию, но скоро вы увидите, как можно определять ваши собственные конст­рукторы.

Сейчас вы могли бы задаться вопросом, почему не нужно использовать опе­рацию new для таких типов данных, как целые числа или символы. Ответ заключается в том, что простые типы Java не реализованы как объекты. Они реашзованы как "нормальные" переменные. Это сделано в интересах эф­фективности. Объекты имеют много свойств и атрибутов, которые требуют, чтобы Java обращалась с ними иначе, чем с простыми типами. Не применяя к простым типам тот же подход, который используется с объектами, Java может реализовывать простые типы более эффективно. Позже вы увидите

140 Часть I. Язык Java

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

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

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

Назначение

ссылочных переменных объекта

Во время выполнения операции назначения (присваивания) ссылочные пере­менные объекта (object reference variables) действуют иначе, чем можно было бы ожидать. Например, как вы думаете, что делает следующий фрагмент?

Box Ы = new Box(); Box Ь2 = Ы

Вы могли бы предположить, что переменной Ь2 назначается ссылка на ко­пию объекта, на который ссылается ы. То есть вы могли бы подумать, что ы и Ь2 обращаются к отдельным и различным объектам. Однако это было бы неправильно. На самом деле после того, как этот фрагмент выполнится, обе переменных (ы и Ь2) будут ссылаться на один и тот же объект. Назна­чение ы переменной Ь2 не распределяет никакой памяти и не копирует ка­кую-либо часть первоначального объекта. Эта операция просто помещает в Ь2 ссылку из ы. Таким образом, любые изменения, сделанные в объекте через Ь2 затронут объект, на который ссылается ы, т. к. это один и тот же объект. Данная ситуация изображена на рис. 6.2.

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

Соседние файлы в папке JavaLit