Скачать презентацию Основы программирования на языке Java Пакет java lang Скачать презентацию Основы программирования на языке Java Пакет java lang

OOP-Java.Generics.ppt

  • Количество слайдов: 31

Основы программирования на языке Java Пакет java. lang, синтаксический «сахар» , родовые компоненты (generics) Основы программирования на языке Java Пакет java. lang, синтаксический «сахар» , родовые компоненты (generics) Java (С) Всеволод Рылов, все права защищены Новосибирск, 2004 1

Пакет java. lang – поддержка языка и платформы Новосибирск, 2004 (С) Всеволод Рылов, все Пакет java. lang – поддержка языка и платформы Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 2

Классы поддержки основных механизмов Object Базовый класс для всех классов. Cloneable Маркерный интерфейс для Классы поддержки основных механизмов Object Базовый класс для всех классов. Cloneable Маркерный интерфейс для классов, реализующих метод public Object clone() System Класс-утилита для взаимодействия с системой Runtime Класс для взаимодействия со средой исполнения Class Класс, объекты которого хранят служебную информацию о классах во время исполнения Package Класс, объекты которого хранят информацию о пакетах во время исполнения Class. Loader Базовый класс для загрузчиков классов в системе Thread Базовый класс потока Runnable Интерфейс используемый классом потока для запуска параллельных действий Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 3

Классы поддержки системы типов String Класс для работы со строками String. Buffer Символьный буфер, Классы поддержки системы типов String Класс для работы со строками String. Buffer Символьный буфер, используемый для оптимизации работы со строками Character Объектная обертка для символьного типа Boolean Объектная обертка для логического типа Void Объектная обертка для типа void Comparable Интерфейс, реализуемый классами для объектов которых определено отношение порядка Number Базовый класс для классов – оберток числовых типов Byte, Short, Классы – обертки для числовых типов Integer, Long, Float, Double Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 4

Класс java. lang. System (основные методы) err, in, out Статические переменные содержащие ссылки на Класс java. lang. System (основные методы) err, in, out Статические переменные содержащие ссылки на стандартные потоки ввода, вывода и ошибок arraycopy() Метод для быстрого копирования содержимого массивов get. Properties(), get. Property(), set. Properties(), set. Property() Набор методов для работы со стандартными свойствами (настройками) java машины current. Time. Millis() Взятие текущего времени в миллисекундах с момента 00 часов 1 января 1970 года exit() Прекращение работы виртуальной машины и завершение процесса gc() Принудительный вызов сборщика мусора load(), load. Library(), map. Library. Name() Методы для манипуляции с загружаемыми native библиотеками (dll , ld. so ) Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 5

Класс java. lang. Runtime (основные методы) get. Runtime() Статический метод для получения объекта Runtime Класс java. lang. Runtime (основные методы) get. Runtime() Статический метод для получения объекта Runtime Process exec() Семейство вызовов для запуска отдельного процесса (программы) в операционной системе exit(int status), halt() Shutdown и остановка java машины free. Memory() total. Memory() Методы для получения информации о доступной памяти load. Library(), load() Загрузка динамических native библиотек add. Shutdown. Hook(), Установка и удаления перехватчиков, remove. Shutdown. Hook() вызываемых при остановке виртуальной машины gc(), run. Finalization() Новосибирск, 2004 Запуск сборщика мусора и финализатора (С) Всеволод Рылов, все права защищены 6

java. lang. Class (основные методы) static Class<? > for. Name(String name) Используется для динамической java. lang. Class (основные методы) static Class for. Name(String name) Используется для динамической загрузки класса по имени в виртуальную машину Object new. Instance() Создает новый объект данного класса. Необходимо чтобы класс определял конструктор по умолчанию. Class. Loader get. Class. Loader() Получение загрузчика с помощью которого был загружен данных класс get. Super. Class(), get. Interfaces(), get. Package() Получение информации о суперклассе, реализуемых интерфейсах и пакете get. Resource(), get. Resource. As. Stream() Загрузка ресурсов (файлов настроек, картинок и т. д. ) расположенных на файловой системе или в архиве jar Дополнительно имеется множество методов для работы с полями, агрегатами и методами определенными в классе Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 7

Классы-обертки для основных типов q q Используются тогда, когда нужно работать с значениями примитивных Классы-обертки для основных типов q q Используются тогда, когда нужно работать с значениями примитивных типов как с объектами Используются для получения разнообразной информации о диапазонах значений и специальных значениях данного типа Используются для преобразования типов между собой, между различными системами счисления, в строковый формат и наоборот из строкового формата (наследники класса java. lang. Number) Объекты классов оберток, ровно как и объекты класса String не могут быть изменены после создания. При операциях с ними могут создаваться новые объекты Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 8

Пример класса обертки – java. lang. Integer MAX_VALUE, MIN_VALUE, TYPE Статические поля, содержащие информацию Пример класса обертки – java. lang. Integer MAX_VALUE, MIN_VALUE, TYPE Статические поля, содержащие информацию о диапазоне и ссылку на объект типа Class Integer(int value), Integer(String s) Конструкторы для создания нового объекта compare. To(…) Используется для сравнения с другими объектами данного типа int parse. Int(…) Integer value. Of(…) Используются для разбора числа заданного в строковом формате. Выбрасывают java. lang. Number. Format. Exception double. Value(), Методы для преобразования числовых типов short. Value(), long. Value(), double. Value(), float. Vlaue() to. Binary. String(), to. Hex. String(), to. Octal. String() Новосибирск, 2004 Формируют строковое представление числа в различных системах счисления (С) Всеволод Рылов, все права защищены 9

Автоматическая обертка boxing/unboxing q С целью поддержки наглядности компилятор может осуществлять автоматическое преобразование примитивных Автоматическая обертка boxing/unboxing q С целью поддержки наглядности компилятор может осуществлять автоматическое преобразование примитивных типов в объектные и наоборот: Integer i = 5; // Integer i = new Integer(5); Integer array[] = new Integer[] { new Integer(1), new Integer(2), new Integer(3) }; // можно заменить : Integer array [] = { 1, 2, 3}; q Необходимо соблюдать осторожность при обратных преобразованиях во избежание Null. Pointer. Exception class Foo { static Integer do. Something() { … } } … int i = Foo. do. Something(); // вероятен Null. Pointer. Exception Integer the. I = Foo. do. Something(); int i = (the. I != null) ? the. I, 0; Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 10

Оптимизация цикла for для массивов class Foo { public static void main(String args[] ) Оптимизация цикла for для массивов class Foo { public static void main(String args[] ) { for (String s : args ) { System. out. println(s); } } } // Эквивалентно … for (int i = 0; i < args. length; i++) { System. out. println( args[i] ) ; } Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 11

Переменное количество аргументов q При необходимости можно оптимизировать передачу массива однотипных значений с помощью Переменное количество аргументов q При необходимости можно оптимизировать передачу массива однотипных значений с помощью синтаксиса с переменным количеством аргументов class Bar { public static void some. Function( String s, int … array) { int sum = 0; for (int i : array ) { sum += i; } } } … Bar. some. Function(“one”, 1, 2, 3, 4, 5); // аргументы одного типа // эквивалентно static void some. Function(String s, int[ ] array) {…} Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 12

Математические средства платформы java q q java. lang. Strict. Math – класс-утилита, содержащий основные Математические средства платформы java q q java. lang. Strict. Math – класс-утилита, содержащий основные математические функции. Гарантирует точную повторяемость числовых результатов вплоть до бита java. lang. Math – класс-утилита, работающая быстрее чем Strict. Math (на старых версиях машины) но не гарантирующая точное воспроизводство числовых результатов для иррациональных чисел. В версии 1. 6 java. lang. Math делегирует вызовы Strict. Math java. math. Big. Decimal, java. math. Big. Integer – классы для работы с числами произвольного размера и точности Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 13

Родовые компоненты – обобщения (generics) q q q Позволяют объявлять классы, интерфейсы и методы, Родовые компоненты – обобщения (generics) q q q Позволяют объявлять классы, интерфейсы и методы, где тип данных и ограничения на него, которыми они оперируют указан в виде параметра Позволяют реализовать код, который будет работать единообразно с разными типами данных В отличие от использования ссылок на тип Object предоставляют безопасные с точки зрения типизации средства обобщенного программирования Спецификация параметра задается явно (классы, интерфейсы и ссылки) или выводится на основании аргументов (вызов методов) Соответствие типа проверяется на стадии компиляции Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 14

Простейший пример q До java 1. 5: q public class Envelope { private Object Простейший пример q До java 1. 5: q public class Envelope { private Object ref; public Envelope (Object arg) { ref = arg; } public Object get() { return ref; } } … Envelope e = new Envelope(new My. Class()); … My. Class m = (My. Class) e. get(); //OK // Class. Cast. Exception in runtime: Another a = (Another) e. get(); q Необходимо знать и учитывать объект какого типа был сохранен Новосибирск, 2004 Начиная с 1. 5: public class Envelope { private T ref; public Envelope (T arg) { ref = arg; } public T get() { return ref; } } … Envelope e = new Envelope(new My. Class()); … My. Class m = e. get(); //compile time error: Another a = e. get(); q Проверка типа осуществляется на стадии компиляции (С) Всеволод Рылов, все права защищены 15

Грамматика родового класса Class. Declaration: Normal. Class. Declaration Enum. Declaration Normal. Class. Declaration: Class. Грамматика родового класса Class. Declaration: Normal. Class. Declaration Enum. Declaration Normal. Class. Declaration: Class. Modifiersopt class Identifier Type. Parametersopt Superopt Interfacesopt Class. Body Type. Parameters : < Type. Parameter. List > Type. Parameter. List : Type. Parameter. List , Type. Parameter | Type. Parameter: Type. Bound: Type. Variable Type. Boundopt extends Class. Or. Interface. Type Additional. Bound. Listopt Additional. Bound. List: Additional. Bound. List Additional. Bound: & Interface. Type Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 16

Грамматика родового интерфейса и метода Interface. Declaration: Normal. Interface. Declaration Annotation. Type. Declaration Normal. Грамматика родового интерфейса и метода Interface. Declaration: Normal. Interface. Declaration Annotation. Type. Declaration Normal. Interface. Declaration: Interface. Modifiersopt interface Identifier Type. Parametersopt Extends. Interfacesopt Interface. Body Method. Declaration: Method. Header Method. Body Method. Header: Method. Modifiersopt Type. Parametersopt Result. Type Method. Declarator Throwsopt Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 17

Основные отличия от C++ q q q При объявлении специфической ссылки имеющей типом родовой Основные отличия от C++ q q q При объявлении специфической ссылки имеющей типом родовой класс или интерфейс не происходит генерация кода класса (интерфейса) Все объекты – специфические экземпляры родового класса разделяют один и тот же обобщенный тип Параметрами родового компонента могут быть только типы На параметры родового компонента можно наложить ограничения по наследованию определенного типа и/или интерфейса (интерфейсов) Исключения и перечисления не могут быть родовыми типами В качестве значений параметров при спецификации не могут использоваться примитивные типы java Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 18

Использование параметров - типов q В теле родового компонента можно использовать параметр типа для Использование параметров - типов q В теле родового компонента можно использовать параметр типа для объявления ссылок и спецификации значений аргументов других параметризуемых типов class My. Generic { private T t; private Another. Generic< T > at = new Another. Generic(); } q Нельзя инстанцировать объект или массив имеющий типом – параметр: class Some. Generic { T t = new T(); //compile time error T array = new T[10]; //compile time error } q Параметр типа недоступен в статическом контексте class Has. Static { static T t; //compile time error } Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 19

Ограниченные типы class Stats <T extends Number> { private T [ ] nums; public Ограниченные типы class Stats { private T [ ] nums; public Stats ( T [] array ) { nums = array; } public double average ( ) { double sum = 0. 0; for (T n : nums ) { //все типы наследники Number реализуют метод double. Value() sum += n. double. Value(); } return sum / nums. length(); } } Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 20

 «Шаблоны» параметров - wildcards q Допустим мы хотим сравнивать средние значения объектов Stats<T>: «Шаблоны» параметров - wildcards q Допустим мы хотим сравнивать средние значения объектов Stats: class Stats { private T [ ] nums; public Stats ( T [] array ) { nums = array; } public double average ( ) { … } public boolean same. Avg ( Stats another) { return average() == another. average(); } } //Проблема – нельзя сравнить среднее разных спецификаций: Integer int. Array[] = { 1, 2, 4, 7 }; Double double. Array [] = { 6. 0, 7. 8, 22. 0 }; Stats int. Stats = new Stats (int. Array); int. Stats. same. Avg (new Stats(double. Array) ); //Compile time error Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 21

Решение – использование «? » class Stats <T extends Number> { private T [ Решение – использование «? » class Stats { private T [ ] nums; public Stats ( T [] array ) { nums = array; } public double average ( ) { … } public boolean same. Avg ( Stats another) { return average() == another. average(); } } ? можно использовать для спецификации обобщенных ссылок и generic-type массивов Stats any. Stats = new Stats ( ); Stats array[] = new Stats [10]; q ? следует применять при проверках instanceof Stats i. Stats = new Stats ( new Integer[]{ 1, 2, 3, 4} ); i. Stats instanceof Stats // true q Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 22

Ограниченные wildcards abstract class Shape { public abstract void draw(Canvas c); } public class Ограниченные wildcards abstract class Shape { public abstract void draw(Canvas c); } public class Ellipse extends Shape { … } public class Polygon extends Shape { … } … public static void draw. All (List shapes. List, Canvas c ) { for (Shape s : shapes. List) s. draw ( c ); } // При этом следующий код не работает: public void add. Polygon(List shapes ) { shapes. add(new Polygon(…)); //compile time error } q - при спецификации может использоваться любой наследник включая сам класс Bar q - может использоваться только суперкласс Foo Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 23

Родовые методы class Bar { public static <T> void from. Array. To. Collection (T[] Родовые методы class Bar { public static void from. Array. To. Collection (T[] a, Collection c) { for (T v: a) c. add(v); } } … Integer[] ia = new Integer[100]; Collection ic = new Array. List(); Bar. from. Array. To. Collection (ia, ic); //спецификация на основе аргументов //Можно использовать совместно с wildcards: public class Collections { public static void copy(List dest, List src) { … } } Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 24

Что лучше использовать? interface Collection <E> { public boolean contains. All (Collection <? > Что лучше использовать? interface Collection { public boolean contains. All (Collection c); public boolean add. All (Collection c); } //или interface Collection { public boolean contains. All(Collection c); public boolean add. All(Collection c); } q Замечания по именованию q Обычно используется параметр T q Если параметров несколько – то буквы близкие по алфавиту, например T совместно с S q Если родовой метод (класс) вложен в другой родовой компонент, то лучше использовать отличную от параметра этого компонента букву Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 25

Raw типы и совместимость q Для совместимости с ранним кодом можно использовать родовые компоненты Raw типы и совместимость q Для совместимости с ранним кодом можно использовать родовые компоненты без спецификации параметров List raw. List = new Linked. List(); Integer i = 5; // помним о boxing raw. List. add( i ); // реально raw. List. add( (Object) i); … Integer v = (Integer) raw. List. get(0); List n. List = new Array. List(); … raw. List = n. List; // безопасно, но теряем защиту по типу … List i. List = (List

Родовые компоненты и наследование q q q Родовые классы (интерфейсы) могут наследоваться от обычных Родовые компоненты и наследование q q q Родовые классы (интерфейсы) могут наследоваться от обычных классов (интерфейсов) и наоборот Возможно приведение ссылки дочернего родового класса (интерфейса) на базовый только в том случае, если совпадают значения аргументов – типов заданные при спецификации Если классы A и B связаны наследованием (A extends B), то это не значит, что специфицированные ссылки параметризованных типов которым переданы эти классы в качестве параметров-типов совместимы между собой ! // параметры совпадают, класс Linked. List реализует интерфейс List List string. List = new Linked. List (); //OK // значения параметров у ссылок не совпадают, присваивание невозможно: List object. List = string. List; //compile time error Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 27

Реализация обобщенных интерфейсов interface Min. Max <T extends Comparable<T>> { T min(); T max(); Реализация обобщенных интерфейсов interface Min. Max > { T min(); T max(); } //Класс реализующий родовой интерфейс должен быть родовым class Min. Max. Array > implements Min. Max { T [ ] vals; Min. Max. Array (T arg[ ] ) { vals = arg; } public T min () { … } public T max () { … } } … Character chrs [ ] = { ‘c’, ‘f’ , ‘k’, ‘a’ }; // boxing Character max. Char = (new Min. Max. Array (chrs)). max(); //Однако можно наследовать специфицированный интерфейс class Min. Max. Integer. Array extends Min. Max { … } Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 28

Перегрузка и наследование public class Base <T> { private T val; public Base(T v) Перегрузка и наследование public class Base { private T val; public Base(T v) { val = v; } public T get. Val() { return val; } } public class Derived extends Base { private S another; public Derived (T v, S s) { super(v); another = s; } public T get. Val () { … } //Перегруженный метод } //Допустимо: Base b = new Derived (5, “Hello!”); Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 29

 «Очистка параметров» при компиляции Из соображений совместимости вся информация о параметрах – типах «Очистка параметров» при компиляции Из соображений совместимости вся информация о параметрах – типах при компиляции удаляется q При этом происходит замена параметров типа на реально их ограничивающий класс q class Bar {…} - T заменяется на Number q class Foo {…} - T заменяется на Object class Gen. Str { T str; Gen. Str ( T val) { str = val; } T get. Str () {return str; } } // откомпилируется как будто был написан так: class Gen. Str extends Object { java. lang. String str; Gen. Str (java. lang. String val) {str = val; } java. lang. String get. Str() { return str; } } q Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 30

Дополнительные проблемы q Методы – мосты (генерируются компилятором) class Base <T> { public T Дополнительные проблемы q Методы – мосты (генерируются компилятором) class Base { public T f () { … } // откомпилируется в Object f() {…} } class Derived extends Base { public String f() { return super. f(); } // нужен мост } q Потенциальная неоднозначность class Foo { T t; S s; void set (T targ) { t = targ; } // компилируется в set(Object o) {…} void set (S sarg) { s = sarg; } // компилируется в set(Object o) {…} } Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 31