Что такое состояние объекта java
Классы. Объектно-ориентированное программирование
Классы и объекты
Java является объектно-ориентированным языком, поэтому такие понятия как «класс» и «объект» играют в нем ключевую роль. Любую программу на Java можно представить как набор взаимодействующих между собой объектов.
Класс определяется с помощью ключевого слова сlass :
Для хранения состояния объекта в классе применяются поля или переменные класса. Для определения поведения объекта в классе применяются методы. Например, класс Person, который представляет человека, мог бы иметь следующее определение:
Теперь используем данный класс. Для этого определим следующую программу:
Как правило, классы определяются в разных файлах. В данном случае для простоты мы определяем два класса в одном файле. Стоит отметить, что в этом случае только один класс может иметь модификатор public (в данном случае это класс Program), а сам файл кода должен называться по имени этого класса, то есть в данном случае файл должен называться Program.java.
Конструкторы
Если в классе не определено ни одного конструктора, то для этого класса автоматически создается конструктор без параметров.
Выше определенный класс Person не имеет никаких конструкторов. Поэтому для него автоматически создается конструктор по умолчанию, который мы можем использовать для создания объекта Person. В частности, создадим один объект:
В итоге мы увидим на консоли:
Если необходимо, чтобы при создании объекта производилась какая-то логика, например, чтобы поля класса получали какие-то определенные значения, то можно определить в классе свои конструкторы. Например:
Теперь в классе определено три коструктора, каждый из которых принимает различное количество параметров и устанавливает значения полей класса.
Консольный вывод программы:
Ключевое слово this
Ключевое слово this представляет ссылку на текущий экземпляр класса. Через это ключевое слово мы можем обращаться к переменным, методам объекта, а также вызывать его конструкторы. Например:
В третьем конструкторе параметры называются так же, как и поля класса. И чтобы разграничить поля и параметры, применяется ключевое слово this:
Так, в данном случае указываем, что значение параметра name присваивается полю name.
Кроме того, у нас три конструктора, которые выполняют идентичные действия: устанавливают поля name и age. Чтобы избежать повторов, с помощью this можно вызвать один из конструкторов класса и передать для его параметров необходимые значения:
В итоге результат программы будет тот же, что и в предыдущем примере.
Инициализаторы
Кроме конструктора начальную инициализацию объекта вполне можно было проводить с помощью инициализатора объекта. Инициализатор выполняется до любого конструктора. То есть в инициализатор мы можем поместить код, общий для всех конструкторов:
Что значит «отсутствие состояния»?
Java SE 8 представляет собой единое наибольшее развитие языка Java в его истории. Относительно небольшое количество возможностей — лямбда-выражения, ссылки на методы и функциональные интерфейсы — объединены для получения модели программирования, которая сочетает объектно-ориентированный и функциональный стили. Под руководством Брайана Гетца (Brian Goetz) это слияние достигнуто таким образом, что поощряет лучшие практики — неизменность, отсутствие состояния, композиционность — при сохранении “чувства Java” — удобочитаемости, простоты, универсальности.
Что значит «отсутствие состояния»?
3 ответа 3
В объектно-ориентированном программировании объект — это сущность, обладающая тремя признаками:
В Функциональном программировании объектов нет, но есть функции. И функции не имеют состояния — они чистое поведение
В Java 8 были добавлены лямбды и другие вещи из функциональной парадигмы. Лямбда в функциональном программировании — это анонимная функция и у нее нет состояния.
Вот об этом отсутствии состояния (как функциональном программировании) и идет речь.
Это плохой перевод термина stateless, то есть объекта который не имеет состояния:
Stateless object is an instance of a class without instance fields (instance variables). The class may have fields, but they are compile-time constants (static final).
Update
зачем вообще нужны такие объекты и почему это считается хорошей практикой?
Все зависит от контекста. Есть ситуации, когда это хорошая практика. Для понятности приведу пример из обычной жизни:
Лекция 02. Основы объектного подхода¶
Объектное проектирование (по Г.Бучу)¶
Основные методы проектирования¶
Существует небольшое число общеизвестных методов, использующихся в том числе в качестве основных при проектировании ПО:
В течение нескольких десятков лет существования компьютеров было разработано множество подходов к решению задач декомпозиции, абстракции и иерархии
Абстракция¶
Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет концептуальные границы с точки зрения наблюдателя.
Шоу: ‘’Абстракция – упрощенное описание системы, при котором одни детали выделяются, а другие опускаются. Хорошей является абстракция, которая выделяет существенные для рассмотрения и использования детали, а несущественные опускает.’‘
Принцип наименьшего удивления: абстракция должна охватывать все
поведение объекта, но не больше и не меньше, не привносить сюрпризов или
побочных эффектов, лежащих вне ее сферы применимости.
Главная задача ОО проектирования – выбор правильного набора абстракций для заданной предметной области.
Инкапсуляция¶
В то время как абстракция описывает внешний интерфейс класса, инкапсуляция занимается его внутренним устройством.
Принцип разделения интерфейса и реализации: в интерфейсной части собрано все, что касается взаимодействия данного объекта с любыми другими объектами; реализация скрывает детали, не имеющие отношения к этому процессу взаимодействия объектов.
Интерфейс объекта не должен зависеть от реализации.
Инкапсуляция – это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение.
Инкапсуляция служит для изоляции контрактных обязательств абстракции от их реализации.
Принцип отделения интерфейса от реализации может быть проиллюстрирован следующей
Модульность¶
В Java существуют следующие виды модулей:
Правильное разделение на модули является почти такой же сложной задачей, как и выбор правильного набора абстракций.
Для большинства программ лучшим решением будет сгруппировать логически связанные классы и объекты по отдельным модулям.
В больших системах иногда применяются также другие способы размещения кода по модулям исходя из критерия минимизации времени компиляции.
Иерархия¶
Обычно число абстракций в системе намного превышает умственные способности. Инкапсуляции и модульности оказывается недостаточно.
Значительное упрощение в понимании сложных задач достигается за счет образования из абстракций иерархической структуры.
Иерархия – это упорядочение абстракций, расположение их по уровням.
В ОО программировании основными видами сложных систем являются структура классов (is-a, наследование) и структура объектов (part of, агрегация).
Типизация¶
Типизация – это способ защититься от использования объектов одного типа вместо другого (или управлять таким использованием).
Java является строго типизированным языком. Необходимо максимально использовать его возможности проверки типов.
Аналог: разъемы спроектированы так, чтобы части соединялись только правильным образом. Немало изобретательности потрачено на то, чтобы разные части аппаратуры не вставлялись одна в другую
Недостаток: даже небольшие изменения в интерфейсе класса требуют перекомпиляции всех его подклассов.
Иерархия¶
Типизация¶
Точно определенные и строго типизированные интерфейсы являются фундаментальным инструментом проектирования.
Типизация позволяет находить некоторые ошибки уже на этапе компиляции. Она тем полезнее, чем больше проект.
Строго типизированный интерфейс гарантирует, что компилируются и компонуются только совместимые части программ: эти части могут делать сильные предположения относительно друг друга, при этом выполнение этих предположений гарантируется системой типов
эффект от этого проявляется в минимизации тестирования программы, что повышает эффективность и значительно упрощает фазу интеграции в проекте, над которым работало множество людей.
Повторное использование¶
Повторное использование предполагает использование уже написанного кода для построения других приложений, т.о. уменьшая время разработки и увеличивая качество этих приложений.
Конечная цель повторного использования – серийное производство ПО путем стыковки готовых компонентов.
Технические сложности повторного использования:
Объекты и отношения¶
Введение¶
Объект моделирует часть окружающей действительности:
Объект проявляет четко выделяемое поведение.
Смит и Токи: ‘’Объект представляет собой конкретный опознаваемый предмет, единицу или сущность (реальную или абстрактную), имеющую четко определенное функциональное назначение в данной предметной области’‘
Более общее определение: Объект – это нечто, имеющее четко очерченные границы.
Примеры объектов¶
Каждый осязаемый предмет может рассматриваться как объект:
Химический процесс – это тоже объект:
т.о. определены явные концептуальные границы, но объект неосязаем
Сфера и куб имеют обычно нерегулярное пересечение. Линия пересечения является объектом, хотя не существует отдельно от сферы и куба.
Объекты могут быть осязаемыми, но иметь размытые физические границы: реки, туман, толпы людей.
Определение объекта¶
Объект обладает состоянием, поведением и идентичностью (уникальностью).
Структура и поведение схожих объектов определяет общий для них класс.
Термины экземпляр класса и объект взаимозаменяемы.
Состояние объекта¶
Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного объекта и текущими (обычно динамическими) значениями каждого из этих свойств.
Тот факт, что объект имеет состояние, означает, что он занимает некоторое место в памяти компьютера.
Регистрационные записи о сотрудниках
Описание определяет не объект, а класс, т.к. он не определяет конкретных экземпляров.
Чтобы определить экземпляры, нужно написать следующее:
В памяти эти объекты не пересекаются и занимают каждый свое место.
На практике принято ограничивать доступ к состоянию объекта, а не делать его общедоступным.
Поведение объекта¶
Объекты не существуют изолированно, а подвергаются воздействию или сами воздействуют на другие объекты.
Поведение – это то, как объект действует и реагирует. Поведение выражается в терминах состояния объекта и передачи сообщений.
Операция – это определенное воздействие одного объекта на другой с целью вызвать соответствующую реакцию.
Пример: объект-очередь содержит следующие операции:
В Java операции над объектами называются методами или функциями-членами.
Поведение объекта задается типом операции и текущим состоянием объекта.
Операция – это услуга, которую класс может предоставить своим клиентам.
Наиболее распространенные типы операций:
Идентичность¶
Идентичность объекта¶
Идентичность – это такое свойство объекта, которое отличает его от всех других объектов.
Источником множества ошибок в ОО программировании является неумение отличать имя объекта от самого объекта.
Отношения¶
Сами по себе объекты не представляют никакого интереса: только в процессе их взаимодействия реализуется система.
ОО программа – это «сообщество хорошо воспитанных объектов, которые вежливо просят друг друга об услугах» (Ингалс).
Пример: самолет – это «совокупность элементов, каждый из которых по своей природе стремится упасть на землю, но за счет совместных усилий преодолевающих эту тенденцию» (Галл).
Отношения любых двух объектов основываются на предположениях, которыми один обладает относительно другого: об операциях, которые можно выполнять, и об ожидаемом поведении.
Два типа отношений:
Связи¶
Связь – это физическое или концептуальное соединение между объектами.
Участвуя в связи, объект может выполнять одну из следующих трех ролей:
Связь между объектом-клиентом и объектом-сервером необходима для того, чтобы объект-клиент мог запросить услугу у объекта-сервера.
Связь может быть односторонней или двусторонней.
Пусть есть два объекта A и B и связь между ними. Чтобы A мог послать сообщение в B, нужно, чтобы B был видим для A.
На стадии анализа об этом можно не беспокоиться, но на стадии реализации мы должны обеспечить видимость связанных объектов
Четыре способа обеспечить видимость:
Какой из этих способов выбрать – зависит от тактики проектирования.
Агрегация¶
Агрегация описывает отношения целого и его части, приводящие к соответствующей иерархии объектов.
Идя от целого (агрегата), мы можем прийти к его частям (атрибутам). Но, зная указатель на часть, нельзя определить содержащий его объект (если только сведения о нем не являются частью состояния части).
Агрегация может означать физическое вхождение одного объекта в другой (самолет содержит крылья, двигатель и т.д.) или концептуальное (акционер владеет своими акциями, но они не входят в него).
Агрегация иногда предпочтительнее связи, т.к. позволяет скрыть части в целом. Связи иногда предпочтительнее, т.к. они слабее и менее ограничительны. Принимая решение, надо взвесить все.
Java шпаргалка. Часть 2. Объекты и классы
Основные понятия которые необходимо знать в JAVA в области объектов классов.
Инкапсуляция — сокрытие информации, запрещение прямого доступа к полям экземпляра данного класса из других классов. Программы должны взаимодействовать с данными объекта только через методы этого объекта. Состояние объекта может измениться только в результате вызовов методов (в противном случае, принцип инкапсуляции не соблюден).
Данные в объекте — поля экземпляра, функции и процедуры, выполняющие операции над данными — методами.
Object — глобальный суперкласс. Все остальые классы расширяют его.
Наследование — расширение класса и получение на основе него нового. Новый класс содержит все свойства и методы расширяемого класса. Также в него добавляются новые методы и поля данных.
В объектно-ориентированном программировании сначала необходимо идентифицировать классы, а затем добавить методы в каждый класс.
Отношения между классами
Зависимость (использует — что-то). Например объекты типа Order должны иметь доступ к объектам типа Account, чтобы проверить количество денег на счету заказчика.
Агрегирование (содержит — что-то). Например объект типа Order (заказ) может содержить объекты типа Item (товары).
Наследование (является — чем-то).
Основные отношения UML
Объектная переменная не содержит никакого объекта. Она лишь ссылается на него. Значение любой объектной переменной в Java представляет собой ссылку на объект, размещенный в другом месте. Операция new также возвращает ссылку.
Date birthday = new Date();
Объектной переменной можно явно присвоить пустое значение null, чтобы указать на то, что она пока не ссылается ни на один из объектов:
Объектные переменные в Java следует считать аналогами указателей на объекты.
Date birthday; // Java
Все объекты в Java располагаются в динамической области памяти, иначе называемой «кучей». Если объект содержит другую объектную переменную, то она представляет собой всего лишь указатель на другой объект, расположенный в этой области памяти.
Пример простого класса
class Employee
<
private String name; // Private означает, что к данным полям имеют доступ только методы самого класса Employee. Ни один внешний метод не может читать или записывать данные в эти поля.
private double salary;
private Date hireDay;
public Employee(String n, double s, int year, int month, int day)
<
name = n;
salary = s;
hireDay = LocalDate.of(year, month, day);
>
public String getName()
<
return name;
>
Не следует объявлять поля экземпляра как public, так как любые компоненты и программы могут к ним обратиться и изменить их.
Внимание
class Employee
<
private Date hireDay;
…
public Date getHire()
<
return hireDay; //Так делать нельзя!
// Используйте return hireDay.clone(); если нужно скопировать изменямое поле данных.
>
>
Дело в том, что объекты типа Date, в отличие от LocalDate, имеют модифицирующие методы. Из-за этого нарушается принцип инкапсуляции.
Привилегии доступа к данным в классе
Метод имеет доступ к закрытым данным того объекта, для которого он вызывается. Но он также может обращаться к закрытым данным всех объектов своего класса.
Закрытые методы
Для взаимодействия с другими объектами требуются открытые методы, однако в ряде случаев для вычислений нужны вспомогательные методы. Как правило, они не являются частью интерфейса, поэтому чаще всего они объявляются как private, т.е. закрытые. Пока метод является закрытым (private), разработчики класса могут быть уверены в том, что он никогда не будет использован в операциях, выполняемых за пределами класса, а значит можно его просто удалить.
Неизменяемые поля экземпляра
private final String name;
Такое поле должно инициализироваться при создании объекта, то есть необходимо гарантировать, что значение поля будет установлено по завершении каждого конструктора. После этого его значение изменить уже нельзя.
Модификатор final удобно применять при объявлении полей простых типов или полей, типы которых задаются неизменяемыми классами. Неизменяемым называется такой класс, методы которого не позволяют изменить состояние объекта. Например, неизменяемым является класс String. Если класс допускает изменения, то ключевое слово final может стать источником недоразумений.
Статические поля
Поле с модификатором доступа static существует в одном экземпляре для всего класса.
class Article
<
private int id;
private static int nextId = 1;
Даже если не создано ни одного объекта типа Article, статическое поле nextId все равно существует. Оно принадлежит классу, а не конкретному объекту.
Статические константы
Статические переменные используются достаточно редко, однако статические константы применяются намного чаще. Например:
public class Math
<
public static final double PI = 3.14;
>
Делать поля открытыми в коде не рекомендуется, но открытыми константами (т.е. полями, объявленными с final) можно пользоваться смело.
Статические методы
Статическими называют методы, которые не оперируют объектами. У них нет явного параметра this. Так как статические методы не оперируют объектами, из них нельзя получить доступ к полям экземпляра. Но статические методы имеют доступ к статическим полям класса.
Для вызова статических методов рекомендуется использовать имена их классов, а не объекты.
Статические методы следует применять в следующих случаях:
1. Когда методу не требуется доступ к данным о состоянии объекта, поскольку все необходимые параметры задаются явно (например, Math.pow()).
2. Когда методу требуется доступ лишь к статическим полям класса.
P.S. В C++ ключевое слово static обозначает переменные и методы, принадлежащие классу, но не принадлежащие ни одному из объектов этого класса. Именно этот смысл значения перебрался в Java.
Фабричные методы
Фабричные методы — еще одно применение статических методов.
Например:
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
Метод main
Метод main не оперирует никакими объектами. При запуске программы еще нет никаких объектов. Статический метод main() выполняется и конструирует объекты, необходимые программе.
P.S. Каждый класс может содержать метод main(). С его помощью удобно организовать блочное тестирование классов. Причем если класс ClassWithMain с методом main является частью большого приложения ClassMainProgram, то при выполнении java ClassMainProgram метод main в ClassWithMain не выполнится.
Параметры методов
Вызов по значению — метод получает значение, переданное ему из вызывающей части программы.
Вызов по ссылке — метод получает из вызывающей части программы местоположение переменной. Таким образом, метод может модифицировать значение переменной, передаваемой по ссылке, но не переменной, передаваемой по значению.
В языке Java всегда используется только вызов по значению. Таким образом, метод получает копии значений всех своих параметров. Именно по этому метод не может видоизменять содержимое ни одной из переменных, передаваемых ему в качестве парметров.
Причем, методы не могут изменит параметры примитивных типов. Другое дело обстоит с объектами. Метод получает копию ссылки на объект, поэтому копия и оригинал ссылки указывают на один и тот же объект. Однако передача объектов в Java ведется не по ссылке. Если мы передаем объект в метод, то ссылка на этот объект копируется перед началом выполнения метода.
Таким образом, в Java для передачи объектов не применяется вызов по ссылке. Вместо этого ссылки на объекты передаются по значению.
Конструирование объектов
Перегрузка
Перегрузка — тот случай, когда у нескольких методов имеются одинаковые имена, но разные параметры. Компилятор должен сам решить, какой метод вызвать, сравнивая типы параметров, определяемых при объявлении методов, с типами значений, указанных при вызове методов.
В языке Java можно перегрузить любой метод, а не только конструкторы. Тип возвращаемого методом значения не входит в его сигнатуру. Таким образом, нельзя создать два метода, имеющих одинаковые имена и типы параметров и отличающихся лишь типом возвращаемого значения.
Инициализация полей по умолчанию
Если значение поля в конструкторе явно не задано, то ему автоматически присваивается значение по умолчанию: числам — нули, логическим переменным — логическое значение false, ссылкам на объект — пустое значение null. Однако полагаться на действия по умолчанию не следует.
Конструктор без аргументов
Многие классы содержат конструктор без аргументов, создающий объект, состояние которого устанавливается соответствующим образом по умолчанию.
Пример конструктора без аргументов для класса Building
Если в классе совсем не определены конструкторы, то автоматически создается конструктор без аргументов. В этом конструкторе всем полям экземпляра присваиваются их значения, предусмотренные по умолчанию.
Если же в классе есть хотя бы один конструктор и явно не определен конструктор без аргументов, то создавать объекты, не предоставляя аргументы нельзя.
Явная инициализация полей
private String name = «»;
Это присваивание выполняется до вызова конструктора. Такой подход оказывается полезным, когда требуется, чтобы поле имело конкретное значение независимо от вызова конструктора класса.
Также поле может инициализироваться с помощью метода.
class Building
<
private static int nextId;
private int /> ….
private static int assignId()
<
int r = nextId;
nextId++;
return r;
>
>
Имена параметров
Зачастую в качестве параметров служат отдельные буквы. Например:
public Building(String s, int h)
<
street = s;
house = h;
>
Однако при чтении программы невозможно понять, что же означают параметры s и h. Поэтому некоторые программисты добавляют к осмысленным именам параметров префикс «a».
public Building(String aStreet, int aHouse)
<
street = aStreet;
house = aHouse;
>
Есть еще один прием. Дело в том, что параметры скрывают поля экземпляра с такими же именами. Если вызвать метод с параметром house, то ссылка house будет делаться на параметр, а не на поле экземпляра. Доступ к полю экземпляра осуществляется с помощью выражения this.house.
this — обозначает неявный параметр, т.е. конструируемый объект.
public Building(String street, int house)
<
this.street = street;
this.house = house;
>
Вызов одного конструктора из другого
this обозначает неявный параметр метода. Однако у этого слова имеется еще одно значение.
Если первый оператор конструктора имеет вид this( … ), то вызывается другой конструктор этого же класса.
Блоки инициализации
Поле можно инициализировать следующими способами
Однако, есть еще и третий механизм — блок инициализации. Такой блок выполняется каждый раз, когда создается объект данного класса.
class Building
<
private static int nextId;
private int id;
Блок инициализации выполняется первым, вслед за ним — тело конструктора. Этот механизм обычно не применяется.
Действия, происходящие при вызове конструктора
Если для инициализации статических полей класса требуется сложный код, то удобнее использовать статический блок инициализации. Для этого необходимо разместить код в блоке инициализации и пометить его ключевым словом static.
// Статический блок инициализации
static
<
Random generator = new Random();
nextId = generator.nextInt(10000);
>
Статическая инициализация выполняется в том случае, если класс загружается впервые. Аналогично полям экземпляра, статические поля принимают значения 0, false и null.
Уничтожение объектов и метод finalize()
Так как некоторые объекты используют кроме памяти и другие ресурсы, например файлы или другие объекты, которые обращаются к системным ресурсам. Таким образом в данном случае очень важно, чтобы ресурсы освобождались вовремя. Для этого в любой класс можно ввести метод finalize(), который будет вызван перед тем, как система сборки мусора уничтожит объект.
Однако, если требуется возобновить ресурсы и сразу использовать их повторно, нельзя полагаться только на метод finalize(), так как неизвестно когда именно этот метод будет вызван.
Если ресурс должен быть освобожден сразу после его использования, то придется написать соответствующий код самому. Для этого следует предоставить метод close(), который занимается очисткой памяти. Его необходимо вызывать, когда какой-либо объект больше не нужен.
Пакеты
Java позволяет объединять классы в пакеты.
Например, java.lang, java.util являются пакетами.
Пакеты необходимы для того, чтобы обеспечить однозначность имен классов. Например, если в программе будут использованы два класса с одинаковыми именами, но они будут находиться в разных пакетах, то конфликт имен не возникнет.
Для обеспечение однозначности имени пакета используют доменное имя компании, написанно в обратном порядке. В составе пакета можно создавать подпакеты.
Например, в пакете ru.virand можно создать подпакет ru.virand.android
Подпакеты необходимы для гарантирования однозначности имен. С точки зрения компилятора пакет и его подпакет вообще никак не связаны друг с другом.
Импорт классов
В классе могут использоваться все классы из собственного пакета и все открытые классы из других пакетов. Доступ к классам из других пакетов можно получить двумя способами:
Статический импорт
import static java.lang.System.*;
Дана форма записи позволяет импортировать не только классы, но и статические методы и поля.
Это позволяет использовать статические методы и поля, определенные в классе System, не указывая имени класса:
out.println(«Hello, this is VIRAND 🙂 «); // С обычным import пришлось бы писать System.out
exit(0); // С обычным import пришлось бы писать System.exit
Ввод классов в пакеты
Для того, чтобы ввести класс в пакет, необходимо указать имя пакета в начале исходного файла перед определением класса.
Например:
public class MathGenerator
<
>
Если оператор package в исходном файле не указан, то классы, описанные в этом файле, вводятся в пакет по умолчанию, у которого нет имени.
Пакеты необходимо размещать в подкаталоге, путь к которому соотвтетсвует полному имени пакета: ru/virand/android
javac ru/virand/Payment.java
java ru.virand.Payment
Область действия пакетов
Открытые компоненты public могут использоваться любым классом.
Закрытые компоненты private могут использоваться только тем классом, в котором они были определены.
Если ни один из модификаторов доступа не указан, то компонент программы (метод, переменная или класс) доступен всем методам в том же самом пакете.
Переменные должны быть явно обозначены как private, иначе их область действия будет по умолчанию расширена до пределов пакета, а это нарушает принцип инкапсуляции.
Однако разработчики пакета java.awt нарушили этот принцип.
public class Window extends Container
<
String warningString;
>
Как видим у warningString отсутствует модификатор доступа private. Значит методы всех классов из java.awt могут обратиться к ней и изменить ее.
Путь к классам
Классы хранятся в подкаталогах файловой системы. Путь к классу должен совпадать с именем пакета.
Также можно установить переменную окружения CLASSPATH
export CLASSPATH=/home/user/classdir. /home/user/archives/archive.jar
Документирующие комментарии
Утилита javadoc — составляет документацию в формате HTML.
javadoc извлекает сведения о следующих компонентах программы:
Комментарии к методам
Документироват нужно лиш открытые поля. Они как парвило являются статическими константами.