Кен Арнольд Джеймс Гослинг
Вид материала | Документы |
Содержание14.8. Класс Math Приложение АРодные методы |
- Джеймс трефил, 41001.36kb.
- Джеймс А. Дискретная математика и комбинаторика [Текст] / Джеймс А. Андерсон, 42.79kb.
- Человеческая способность эти ценности производить и использовать; является важнейшей, 110.76kb.
- Джеймс блиш города в полете 1-4 триумф времени вернись домой, землянин жизнь ради звезд, 10495.38kb.
- Джеймс Н. Фрей. Как написать гениальный роман, 2872.12kb.
- Дп «авто интернешнл» Київ, вул. Урицького, 1а Тел. (044) 20-60-333 Факс. (044) 20-60-343, 82.44kb.
- Тема Кол-во страниц, 26.85kb.
- Тема Кол-во страниц, 56.3kb.
- Тема Кол-во страниц, 20.7kb.
- Арнольд И. В. Стилистика современного английского языка, 20.42kb.
14.7. Безопасность
Класс System содержит два метода для работы с объектом класса Security Manager. Класс SecurityManager включает в себя методы, которые разрешают или запрещают открытие сокетов (sockets), доступ к файлам, создание программных потоков и т. д. Подробности о работе менеджера безопасности приведены в спецификации “Java Language Specification”.
public static void setSecurityManager(SecurityManager s)
Задает системный объект, который является менеджером безопасности. Данное значение может быть присвоено только один раз, чтобы при настройке безопасности системы можно было рассчитывать на то, что оно не изменится.
public static SecurityManager getSecurityManager()
Выдает системный объект менеджера безопасности. Описание менеджера безопасности слишком усложнило бы эту книгу; за подробностями обращайтесь к онлайновой документации.
14.8. Класс Math
Класс Math состоит из статических констант и методов, предназначенных для математических вычислений общего назначения. Все операции выполняются в арифметике double.
Константа Math.E представляет значение числа e (2.7182818284590452354), а Math.PI — значение числа p (3.14159265358979323846). Значения углов в методах задаются в радианах, а все параметры и возвращаемые значения имеют тип double, если явно не оговорено обратное:
Функция | Значение |
sin(a) | синус a |
cos(a) | косинус a |
tan(a) | тангенс a |
asin(v) | арксинус v, где v лежит в диапазоне [–1.0, 1.0] |
acos(v) | арккосинус v, где v лежит в диапазоне [–1.0, 1.0] |
>atan(v) | арктангенс v, возвращается в диапазоне [–p/2, p/2] |
atan2(x,y) | арктангенс x/y, возвращается в диапазоне [–p, p] |
exp(x) | ex |
pow(y,x) | yx |
log(x) | натуральный логарифм x |
sqrt(x) | квадратный корень из x |
ceil(x) | наименьшее целое число x |
floor(x) | наибольшее целое число x |
rint(x) | возвращает округленное целое значение x в виде double |
round(x) | возвращает (int)floor(x+0.5) в виде double или float |
abs(x) | возвращает модуль x для любого числового типа |
max(x,y) | возвращает наибольшее из чисел x и y, относящихся к любому числовому типу |
min(x,y) | возвращает наименьшее из чисел x и y, относящихся к любому числовому типу |
Статический метод Math.IEEERemainder вычисляет остаток в соответствии со стандартом IEEE-754. Оператор вычисления остатка %, описанный в разделе 5.15.1, подчиняется правилу
(x/y)*y + x%y == x
При этом сохраняется всего один вид симметрии, а именно: если x%y равно z, то изменение знака x или y изменит знак z, но не повлияет на абсолютную величину. Например, 7%2.5 дает 2.0, а -7%2.5 равняется 2.0. Стандарт IEEE определяет поведение остатка для x и y иначе, сохраняя симметрию расположения на числовой оси — результат Math.IEEERemainder(-7, 2.5) будет равен -0.5. Оператор вычисления остатка делает значения симметричными относительно нуля на числовой оси, тогда как механизм работы с остатком по стандарту IEEE разносит получившиеся величины на y единиц. Метод присутствует потому, что обе разновидности остатка могут пригодиться.
Статический метод random генерирует псевдослучайное число r в диапазоне 0,0 r 1,0. Средства для более точного управления псевдослучайными числами рассматриваются в разделе “Класс Random” на стр. .
Упражнение 14.5
Напишите программу-калькулятор, которая работает со всеми этими функциями, а также (по меньшей мере) с базовыми операторами +, -, *, / и %. Вероятно, проще всего будет реализовать калькулятор с обратной польской нотацией, поскольку приоритет операторов значения не имеет.
Приложение А
Родные методы
Их прозвали “чудо-рабочими”, когда один из них поинтересовался, каким гаечным ключом нужно забивать шуруп в стену
Джордж Браун, конгрессмен, Сан-Бернардино, Калифорния.
Иногда возникают ситуации, когда приложение или библиотека не могут быть написаны исключительно на языке Java, и тогда приходится создавать код на другом языке, который, вероятно, более точно учитывает специфику используемой платформы. Обычно потребность в этом возникает в следующих случаях:
- Уже имеется большой объем работающего программного кода. Проще написать “прокладку” для этого кода на Java, чем переписывать его заново.
- Приложение должно пользоваться системными средствами, отсутствующими в классах Java.
- Среда Java не обладает достаточным быстродействием для приложений, критичных по времени, и реализация их на другом языке может оказаться более эффективной.
Чтобы помочь программисту в подобных ситуациях, Java позволяет реализовывать родные (native) методы на каком-либо из локальных (родных) языков программирования, обычно C или C++. Родные методы объявляются следующим образом:
public native void unlock() throws IOException;
Ключевое слово native представляет собой еще один модификатор для объявляемого метода. Родные методы реализуются на родных языках, поэтому для них не существует программного кода на Java. Тем не менее, они вызываются из Java-программ, как и любые другие методы.
Класс, содержащий родной метод, в соответствии с требованиями безопасности, не может загружаться по сети и выполняться. Более конкретно — классы с родными методами не могут использоваться в аплетах<$Iаплет>. Даже если вопросы безопасности вас не интересуют, родной код не дает тех гарантий переносимости, которые предоставляет Java. Любой код на Java, использующий родные методы, должен отдельно переноситься на каждую целевую платформу.
И все же родные методы могут приносить пользу, особенно если вы будете полагаться на общедоступные библиотеки. Однако код Java, содержащий родные методы, ни в коем случае не может применяться в качестве аплета, запускаемого удаленным пользователем, поскольку аплет должен соответствовать требованиям переносимости и безопасности.
При использовании родных методов также приходится жертвовать защитными ограничениями Java. Так, в традиционных языках, может происходить выход за границы массива и появление неопределенных значений указателей. Все ограничения на родные методы задаются только тем языком, на котором они написаны.
В этой главе рассказано, как реализовать родной метод на языке C в системах семейства POSIX (к которым относятся, например, Windows NT и большинство реализаций UNIX). Некоторые детали в вашей системе могут отличаться от описанных, а многие среды поддерживают и другие языки кроме C, например, C++. Информацию об этом можно найти в вашей документации. Здесь мы рассматриваем многие важные аспекты согласования языка C с системой Java компании Sun, версия 1.0.2. Возможно, в вашей локальной среде присутствуют изменения и усовершенствования или используется совершенно иная схема согласования. В частности, описанные здесь способы связывания (binding) родных методов наверняка изменятся в будущих версиях. Но даже с учетом этих обстоятельств, данная глава поможет вам понять некоторые аспекты связывания родных методов, не зависящие от конкретной схемы, принятой в вашей среде.