Главная » Java » Инфраструктура Java

0

Язык Java разработан так, чтобы обеспечивать максимальную переносимость. Многие аспекты Java определяются сразу для всех возможных реализаций. Например, тип int всегда должен представлять собой 32-разрядное целое со знаком с дополнением по модулю 2. Во многих языках программирования  точные определения типов являются уделом конкретной реализации; на уровне языка даются лишь общие гарантии, такие как минимальный диапазон чисел данного типа или возможность системного запроса, позволяющего определить диапазон на данной платформе.

В языке Java такие требования продвинуты вплоть до уровня машинного языка, на который транслируется текст программ. Исходный текст программы на Java

компилируется в байт-код, выполняемый на виртуальной машине Java. Байт-код является

универсальным языком, и именно он интерпретируется  виртуальной машиной в каждой системе, поддерживающей  Java. /Разумеется, виртуальная машина Java может быть реализована и на аппаратном уровне – то есть с использованием специализированных микросхем. Это никак не влияет на переносимость байт-кода и является всего лишь одним из видов реализации виртуальной машины. – Примеч. перев/

Виртуальная машина присваивает каждому приложению собственный контекст времени выполнения (runtime), который одновременно изолирует приложения друг от друга и обеспечивает безопасность работы. Менеджер безопасности каждого контекста времени выполнения определяет, какие возможности доступны данному приложению. Например, менеджер безопасности может запретить приложению чтение или запись на локальный диск или ограничить сетевые соединения строго определенными компьютерами.

В совокупности все эти средства делают язык Java полностью платформонезависимым и предоставляют схему безопасности для выполнения переданного по сети кода на различных уровнях доверия (trust levels). Исходный текст Java, скомпилированный  в байт-код Java, может выполняться на любом компьютере, где имеется виртуальная машина Java. Код может выполняться на соответствующем  уровне защиты, чтобы предотвратить случайное или злонамеренное повреждение системы. Уровень доверия

регулируется в зависимости от источника байт-кода — байт-код на локальном диске или в

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

1.15. Прочее

Java содержит ряд других возможностей, которые кратко упоминаются здесь и рассматриваются в следующих главах:

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

Ввод/вывод: Java содержит пакет java.io, предназначенный  для выполнения разнообразных операций ввода/вывода. Конкретные возможности ввода/вывода описаны в главе 11.

Классы общего назначения: в состав Java входят классы, представляющие многие примитивные типы данных (такие, как Integer, Double и Boolean), а также класс Class для работы с различными типами классов. Программирование  с использованием  типов рассматривается в главе 13.

Вспомогательные  классы и интерфейсы: Java содержит пакет java.util со множеством полезных классов — таких, как BitSet, Vector, Stack и Date. Более подробно о вспомогательных  классах рассказывается в главе 12.

КЛАССЫ И ОБЪЕКТЫ Начнем с самого начала, хотя порядок может быть и другим. Доктор Who, Meglos

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

В объектно-ориентированном программировании  между тем, что делается, и тем, как это делается, существуют четкие различия. “Что” описывается в виде набора методов (а иногда и общедоступных данных) и связанной с ними семантики. Такое

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

Обычно считается, что объявленные в классе методы составляют все содержание его контракта. Кроме того, в понятие контракта входит и семантика этих операций, даже несмотря на то, что она может быть описана лишь в документации. Два метода могут иметь одинаковые имена и сигнатуры, но они не будут эквивалентными, если обладают различной семантикой. Например, нельзя предположить, что каждый метод с именем print

предназначен для вывода копии объекта. Кто-нибудь может создать метод print и вложить

в его название иную семантику — скажем, термин может быть сокращением от выражений “process interval” или “prioritize nonterminals”. Контракт (то есть совокупность сигнатуры и семантики) определяет сущность метода.

На вопрос “как” отвечает класс, на основе которого создавался данный объект. Класс определяет реализацию методов, поддерживаемых объектом. Каждый объект представляет собой экземпляр класса. При вызове метода объекта выполняемый код

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

2.1. Простой класс

Основными компонентами класса являются поля (данные) и методы (код для работы с ними). Приведем простой класс Body, предназначенный  для хранения сведений о небесных телах:

class Body {

public long idNum; public String nameFor; public Body orbits;

public static long nextID = 0;

}

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

Body mercury;

Подобное объявление указывает на то, что mercury является ссылкой на объект класса Body. Оно не создает сам объект, а лишь объявляет ссылку на него. Первоначально ссылка имеет значение null, и объект, на который ссылается mercury, не существует до тех пор, пока вы не создадите его явным образом; в этом отношении Java отличается от других языков программирования,  в которых объекты создаются при объявлении переменных.

Первая версия класса Body спроектирована неудачно. Это было сделано намеренно: по мере усовершенствования класса в данной главе мы сможем сосредоточить свое внимание на некоторых возможностях языка.

Упражнение 2.1

Напишите простой класс Vehicle (транспортное средство) для хранения информации об автомашине, в котором предусмотрены (как минимум) поля для задания текущей скорости, текущего направления в градусах и имени владельца.

Упражнение 2.2

Напишите класс LinkedList (связный список), в котором имеется поле типа Object и ссылка на следующий по списку элемент LinkedList.

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 мы убедимся, что подобное решение обычно является неудачным.

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии