Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Haulmont-презентации Java / Haulmont. java_se_8.ppt
Скачиваний:
42
Добавлен:
16.03.2015
Размер:
1.04 Mб
Скачать

Ряд особенностей

41Настраиваемый класс не может расширять

класс Throwable (нельзя создавать настраиваемые классы исключений)

От настраиваемых типов можно наследовать, есть ряд особенностей

Нельзя создать экземпляр массива, у которого базовый тип задан с помощью параметра типа

Пример 11

class Generic<T> { T[] vals; // Верно Generic(T[] nums) {

//vals = new T[10]; //Неверно vals = nums; // Верно

} }

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Ряд особенностей

42Нельзя создать массив из ссылок на объекты

конкретной версии настраиваемого типа

Generic<Integer>[] gens = new Generic<Integer>[10]; //Неверно

Generic<?>[] gens = new Generic<?>[10]; // Верно

И как же это работает?

Механизм стирания:

В реальном байт-коде никаких настраиваемых типов в целом-то и нет…

Вся информация о настраиваемых типах удаляется на стадии компиляции

Именно компилятор осуществляет контроль безопасности приведения типов

А внутри после компиляции все те же «обобщенные» классы, явные приведения типов и т.д.

Возможны ошибки неоднозначности

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Ошибки неоднозначности

43

Пример 12

 

 

class MyGenClass<T, V> {

 

T ob1;

 

V ob2;

 

// Неверно

 

void set(T o) {

 

ob1 = o;

 

}

 

void set(V o) {

 

ob2 = o;

 

}

 

}

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Улучшенный цикл for(For-each)

44 Имеется:

int[] nums = {1, 2, 3, 4, 5}; int sum = 0;

for (int i = 0; i < 5; i++) sum += nums[i];

Хотелось бы:

int[] nums = {1, 2, 3, 4, 5}; int sum = 0;

for (int x: nums) sum += x;

Общая форма записи:

for (type iterVar : iterableObj) statement

Где type – тип элемента, iterVar – переменная цикла, iterableObj – объект с элементами, statement – тело цикла

Все права защищены. www.haulmont.ru info@haulmont.com © HAULMONT, 2013

Работа улучшенного цикла for

45• В каждом витке цикла «извлекается» очередной элемент агрегата

Ссылка на него (для ссылочных типов) или значение (для примитивных) помещается в переменную цикла

Тип переменной цикла должен допускать присвоение элементов агрегата

Цикл выполняется до тех пор, пока не будут перебраны все элементы агрегата

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Обработка многомерных

массивов

46 Пример 13

int sum = 0;

int nums[][] = new int[3][5]; for (int i = 0; i < 3; i++)

for (int j = 0; j < 5; j++) nums[i][j] = (i + 1) * (j + 1);

for (int[] x: nums) for (int y: x)

sum += y;

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

 

 

Особенности улучшенного

47

 

 

цикла for

 

По сути это внутренний итератор

 

Переменная цикла доступна только для чтения

 

Порядок обхода в целом не определен

 

Нет доступа к соседним элементам

 

Агрегат обязан реализовывать интерфейс

 

 

java.lang.Iterable<T>

 

Этот интерфейс содержит лишь один элемент

 

 

Iterator<T> iterator()

 

Данный, вроде бы знакомый, интерфейс, тоже

 

 

претерпел некоторые изменения:

 

 

 

boolean hasNext()

 

 

 

void remove()

 

 

 

T next()

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Вывод

48• Область применения обобщенного цикла for «несколько уже», чем у «необобщенной»

версии

• Зато для этого класса задач (поиск среднего арифметического, поиск минимального или максимального значения в наборе, поиск дублирующих значений и т. д.) синтаксис обобщенного цикла существенно удобнее

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

 

 

Перечислимые типы

49

В простейшей форме перечислимый тип это список

 

 

 

именованных констант

 

Перечислимый тип создается с помощью нового ключевого

 

 

слова enum

 

Имеется:

 

 

class Apple {

 

 

public static final int JONATHAN = 0;

 

 

public static final int GOLDENDEL = 1;

 

 

public static final int REDDEL = 2;

 

 

public static final int WINESAP = 3;

 

 

public static final int CORTLAND = 4;

 

 

}

 

Хотелось бы:

enum Apple {

Jonathan, GoldenDel, RedDel, Winesap, Cortland

}

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

 

 

Перечислимые типы

50

Перечислимый тип Apple. Идентификаторы Jonathan,

 

 

 

GoldenDel и так далее называются константами

 

 

перечислимого типа

 

Каждая объявляется неявно общедоступным,

 

 

статическим членом класса Apple

 

После того как вы описали перечислимый тип, можете

 

 

создать переменную этого типа

 

Но, несмотря на то что перечислимые типы определены

 

 

как классы, вы не можете создать экземпляр типа enum

 

 

с помощью операции new

 

Вместо этого вы объявляете и используете переменную

 

 

перечислимого типа почти так же, как вы поступаете с

 

 

переменными одного из базовых типов, таких как int или

 

 

char

Apple ap;

ap = Apple.RedDel;

Все права защищены. www.haulmont.ru info@haulmont.com

© HAULMONT, 2013

Соседние файлы в папке Haulmont-презентации Java