Программирование на Java
Шрифт:
Также для совместимости с интерфейсом Comparable метод compareTo определен с параметром Object:
* public int compareTo(Object o) – если переданный объект имеет тип Character, результат будет аналогичен вызову compareTo((Character)o), иначе будет брошено исключение ClassCastException, так как Character можно сравнивать только с Character.
Статических методов в классе Character довольно много, но все они просты и логика их работы понятна из названия. Большинство из них - это методы, принимающие char и проверяющие всевозможные свойства. Например:
public static boolean isDigit(char c)
// проверяет, является ли char цифрой.
Эти методы возвращают значение истина или ложь, в соответствии с тем, выполнен ли критерий проверки.
Boolean
Представляет класс-обертку для примитивного типа boolean.
Реализует интерфейс java.io.Serializable
Для получения примитивного значения используется метод booleanValue.
Void
Этот класс-обертка, в отличие от остальных, не реализует интерфейс java.io.Serializable. Он не имеет открытого конструктора. Более того, экземпляр этого класса вообще не может быть получен. Он нужен только для получения ссылки на объект Class, соответствующий void. Эта ссылка представлена статической константой TYPE.
Делая краткое заключение по классам-оберткам, можно сказать, что:
* каждый примитивный тип имеет соответствующий класс-обертку ;
* все классы-обертки могут быть сконструированы как с использованием примитивных типов, так и с использованием String, за исключением Character, который может быть сконструирован только по char ;
* классы-обертки могут сравниваться с использованием метода equals ;
* примитивные типы могут быть извлечены из классов-оберток с помощью соответствующего метода xxxxValue (например intValue );
* классы-обертки также являются классами-утилитами, т.е. предоставляют набор статических методов для работы с примитивными типами;
* классы-обертки являются неизменяемыми.
Math
Класс Math состоит из набора статических методов, производящих наиболее популярные математические вычисления, и двух констант, имеющих особое значение в математике, – это число Пи и основание натурального логарифма. Часто этот класс еще называют классом-утилитой (Utility class). Так как все методы класса статические, нет необходимости создавать экземпляр данного класса, потому он и не имеет открытого конструктора. Нельзя также и наследоваться от этого класса, так как он объявлен с модификатором final.
Итак, константы определены следующим образом:
public static final double Math.PI – задает число π ("пи");
public static final double Math.E – основание натурального логарифма.
В таблице 13.2 приведены все методы класса и дано их краткое описание.
Таблица 13.2. Методы класса Math и их краткое описание.
Возвращаемое значение | Имя метода и параметры | Описание |
---|---|---|
… | abs(… a) | абсолютное значение (модуль) для типов double, float, int, long |
double | acos(double a) | арккосинус |
double | asin(double a) | арксинус |
double | atan(double a) | арктангенс |
double | ceil(double a) | наименьшее целое число, большее a |
double | floor(double a) | целое число, меньшее a |
double | IEEEremainder (double a, double b) | остаток по стандарту IEEE 754 (подробно рассматривался в лекции 3) |
double | sin(double a) | синус (здесь и далее: аргумент должен быть в радианах) |
double | cos(double a) | косинус |
double | tan(double a) | тангенс |
double | exp(double a) | e в степени a |
double | log(double a) | натуральный логарифм a |
… | max(… a, … b) | большее из двух чисел (для типов double, float, long, int ) |
… | min(… a, … b) | меньшее из двух чисел (для типов double, float, long, int ) |
double | pow(double a, double b) | a в степени b |
double | random | случайное число от 0.0 до 1.0 |
double | rint(double a) | значение int, ближайшее к a |
… | round(… a) | значение long для double ( int для float ), ближайшее к a |
double | sqrt(double a) | квадратный корень числа a |
double | toDegrees(double a) | преобразование из радианов в градусы |
double | toRadians(double a) | преобразование из градусов в радианы |
Строки
String
Этот класс используется в Java для представления строк. Он обладает свойством неизменяемости. После того как создан экземпляр этого класса, его содержимое уже не может быть модифицировано.
Существует много способов создать объект String. Наиболее простой, если содержимое строки известно на этапе компиляции, – написать текст в кавычках:
String abc = "abc";
Можно использовать и различные варианты конструктора. Наиболее простой из них – конструктор, получающий на входе строковый литерал.
String s = new String("immutable");
На первый взгляд, эти варианты создания строк отличаются только синтаксисом. На самом же деле различие есть, хотя в большинстве случаев оно несущественно. Рассмотрим пример:
public class Test {
public Test {
}
public static void main(String[] args) {
Test t = new Test;
String s1 = "Hello world !!!";
String s2 = "Hello world !!!";
System.out.println("String`s equally = " +
(s1.equals(s2)));
System.out.println(
"Strings are the same = " + (s1==s2));
}
}
В результате на консоль будет выведено:
String`s equally = true
Strings are the same = true
Теперь несколько модифицируем код:
public class Test {
public Test {
}
public static void main(String[] args) {
Test t = new Test;
String s1 = "Hello world !!!";
String s2 = new String("Hello world !!!");
System.out.println("String`s equally = " +
(s1.equals(s2)));
System.out.println(
"Strings are the same = " + (s1==s2));
}
}
В результате на консоль будет выведено:
String`s equally = true Strings are the same = false
Почему результат изменился? Дело в том, что создание нового объекта – это одна из самых трудоемких процедур в Java. Поэтому компилятор стремится уменьшить их количество, если это не приводит к непредсказуемому поведению программы.
В примере объявляются две переменные, которые инициализируются одинаковым значением. Поскольку класс String неизменяемый, их значения всегда будут одинаковыми. Это позволяет компилятору завести скрытую вспомогательную текстовую переменную, которая будет хранить такое значение, а все остальные переменные будут ссылаться на него же, а не порождать новые объекты. В результате в первом варианте программы создается лишь один объект String. Для большинства операций это несущественная разница. Исключение составляют действия, которые привязаны к конкретному объекту, а не к его значению. Это метод equals, методы wait/notify.
Во втором варианте указано динамическое обращение к конструктору. В этом случае компилятор уже не имеет возможности заниматься оптимизацией и JVM во время исполнения программы действительно создаст второй объект с точно таким же значением. Что мы и видим по результату выполнения примера.
В Java для строк определен оператор +. При использовании этого оператора производится конкатенация строк. В классе String также определен метод:
public String concat(String s);