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

Презентация:



Advertisements
Похожие презентации
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Advertisements

Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются.
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
Java. Part 2. Спецификаторы доступа public private protected не указан – доступ в пределах пакета Могут использоваться перед классами, методами, полями.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Типы данных Инна Исаева. Переменные Переменная - это как ящик, в котором можно хранить данные. Каждая переменная имеет своё имя, она служит для хранения.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
1 Методы Java Методы класса – это подпрограммы, присоединенные к конкретным определениям классов. Они описываются внутри определения класса на том же уровне,
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Лекция 2 Наследование Наследование в Java имеет тот же смысл, что и в С++. Однако наследование в Java осуществляется при помощи ключевого слова extends.
Лекция 7 Классы - оболочки Каждому простому типу в Java соответствует класс-оболочка. Классы-оболочки выполняют две основные функции. Первая состоит в.
Строки и классы-оболочки. Класс String. Конструкторы String s = new String(); char chars[] = { 'а', 'b', 'с' }; String s = new String(chars); char chars[]
Операции Условная операция ? : Если истинно, то результатом будет, иначе. Например, int x = a < b ? a : b вычисляет минимум из a и b.
Изучение динамического определения типов. Класс Class. Динамическая загрузка и инстанцирование классов. В Java вся информация о классе хранится в специальном.
Транксрипт:

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

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

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

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

Новосибирск, 2004(С) Всеволод Рылов, все права защищены 5 Класс java.lang.System (основные методы) Методы для манипуляции с загружаемыми native библиотеками (dll, ld.so ) load(), loadLibrary(), mapLibraryName() Принудительный вызов сборщика мусораgc() Прекращение работы виртуальной машины и завершение процесса exit() Взятие текущего времени в миллисекундах с момента 00 часов 1 января 1970 года currentTimeMillis() Набор методов для работы со стандартными свойствами (настройками) java машины getProperties(), getProperty(), setProperties(), setProperty() Метод для быстрого копирования содержимого массивов arraycopy() Статические переменные содержащие ссылки на стандартные потоки ввода, вывода и ошибок err, in, out

Новосибирск, 2004(С) Всеволод Рылов, все права защищены 6 Класс java.lang.Runtime (основные методы) Запуск сборщика мусора и финализатораgc(), runFinalization() Установка и удаления перехватчиков, вызываемых при остановке виртуальной машины addShutdownHook(), removeShutdownHook() Загрузка динамических native библиотекloadLibrary(), load() Методы для получения информации о доступной памяти freeMemory() totalMemory() Shutdown и остановка java машиныexit(int status), halt() Семейство вызовов для запуска отдельного процесса (программы) в операционной системе Process exec() Статический метод для получения объекта Runtime getRuntime()

Новосибирск, 2004(С) Всеволод Рылов, все права защищены 7 java.lang.Class (основные методы) Загрузка ресурсов (файлов настроек, картинок и т.д.) расположенных на файловой системе или в архиве jar getResource(), getResourceAsStream() Получение информации о суперклассе, реализуемых интерфейсах и пакете getSuperClass(), getInterfaces(), getPackage() Получение загрузчика с помощью которого был загружен данных класс ClassLoader getClassLoader() Создает новый объект данного класса. Необходимо чтобы класс определял конструктор по умолчанию. Object newInstance() Используется для динамической загрузки класса по имени в виртуальную машину static Class forName(String name) Дополнительно имеется множество методов для работы с полями, агрегатами и методами определенными в классе

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

Новосибирск, 2004(С) Всеволод Рылов, все права защищены 9 Пример класса обертки – java.lang.Integer Формируют строковое представление числа в различных системах счисления toBinaryString(), toHexString(), toOctalString() Методы для преобразования числовых типовdoubleValue(), shortValue(), longValue(), doubleValue(), floatVlaue() Используются для разбора числа заданного в строковом формате. Выбрасывают java.lang.NumberFormatException int parseInt(…) Integer valueOf(…) Используется для сравнения с другими объектами данного типа compareTo(…) Конструкторы для создания нового объектаInteger(int value), Integer(String s) Статические поля, содержащие информацию о диапазоне и ссылку на объект типа Class MAX_VALUE, MIN_VALUE, TYPE

Автоматическая обертка boxing/unboxing С целью поддержки наглядности компилятор может осуществлять автоматическое преобразование примитивных типов в объектные и наоборот: 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}; Необходимо соблюдать осторожность при обратных преобразованиях во избежание NullPointerException class Foo { static Integer doSomething() { … } } … int i = Foo.doSomething(); // вероятен NullPointerException Integer theI = Foo.doSomething(); int i = (theI != null) ? theI, 0; Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 10

Оптимизация цикла 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

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

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

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

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

Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 16 Грамматика родового класса ClassDeclaration: NormalClassDeclaration EnumDeclaration NormalClassDeclaration: ClassModifiers opt class Identifier TypeParameters opt Super opt Interfaces opt ClassBody TypeParameters : TypeParameterList : TypeParameterList, TypeParameter | TypeParameter TypeParameter: TypeVariable TypeBound opt TypeBound: extends ClassOrInterfaceType AdditionalBoundList opt AdditionalBoundList: AdditionalBound AdditionalBoundList AdditionalBound AdditionalBound: & InterfaceType

Грамматика родового интерфейса и метода InterfaceDeclaration: NormalInterfaceDeclaration AnnotationTypeDeclaration NormalInterfaceDeclaration: InterfaceModifiers opt interface Identifier TypeParameters opt ExtendsInterfaces opt InterfaceBody MethodDeclaration: MethodHeader MethodBody MethodHeader: MethodModifiers opt TypeParameters opt ResultType MethodDeclarator Throws opt Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 17

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

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

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

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

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

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

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

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

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

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

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

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

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

Дополнительные проблемы Методы – мосты (генерируются компилятором) class Base { public T f () { … } // откомпилируется в Object f() {…} } class Derived extends Base { public String f() { return super.f(); } // нужен мост } Потенциальная неоднозначность 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