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

2.2. Поля

Переменные класса называются полями; примерами могут служить поля nameFor и orbits, входящие в класс Body. Каждый объект Body обладает отдельным экземпляром своих полей: значение типа long отличает данное небесное тело от остальных, переменная типа String содержит его имя, а ссылка на другой объект Body определяет небесное тело, вокруг которого оно обращается.

Наличие у каждого объекта отдельного экземпляра полей означает, что его состояние уникально. Изменение поля orbits в одном объекте класса Body никак не отражается на значениях соответствующего поля в других объектах этого класса.

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

В нашем случае класс Body содержит одно статическое поле— nextID, в котором хранится следующий используемый идентификатор небесного тела. При инициализации класса, которая происходит после его загрузки и компоновки, в поле nextID заносится нулевое значение. Ниже мы убедимся, что текущее значение nextID присваивается идентификатору каждого вновь создаваемого объекта класса Body.

Когда в этой книге используются термины “поле” или “метод”, обычно имеются в виду нестатические поля и методы. В тех случаях, когда контекст не дает однозначного толкования, мы будем пользоваться термином “нестатическое поле” или “нестатический метод”.

Упражнение 2.3

Включите в класс Vehicle (транспортное средство) статическое поле для хранения идентификатора машины, а в класс Car (автомобиль)— нестатическое поле, содержащее номер машины.

2.3. Управление доступом и наследование

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

  • Открытый (Public): к членам класса всегда можно обращаться из любого места, в котором доступен сам класс; такие члены наследуются в подклассах.

  • Закрытый (Private): доступ к членам класса осуществляется только из самого класса.

  • Защищенный (Protected): к данным членам разрешается доступ из подклассов и из функций, входящих в тот же пакет. Такие члены наследуются подклассами. Расширение объектов (наследование) подробно рассмотрено в главе 3.

  • Пакетный: доступ к членам, объявленным без указания атрибута доступа, осуществляется только из того же пакета. Такие члены наследуются подклассами пакета. Пакеты рассматриваются в главе 10.

Поля класса Body были объявлены с атрибутом public, потому что для выполнения поставленной задачи программистам необходим доступ к этим полям. На примере более поздних версий класса Body мы убедимся, что подобное решение обычно является неудачным.

2.4. Создание объектов

Для первой версии класса Body создание и инициализация объектов, представляющих небесные тела, происходит следующим образом:

Body sun = new Body();

sun.idNum = Body.nextID++;

sun.nameFor = “Sol”;

sun.orbits = null; // Солнце является центром Солнечной

// системы

Body earth = new Body();

earth.idNum = Body.nextID++;

earth.nameFor = “Earth”;

earth.orbits = sun;

Сначала мы объявили две ссылки (sun и earth) на объекты типа Body. Как упоминалось выше, объекты при этом не создаются— лишь объявляются переменные, которые ссылаются на объекты. Первоначальное значение ссылок равно null, а соответствующие им объекты должны явным образом создаваться в программе.

Объект sun создается посредством оператора new. Конструкция new считается самым распространенным способом построения объектов (позднее мы рассмотрим и другие возможности). При создании объекта оператором new следует указать тип конструируемого объекта и необходимые параметры. Runtime-система выделяет область памяти, достаточную для хранения полей объекта, и инициализирует ее в соответствии с рассматриваемыми ниже правилами. После завершения инициализации runtime-система возвращает ссылку на созданный объект.

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

Создав новый объект Body, мы инициализируем его переменные. Каждый объект класса Body должен иметь уникальный идентификатор, который онполучает из статического поля nextID. Программа наращивает значение nextID, чтобы идентификатор следующего объекта Body также был уникальным.

В нашем примере строится модель Солнечной системы. В ее центре находится Солнце, поэтому полю orbits объекта sun присваивается значение null— у Солнца нет объекта, вокруг которого оно бы вращалось. Присоздании и инициализации объекта earth (Земля) мы присвоили полю orbits значение sun. Для Луны, вращающейся вокруг Земли, поле orbits получило бы значение earth. Если бы мы строили модель Галактики, то Солнце бы также вращалось вокруг “черной дыры”, находящейся где-то в середине Млечного Пути.

Упражнение 2.4

Напишите для класса Vehicle метод main, который создает несколько объектов-автомашин и выводит значения их полей.

Упражнение 2.5

Напишите для класса LinkedList метод main, который создает несколько объектов типа Vehicle и заносит их в список.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]