
- •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)

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 4

Класс Class
Класс Class служит для обозначения и анализа классов объектов в программах на Java, а также для представления встроенных типов (int, boolean, double[] …) в виде классов
Полное имя – java.lang.Class
Class pClass = p.getClass(); // объект класса Class: класс объекта p
Class newClass = Class.forName(className);
//загрузка нового класса в JVM по имени className
Загрузчик классов – встроенный или переопределенный пользователем (ClassLoader)
Если t – обозначение встроенного типа, то t.class – объект класса Class, представляющий данный тип, например:
int.class double[].class (String.class и String – одно и то же)aClass.getName() – имя объекта класса Class. Например:
double[].class.getName() -> ”[D” int[][].class.getName() -> ”[[I”
(C) В.О. Сафонов. 2013

Динамический анализ классов (reflection API)
import java.lang.reflect; // использование reflection API
Классы: Array, Constructor, Field, Method, Member, Modifier
Method[] methods = C.getMethods(); // public методы класса C
Field[] fields = C.getFields(); // public поля класса C
Method m = C.getMethod(name, argTypes);
m – метод класса C с заданной сигнатурой; argTypes - массив объектов класса Class
Object res = m.invoke (anObject, arguments);
Вызов найденного метода по объекту и значениям аргументов (если метод статический, anObject ==null)
if (M.getModifiers().isStatic() ) … – пример анализа модификаторов
В отличие от .NET, рефлексия в Java позволяет только
анализировать класс-файлы, но не генерировать их
(C) В.О. Сафонов. 2013

Простые типы Java (primitive types)
Тип в языке Java – либо объектный, либо простой
(primitive)
Простые типы: boolean, byte, short, int, long, char, float, double
boolean – логический тип со значениями true и false
и
логическими операциями: & - логическое AND: a & b
| - логическое OR: a | b
^ - логическое XOR (исключающее «ИЛИ») a ^ b
! - логическое NOT: !a
&& - условное AND: a && b; если a == false, b не
вычисляется
|| - условное OR: a || b; если a == true, b не
вычисляется
(C) В.Оbyte,. Сафоновshort,. int, long, char, float, double – числовые
2013 типы
char - двухбайтовые целые – коды символов

Особенности целочисленной арифметики в Java
Целые типы Java – byte, char, short, int, long
byte, short, int, long – 8- , 16- , 32- , 64-битовые
целые в дополнительном модифицированном коде (two’s complement integers)
сhar – 16-битовые беззнаковые целые,
представляющие символы в кодировке UNICODE
Представление целых чисел в Java не зависит от платформы
Целая арифметика – со знаком, без переполнения (отбрасывание старших битов вне разрядной сетки)
Внимание! Данная особенность Java небезопасна
Единственное исключение – ArithmeticException –
деление на 0
A op B -> int, если тип A и B – не long; иначе A op A -> long
Типов unsigned нет; приведения: (ubyte & 0xff)
(C) В.О(ushort. Сафонов.& 0xffff)
2013 Сравним с .NET: в C# и CTS есть и native-типы, и

Операции над целыми числами в Java
|
A+B |
A–B A*B |
-A A<B A <= B A == B A != B A >= B A>B |
|||
|
A / B |
|
A % B |
- деление нацело; остаток; результат - целый |
||
|
A & B |
|
A | B |
A ^ B |
- поразрядные логические операции |
|
|
A << B |
A >> B |
- сдвиг А влево (вправо) на B разрядов |
|||
|
(операция >> дополняет результат слева знаком A) |
|||||
|
A >>> B – сдвиг вправо; результат дополняется слева нулями |
|||||
|
Примеры: |
|
|
|
||
|
byte b = 2; short b = 3; int i = 4; long n = 5; int zero = 0; |
|||||
|
b + s -> (int) 5 |
|
|
|
||
|
s + n |
-> (long) 8 |
( или |
8L ) |
||
|
s = (short) (b + i); // s == (short) 6 |
|||||
|
b = i; |
|
b = 2+1 |
// ошибка: требуется приведение (byte) |
||
|
i / zero |
или |
i % zero |
// ArithmeticException |
||
|
1 / 5 == 0 |
|
// а не 0.2, как следовало ожидать |
(C) В.О. Сафонов. 2013

Диапазоны целых чисел в Java
|
byte b; // |
-128 <= b && b |
<= 127 |
|
short s; // |
-32768 <= s && |
s <= 32767 |
|
int i; // -2147483648 <= i && i <= 21474836347 |
long x; // -9223372036854775808 <=x &&
//x <= 9223372036854775807
char c; // ’ \u0000’ <= c && c <= ’ \uffff’ // т.е. 0 <= c && c <= 65535
(C) В.О. Сафонов. 2013

Особенности вещественной арифметики в Java
Вещественные типы – float (32 бита) и double (64 бита)
Представление не зависит от платформы: (sign,mantissa,exponent)
Вещественная арифметика соответствует стандарту IEEE 754:
-исключительных ситуаций не возникает
- при x > 0.0 |
x |
/ 0.0 |
-> PositiveInfinity (плюс бесконечность) |
- при x < 0.0 |
x |
/ 0.0 |
-> NegativeInfinity (минус бесконечность) |
- при x == 0.0 && y == 0.0 x / y -> NaN (Not-a-Number) |
|||
float f; double d; |
f |
op d -> double d op f -> double |
float r = 1.0f; // r = 1.0 – ошибка: 1.0 – значение типа double
Если класс специфицирован как strictfp, то все промежуточные
результаты – строго по стандарту
IEEE 754
В .NET вещественные типы – также native (System.Double, etc.)
(C) В.О. Сафонов. 2013

Операции над вещественными числами в Java
|
R1+R2 R1-R2 R1*R2 R1/R2 |
–R1 - арифметика |
|
|
R1<R2 R1 <= R2 R1 == R2 |
R1 != R2 |
R1 >= R2 R1 |
|
> R2 |
|
|
|
- Следует помнить, что Double.NaN != Double.NaN |
||
|
- Вместо A == B следует использовать Math.abs(A-B) < |
||
|
EPS |
|
|
|
- На практике лучше использовать константы точности: |
||
|
для float: EPS = 1e-4f для double: |
EPS = 1e-10 |
|
|
Поразрядных операций нет |
|
|
|
double d; … float f = (float) d; |
// приведение к типу float |
|
|
При округлении до вещественного – правило до |
||
|
ближайшего |
|
|
|
При округлении до целого – отбрасывание части |
||
(C) В.О. Сафонов. |
|
|
|
2013 |
мантиссы |
|
|

Диапазоны вещественных чисел в Java
x = sign * mantissa * 2**exponent, |
sign == +1 или -1 |
|
float: 0 < mantissa < 2**24 |
-149 |
<= exponent <= 104 |
Если 0 < mantissa < 2**23 и exponent == -149, |
||
то число x - ненормализованное |
|
|
double: 0 < mantissa < 2**53 |
-1075 <= exponent <= 970 |
Если 0 < mantissa < 2**52 и exponent = -1075, то число x - ненормализованное
(C) В.О. Сафонов. 2013