Назад | Содержание | Вперед

 Lecture Library

 

В составе Java SDK поставляется большая библиотека классов Java API. Эта библиотека включает большое количество классов, широко используемых при разработке Java-программ. Все эти классы находятся в подпакетах пакета java (например, java.lang, java.awt.event, java.util и т.п.). Соответственно, необходимо импортировать в программу, те из подпакетов, классы которых вы собираетесь использовать в программе. Исключение составляет пакет java.lang, который импортируется во все программы автоматически.

Чаще всего используются классы из пакетов java.lang (содержит наиболее фундаментальные классы, использование которых лежит в основе создания Java-программ) и java.util (классы, реализующие различные структуры данных, взаимодействие с системными функциями низкого уровня, работу с математическими функциями, генерацию случайных чисел и манипуляции с датами и временем). Далее рассматриваются основные классы пакетов java.lang и java.util. 

Во главе иерархии классов Java стоит класс Object. Object – это суперкласс всех других классов. Следовательно, ссылочная переменная типа Object может обращаться к объектам любого класса. Методы, определенные в классе Object, можно вызывать для объектов любого класса.

Все перечисленные методы можно переопределять в пользовательских классах.

 













Как уже говорилось ранее, простые типы данных в Java не являются объектами. Они оставлены в Java с целью повышения эффективности выполнения программ и сохранения привычных методов работы с числами и символами. Но и для этих типов в Java существуют специальные классы – классы-оболочки простых типов (type wrappers). По существу, эти классы инкапсулируют (обволакивают) внутри себя простые типы данных. Использование классов-оболочек продиктовано главным образом возникающей иногда необходимостью передавать простые типы в методы по ссылке. Напомним, что простые типы, в отличие от объектов, передаются методам по значению, а не по ссылке, т.е. для двух методов нет возможности сослаться на один и тот же экземпляр типа int. Вместо этого можно создать из простого типа объект соответствующего класса-оболочки и передать его в метод по ссылке. 

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

 







Все числовые классы-оболочки и класс Character определяют метод int compareTo(Type obj), где Type – соответствующий класс-оболочка. Этот метод сравнивает числовое значение, содержащееся в вызывающем объекте, с числовым значением аргумента. Результатом работы метода является целое число:

0, если числовое значение вызывающего объекта и числовое значение аргумента совпадают

1, если числовое значение вызывающего объекта больше числового значения аргумента

-1, если числовое значение вызывающего объекта меньше числового значения аргумента

 







Класс Math  находится в пакете java.lang и содержит методы, реализующие основные математические функции (показательные, логарифмические, тригонометрические и т.п.). Данный класс не имеет конструкторов (т.е. нельзя создать объект класса Math), но все его методы являются статическими, т.е. их можно вызывать без ссылки на конкретный объект. В классе определены 2 статические константы: E (приблизительно 2,72) и PI (приблизительно 3,14).

 










Текстовые строки в языке Java являются объектами класса String или StringBuffer. Символы в строках хранятся в кодировке Unicode. Тип каждого символа – char. Классы String и StringBuffer  находятся в пакете java.lang и доступны всем программам автоматически, т.к. этот пакет автоматически импортируется во все Java-программы. Оба класса объявлены с модификаторами final, что делает невозможным наследование от них собственных подклассов.   

 




При неправильном задании параметров offset, count возникает исключительная ситуация IndexOutOfBoundsException. При неправильном задании параметра encoding возникает исключительная ситуация UnsupportedEncodingException.

 




Со строками можно производить операцию сцепления (конкатенации), обозначаемую знаком +.  Результатом этой операции является строка, составленная из сцепленных первой и второй строк.

Приоритет операции сцепления строк выше, чем операции сложения. Поэтому записав “2” + 2 + 2, получим в результате строку “222”. Записав 2 + 2 + “2”, получим строку “42”, т.к. действия выполняются слева направо. Записав “2” + (2 + 2), получим “24”.

 







Важно понимать, что метод equals() и оператор == выполняют две различных операции применительно к строкам. Метод equals() сравнивает символы внутри строк, а оператор == ссылочные переменные, чтобы проверить, указывают ли они на один и тот же экземпляр объекта. Два различных String-объекта могут содержать один и те же символы, но ссылки на эти объекты будут различными и результаты операции == и метода equals() не совпадут (в случае строковых констант могут совпасть из-за string interning)

 













В отличие от класса String, представляющего неизменяемые строки фиксированной длины, объекты класса StringBuffer – это строковый буфер переменной длины. Создать объект класса StringBuffer можно только с помощью конструкторов:

 




Если строковый буфер начинает переполняться (при добавлении или вставке новых подстрок), его емкость автоматически увеличивается, так чтобы вместить новые символы.

В любое время емкость буфера можно увеличить с помощью метода:ensureCapacity(int minCapacity)

Этот метод изменит емкость строкового буфера только если minCapacity будет больше длины хранящейся в объекте строки. Емкость будет увеличена по следующему правилу: пусть текущая емкость буфера равна N, тогда новая емкость будет равна max(2N+2, minCapacity).

С помощью метода setLength(int newLength)

можно установить любую длину строкового буфера. Если она окажется больше текущей длины хранящейся в буфере строки, то дополнительные символы будут равны ‘\u0000’. Если она будет меньше текущей длины хранящейся в буфере строки, то строка будет обрезана, до newLength символов Если число newLength окажется отрицательным, возникнет исключительная ситуация IndexOutOfBoundsException.

Текущую длину строки, хранящейся в строковом буфере, можно узнать с помощью метода length(), а емкость буфера – с помощью метода capacity().

 










Задача синтаксического разбора введенной строки (парсинг) – очень часто возникает в прикладных программах. В пакет java.util входит класс StringTokenizer, облегчающий разбор строк.

В классе StringTokenizer 3 конструктора:

StringTokenizer(String str)

Создается объект, готовый разобрать строку str на слова, разделенные пробелами, символами табуляции ‘\t’, перевода строки ‘\n’, и возврата каретки ‘\r’. Разделители не включаются в число слов.

StringTokenizer(String str, String delim)

Второй параметр задает список разделителей.

StringTokenizer(String str, String delim, boolean flag)

Этот конструктор аналогичен второму, но параметр flag позволяет указать, включать ли разделители в число слов. Если flag = true, разделители включаются в число слов.

 







Абстрактный класс Process инкапсулирует процесс, т.е. выполняющуюся программу. Он используется прежде всего как суперкласс, для типов объектов, создаваемых методом exec() класса Runtime. 

Наиболее часто используются методы:

void destroy() Завершает процесс.

int waitFor() Приостанавливает выполнение текущего потока до завершения вызывающего процесса

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

Иногда необходимо узнать общий объем динамической памяти, доступный JVM, и объем свободной памяти (например, для проверки эффективности кода или оценки числа создаваемых объектов). Кроме того, иногда возникает необходимость освободить память занятую неиспользованными объектами принудительно. Для решения этих задач существуют методы freeMemory(), totalMemory(), gc().

Следует отметить, что значения возвращаемые методами freeMemory() и totalMemory() являются приблизительными, а освобождение памяти может состояться не сразу после вызова метода gc(), а тогда когда это будет сочтено целесообразным виртуальной машиной.

 







Чтобы запустить из Java-программы выполнение другого приложения следует воспользоваться методом exec(). Этот метод возвращает объект класса Process, который затем используется для контроля за взаимодействием Java-программы с этим новым выполняющимся процессом. Поскольку Java-программы могут выполняться на различных платформах, метод exec() неизбежно зависит от среды.

Следующий пример использует ехес() для запуска программы notepad.ехе (Блокнота). Этот пример, очевидно, должен выполняться в среде операционной системы Windows

Объектом типа Process, возвращенным из ехес(), можно управлять (с помощью Process-методов) уже после того, как новая программа начинает выполняться. Вы можете уничтожить подпроцесс с помощью метода destroy(). Метод waitFor() заставляет вашу программу ждать, пока подпроцесс не закончится. Метод exitValue() возвращает значение, переданное подпроцессом при его завершении. Это обычно 0, если не возникает никаких проблем.

 







Класс System выполняет функции, аналогичные классу Runtime, т.е. взаимодействие с системой в ходе выполнения программы. В этом классе продублировано большинство методов класса Runtime (loadLibrary(), exit(), gc()) но, в отличие от Runtime, в классе System эти методы являются статическими.  Кроме того, в классе System есть полезный статический метод long currentTimeMillis(), который возвращает время (в миллисекундах) прошедшее с 1 января 1970 г. Этот метод используется для подсчета времени выполнения программы (он вызывается в начале и в конце выполнения и фиксируется разница между возвращаемыми значениями).  

 




Для любой среды Java 2 доступны переменные среды, приведенные в табл. 5.2. Часть из этих переменных в целях безопасности доступны только для приложений (не для апплетов). Чтобы получать значения переменных среды либо изменять их, в классе System существуют методы

String getProperty(String variable)

String setProperty(String variable, String value)

 








Назад | Содержание | Вперед