- •JAVA-ТЕХНОЛОГИЯ
- •Класс Class
- •Динамический анализ классов (reflection API)
- •Простые типы Java (primitive types)
- •Особенности целочисленной арифметики в Java
- •Операции над целыми числами в Java
- •Диапазоны целых чисел в Java
- •Особенности вещественной арифметики в Java
- •Операции над вещественными числами в Java
- •Диапазоны вещественных чисел в Java
- •Классы-оболочки (wrapper classes)
- •Java 1.5: boxing/unboxing
- •Пример: сравнение чисел типа double
- •Сравнение арифметики Java и .NET
- •Начальные значения полей и переменных
- •Строки: java.lang.String (public final class)
- •Массивы (arrays)
- •Возможные формы конструкторов массивов
- •Операторы (statements)
Классы-оболочки (wrapper classes)
Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void
Преобразуют простое значение в объект:
Integer p = new Integer(i); |
// значение -> объект |
… p.intValue() ... |
// объект -> значение |
Содержат полезные константы:
Integer.MIN_VALUE Integer.MAX_VALUE (для числовых типов) Float.POSITIVE_INFINITY Float.NEGATIVE_INFINITY Float.NaN (аналогично – для Double)
и методы: Double.isInfinite(d) Double.isNaN(d)
Поле TYPE ссылается на класс-представитель простого типа: например, (Boolean.TYPE).getName() -> “boolean”
В .NET нет wrappers, но есть value types и boxing/unboxing
В Java 1.5 реализованы boxing и unboxing, как в .NET (наряду с wrapper-классами)
(C) В.О. Сафонов. 2013
Java 1.5: boxing/unboxing
(неявное преобразование простого значения в объект и обратно)
Byte obj = 5;
// boxing: эквивалентно Byte obj = new Byte(5); int i = obj;
// unboxing: эквивалентно int i = obj.byteValue();
Семантика: boxing – неявное создание объекта (в куче) и инициализация его простым значением
Реализовано под влиянием Microsoft.NET
(C)В.О. Сафонов.
2013
Пример: сравнение чисел типа double
public static boolean compare(double d1, double d2)
{
final double EPS = 1e-10; if (Double.isInfinite(d1)) {
return (Double.isInfinite(d2) &&
(d1 < 0 && d2 < 0 || d1 > 0 && d2 > 0)); } else if (Double.isNaN(d1)) {
return Double.isNaN(d2); } else {
return Math.abs(d1 – d2) < EPS; // см. : Д.Кнут, том 2 } // compare
(C) В.О. Сафонов. 2013
Сравнение арифметики Java и .NET
Основное отличие:
- Java предоставляет новый уровень абстракции и свою семантику арифметических операций, зафиксированную в спецификации Java и JVM;
- .NET - отображает набор простых типов в типы конкретной целевой платформы (Windows 2000/XP, UNIX FreeBSD, Linux)
В Java нет типов unsigned; они моделируются явным логическим умножением на маску; в .NET типы unsigned введены явно
В Java (до 1.5) значение простого типа преобразуется к объектному виду с помощью wrapper class; в .NET -
(C)В.Очерез. Сафоновboxing/unboxing.
2013(boxing: value type -> reference type; unboxing: ref type
Начальные значения полей и переменных
В Java, в отличие от C / C++, поля классов всегда имеют значения по умолчанию, даже если они явно не инициализированы:
public class Initialize { boolean b; // b == false
byte by; short s; int i; long l; float f; double d;
} // значения числовых полей – нули соответствующих типов
Для локальных переменных - иное правило: они должны быть
явно инициализированы способом, распознаваемым во время компиляции, иначе – фиксируется ошибка
при их использовании:
(C) В.Оpublic. Сафоновstatic. void main(String[] args)
2013 { int a; … System.out.println(a); } // ошибка: значение a
Строки: java.lang.String (public final class)
Строка – объект, состоящий из символов – значений типа char
Создается конструктором или изображением строки: ”abcdef”
Основная операция – конкатенация s1 + s2 + ... Sn
Типичная ошибка – сравнение строк на равенство s1 == s2. Следует использовать метод equals: s1.equals(s2)
Строка – не массив значений типа char;
s.charAt(i) –i-й символ строки (от 0); s.length() – длина строки
Для любого класса C метод public String toString() исполняется неявно в контексте, где требуется объект класса String
Другие полезные методы: String s = ”MyHome.html”; s.startsWith(”My”) s.endsWith(”html”)
s.indexOf(”.”) s.lastIndexOf(”.”) s.substring(3, 5).equals(”om”)
Строка – неизменяемый объект (в .NET – точно так же);
Класс StringBuffer c операцией append (изменяемая строка)
(C)В.О. Сафонов.
2013
Массивы (arrays)
Массивы – объекты (как и строки). Как и от строк, от них нельзя наследовать новые классы. Класс “массив”
не имеет имени
Массивы имеют специальный синтаксис для
обозначений, конструкторов и обращений к значениям элементов:
int[] a = new int[100];
for (int i = 0; i < a.length; i++) { a[i] = i* I; } // сравните с s.length()
Элементы, как и в строках, индексируются от 0
Многомерные массивы изображаются как массивы
массивов:
int[][] matrix = new int [30][50]; … matrix[i][j] … // matrix[i, j] – ошибка!
(C) В.JavaО. Сафонов1.5:. java.util.Arrays – содержит методы сортировки
2013и поиска (sort, binarySearch, …)
Возможные формы конструкторов массивов
С неопределенной длиной по последней размерности: int[][] m = new int[10][];
m[1] = new int[10]; m[1][5] = 3;
//new int[][10] – ошибка;
//Обращение к m[0] -> NullPointerException
С явным перечислением элементов:
Class[] classes = // определение массива классов аргументов {int.class, double[].class};
Object[] data = // определение массива аргументов new Object[] {new Integer(1), new double[] {1.0, 2.0}};
(C) В.О. Сафонов. 2013
Операторы (statements)
Синтаксис операторов заимствован из C / C++
Отличия:
-вместо переходов по метке - помеченные операторы M: S
иоператоры их прекращения: M: { … break M; … }
-в операторе try / catch введена ветвь finally
Операторы Java:
if (B) S; [ else S1; ] for (I1; I2; I3) S;
switch (x) { case C1: … case Cn: … default: … } do S while (B);
while (B) S break; continue; break M; continue N; // цикл
JDK 1.5: Новая форма цикла – цикл по коллекции (“for-each”)
Collection <ElementType> c; … for (ElementType e: c) {
Process (e);
}// в цикле выполняется перебор элементов коллекции
(C) В.О. Сафонов.
2013
Q&A
Вопросы?
(C) В.О. Сафонов. 2013
