Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java1_2013_2014 / java4.pptx
Скачиваний:
133
Добавлен:
16.04.2015
Размер:
136.79 Кб
Скачать

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

Соседние файлы в папке java1_2013_2014