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

Классы-оболочки (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

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