Презентация_1_Типы_данных_операторы.ppt
- Количество слайдов: 59
1. ВВЕДЕНИЕ В Программирование ЯЗЫК JAVA на языке Java 1
ВОПРОСЫ Обзор платформы и языка Java n Структура Java-программы n Типы данных n Управляющие структуры n Массивы n 2
ЯЗЫК JAVA n n n Язык Java разработан корпорацией Sun Microsystems в начале 1990 -х г. г. Java 1. 0 – 23 мая 1995 г. Первым применением Java были апплеты - переносимые Internet-приложения, которые загружались вместе с Webстраницами и исполнялись браузером В настоящее время Java является одним из наиболее распространенных объектно-ориентированных языков, используемым для разработки программных систем коммерческого качества с высоким уровнем безопасности, надежности и управляемости. Основная область применения — Internet-приложения, кросс-платформенные приложения, а также приложения для мобильных устройств. 3
ПЛАТФОРМА JAVA n n n Программы на языке Java предназначены для выполнения на специальной программной платформе. Приложения Java компилируются в файлы, содержащие байт-коды — инструкции виртуальной машины. Основные преимущества платформы Java: ¨ ¨ ¨ n Поддержка ООП Кросс-платформенность Поддержка многопоточности Улучшенный контроль надежности и безопасности Малый размер исполняемых файлов Недостатки: ¨ ¨ Снижение производительности Повышенные требования к памяти 4
JDK/JRE n n Для выполнения приложений Java требуется специальная программная инфраструктура – JRE (Java Runtime Environment) JRE включает реализацию виртуальной машины, а также байт-код стандартных классов Java API Разработка Java-приложений, помимо JRE, требует наличия программной системы JDK (Java Development Kit) В частности, JDK включает компилятор Java, а также исходные тексты и документацию к 5 стандартным классам Java API
НАПРАВЛЕНИЯ JAVAТЕХНОЛОГИЙ n Начиная с версии 1. 2, платформа Java разделилась на 3 основных направления Java 2 Platform Micro Edition (J 2 ME) — платформа, ориентированная на мобильные устройства. ¨ Java 2 Standard Edition (J 2 SE) — основная платформа для разработки приложений общего назначения и выполнения их на настольных компьютерах. Прикладные компоненты J 2 SE включают средства построения графического интерфейса приложений, мультимедиа-технологии, сетевые коммуникации, разработку распределенных приложений, работу с базами данных. ¨ Java 2 Enterprise Edition (J 2 EE) – расширение J 2 SE, ориентированное на разработку Web-приложений, 6 многозвенных и распределенных систем. ¨
СРЕДСТВА РАЗРАБОТКИ n Для повышения эффективности разработки ПО на платформе Java используются специализированные инструментальные средства, работающие поверх JDK ¨ Jet. Brains Intelli. J IDEA ¨ Eclipse ¨ Sun/Oracle Net. Beans ¨ Embarcadero JBuilder 7
СТРУКТУРА JAVA-ПРОГРАММЫ n n В языке Java программа представляет собой набор взаимодействующих классов, каждый из которых реализует определенную часть функциональности. Файл с исходным текстом должен иметь расширение. java Имя исходного файла должно соответствовать имени public-класса Класс, отвечающий за запуск программы на выполнение, должен содержать точку входа – метод main public class My. Class { public static void main(String[] args) { System. out. println("Hello"); } } 8
ИДЕНТИФИКАТОРЫ n n n Идентификаторы – это имена, которыми обозначаются элементы программы, например, типы и переменные. Идентификатор может включать в себя «цифры Java» и «буквы Java» , причем первым символом обязательно должна быть «буква» . В число «букв» , в частности, входят большие и маленькие латинские буквы, символ подчеркивания «_» , а также буквы национальных алфавитов и некоторые специальные символы, например, знаки денежных единиц. В языке Java учитывается регистр символов Символ $ допустим, но не рекомендуется к использованию, так как может использоваться для генерации внутренних имен компилятором 9
КОММЕНТАРИИ n n n Как и многие другие языки программирования, Java позволяет документировать программу с помощью комментариев. В языке Java существует 3 типа комментариев: ¨ Строчные комментарии начинаются с пары символов // и продолжаются до конца строки ¨ Блочные комментарии ограничиваются символами /* и */ ¨ Комментарии Java. Doc ограничиваются символами /** и */ Комментарии Java. Doc используются для автоматического построения API-документации по исходному тексту класса 10
ТИПЫ ДАННЫХ В JAVA 11
ПЕРЕМЕННЫЕ n Описание переменной имеет вид Тип n n n имя. Переменной; Описание переменной может располагаться в произвольном месте блока {}. При этом переменная должна быть описана до первого использования. Имя переменной не должно совпадать с одним из ключевых слов языка Можно объявить несколько переменных одним оператором, если после имени типа указать список имен переменных, разделяя их запятыми int n, m; int number. Of. Elements; double x, y, x. Start, y. Start, x. End, y. End; boolean is. Found; 12
ПЕРЕМЕННЫЕ n. При описании переменной можно указать для нее начальное значение после знака = double x 1 = 1, y 1 = 2; double x 2 = -2, y 2 = 3; double dx = x 2 – x 1, dy = y 2 – y 1; double distance = Math. sqrt(dx*dx + dy*dy); n. Локальные переменные не инициализируется автоматически, поэтому перед использованием они должны получать явное значение. n. Использование неинициализированной переменной в выражении приводит к ошибке на этапе компиляции. 13
ПЕРЕМЕННЫЕ n Перед типом переменной может находиться специальный модификатор final. Такая переменная должна быть обязательно инициализирована при объявлении, после чего ее значение изменять уже нельзя. final int ONE = 1; final double PI = 3. 14159265359; final double HALF_OF_PI = PI/2; 14
ПРИСВАИВАНИЕ Операции присваивания используются для сохранения результатов вычислений в переменных программы. Основная операция присваивания имеет следующий синтаксис: Переменная = Выражение n n n Тип выражения должен быть совместим с типом переменной (правила совместимости определяются в спецификации языка). В сложных выражениях byte, short, char автоматически повышаются до int либо типа с более широким набором значений (long, float, double) 15
ЦЕЛОЧИСЛЕННЫЕ ТИПЫ Все целочисленные типы, за исключением char, являются знаковыми Основными целочисленными типами являются int и long. В выражениях значения других целых типов автоматически повышаются до int, либо long (если хотя бы один операнд имеет тип long) Экземпляры типа char хранят код символа в таблице Unicode в виде неотрицательного числа Переменные типа char можно инициализировать символьными или целочисленными значениями. char c 1 = ' '; // пробел char c 2 = 32; // пробел (код 32) 16
ЦЕЛОЧИСЛЕННЫЕ ТИПЫ Тип Разрядность, бит Диапазон значений byte 8 [– 128, 127] short 16 [– 32768, 32767] char 16 [0, 65535] int 32 [– 231, 231 – 1] long 64 [– 263, 263 – 1] 17
ЦЕЛОЧИСЛЕННЫЕ ТИПЫ n n Над значениями целых типов можно выполнять стандартные арифметические операции + , –, *, / (целочисленное деление), % (остаток от деления). Деление на 0 (в операциях / и %) приводит к исключительной ситуации Arithmetic. Exception int a = 3, b = -3, c = 5; System. out. println(a + b); // System. out. println(a - b); // System. out. println(a*c); // System. out. println(b/c); // System. out. println(c/b); // System. out. println(c%a); // System. out. println(b%c); // 0 6 15 0 -1 2 0 -3 18
ВЕЩЕСТВЕННЫЕ ТИПЫ n n В языке Java существуют 2 вещественных типа: float (32 бита) и double (64 бита), соответствующих стандарту IEEE Основным вещественным типом является double. К типу double автоматически преобразуются результаты арифметических операций над вещественными числами Над значениями вещественных типов можно выполнять стандартные арифметические операции + , –, *, / (целочисленное деление), % (остаток от деления). Целочисленные значения автоматически преобразуются в вещественные, если в выражении есть хотя бы одно вещественное значение 19
ВЕЩЕСТВЕННЫЕ ТИПЫ n. К вещественным значениям, в частности, относятся константы ¨ Double. POSITIVE_INFINITY (Положительная бесконечность, возникающая при переполнении положительного значения, например, в результате операции умножения 3. 0*6 е 307 ) ¨ Double. NEGATIVE_INFINITY (Отрицательная бесконечность ) ¨ Double. NAN ( «Не число» , записываемое константой Na. N (Not a Number) и возникающее при делении вещественного числа на нуль или умножении нуля на бесконечность ) 20
ВЕЩЕСТВЕННЫЕ ТИПЫ n При использовании вещественных значений следует иметь в виду, что вычисления с ними выполняются с ограниченной точностью и не всегда воспроизводимы. 21
МАТЕМАТИЧЕСКИЕ ФУНКЦИИ Вещественные операции обеспечивают выполнение основных арифметических действий над числами. Для реализации более сложных вычислений используется класс Math. n В классе Math определены константы Math. PI и Math. E типа double, которые соответствуют математическим постоянным π и e. double r = 1. 5; double S = Math. PI*r*r; n 22
МАТЕМАТИЧЕСКИЕ ФУНКЦИИ n Основные функции, определенные в классе Math: ¨ double sin(double a) ¨ double cos(double a) ¨ double tan(double a) ¨ double asin(double a) ¨ double acos(double a) ¨ double atan(double a) ¨ double exp(double a) ¨ double log(double a) ¨ double sqrt(double a) ¨ double ¨. . . pow(double a, double b) 23
СОСТАВНОЕ ПРИСВАИВАНИЕ n Кроме операции простого присваивания, в языке Java имеются особые операции составного присваивания, объединяющие функции присваивания и другой операции: += -= *= /= %= n Операция вида Переменная+= Выражение соответствует присваиванию Переменная = Переменная + Выражение int s = 1, r = 2; s += 2; r *= s + 1; 24
ИНКРЕМЕНТ/ДЕКРЕМЕНТ Операция ++ (инкремент) увеличивает значение числовой переменной на 1 int x = 1; x++; n Аналогичная операция декремента – – уменьшает значений переменной на 1 n Инкремент и декремент имеют две формы, которые отличаются результатом (побочный эффект при этом одинаковый): n ¨ ¨ префиксная (++x) – возвращается новое значение постфиксная (x++) – возвращается старое значение int x = 1, y = 2; System. out. println(x++ + y++); // 3 System. out. println(++x + y++); // 6 25
ЛОГИЧЕСКИЙ ТИП n n n Тип boolean используется для представления логических значений «истина» и «ложь» , представленных константами true и false. Cравнение двух значений на равенство/неравенство выполняется с помощью операций == и != соответственно. Эти операции применимы к значениям любых совместимых типов данных. Значения числовых типов упорядочены, поэтому для них определены отношения порядка < (меньше), > (больше), <= (меньше или равно), >= (больше или равно). 26
ЛОГИЧЕСКИЙ ТИП Над значениями логического типа можно выполнять операции сравнения == и !=, а также специальные операции !, &, &&, |, ||, ^. n Операция отрицания ! меняет возвращает значение, противоположное значению своего операнда: double x = -1. 0; boolean b = !(x > 0); n Операция «логическое И» & возвращает true, если оба ее операнда равны true, и false — в противном случае: double x = 2. 0; boolean b = (x > 1. 0) & (x < 3. 0); n Операция «логическое ИЛИ» | возвращает true, если хотя бы один ее операнд равен true, и false — в противном случае: double x = 2. 0; boolean b = (x > 1. 0) | (x < -1. 0); n Операция «исключающее ИЛИ» ^ возвращает true, если ровно один из ее операндов равен true, и false — в противном случае. n 27
ЛОГИЧЕСКИЙ ТИП n Операции && и || аналогичны & и |, но используют сокращенную схему вычислений: ¨ если первый операнд && равен false, то результатом будет false (второй операнд не вычисляется) ¨ если первый операнд || равен true, то результатом будет true (второй операнд не вычисляется) Особенность операций && и || позволяет записывать условия, для которых важен порядок вычисления операндов: x != 0 && y/x > x + y y == 0 || 1/y < 2 n 28
ЛОГИЧЕСКИЙ ТИП n Операция ? : используется для выбора одного из двух выражений в зависимости от некоторого условия Условие ? Выражение 1 : Выражение 2 ¨ Если условие истинно, то результатом является 1 -е выражение, в противном случае – 2 -е выражение z = x < y ? x : y; // минимум пары чисел y = x > 0 ? x : -x; // модуль числа 29
ПРЕОБРАЗОВАНИЕ ТИПОВ Компилятор Java автоматически выполняет расширяющие преобразования для числовых типов. Это позволяет присваивать переменной более "широкого" типа значение более "узкого" типа (например, int -> long). Необходимо учитывать, что некоторые расширяющие преобразования могут приводить к потере точности 30
ПРЕОБРАЗОВАНИЕ ТИПОВ n Переход от более "широкого" типа к более "узкому" при необходимости можно выполнить с помощью операции приведения типов (Тип)Выражение int a = 100, b = 100; byte c = (byte)(a + b); n Тип boolean нельзя привести к числовому типу (и обратно) 31
ПРОСТЫЕ ОПЕРАТОРЫ И БЛОКИ n n n К основным управляющим структурам в Java относятся блоки, условный оператор, операторы циклов и оператор выбора switch. Простые операторы образуются из выражений, имеющих побочные эффекты (инициализация переменных, присваивание, инкремент/декремент или обращение к функции) Блок – это последовательность операторов, заключенных в скобки { и }. Каждый оператор завершается символом ; или } (в случае блока) Блок может содержать объявления локальных переменных и вложенные блоки 32
ПРОСТЫЕ ОПЕРАТОРЫ И БЛОКИ public static void main(String[] args) { int n = 100; { int k = n + 100; System. out. println(k); } } Во внутреннем блоке нельзя определять переменную с именем, которое уже используется во внешнем блоке. 33
УСЛОВНЫЙ ОПЕРАТОР Оператор if позволяет реализовать в программном коде условные алгоритмы с выбором из двух вариантов. n Синтаксис (с учетом рекомендаций JCC) if (Выражение) { Операторы; } n if (Выражение) { Операторы1; } else { Операторы2; } 34
УСЛОВНЫЙ ОПЕРАТОР n Вложенные операторы if могут использоваться для реализации множественного выбора. int a = 2, b = 3; char op = ‘+’; if (c == ‘+’) System. out. println(a + b); else if (c == ‘-’) System. out. println(a - b); else if (c == ‘*’) System. out. println(a*b); else if (c == ‘/’) if (b == 0) System. out. println(“Деление на нуль”); else System. out. println(a/b); else System. out. println(“Неправильная операция”); 35
ОПЕРАТОРЫ ЦИКЛА n Оператор while реализует цикл с предусловием. while (Выражение) { Операторы; } n n Если условие при первом входе в цикл принимает значение false, цикл не выполняется ни разу. Если условие при первом входе в цикл принимает значение true и не изменяется внутри тела цикла, цикл становится бесконечным. Для завершения такого цикла внутри тела цикла нужно использовать оператор break. 36
ОПЕРАТОРЫ ЦИКЛА // вычисление суммы 1/1 + 1/4 +. . . + 1/N 2 // с точностью eps double sum, psum = 0. 0; int n = 1; while (true) { sum = psum + 1. 0/(n*n); n++; if (sum – psum < eps) break; psum = sum; 37 }
ОПЕРАТОРЫ ЦИКЛА n Оператор do используется для реализации цикла с постусловием. do { Операторы; } while (Выражение); n Оператор for представляет собой обобщение простого цикла с предусловием while. for (Инициализация; Условие; Шаг) { Операторы; } n Частный случай – бесконечный цикл for (; ; ) { Операторы; } 38
ОПЕРАТОРЫ ЦИКЛА n Основной вариант использования оператора for – цикл со счетчиком for (int i = 0; i < 10; i++) { System. out. println(i*i); } 39
ОПЕРАТОРЫ BREAK И CONTINUE n n Операторы break и continue используются для изменения порядка выполнения программного кода, заданного структурными операторами. Оператор break используется внутри структуры switch и циклов while, do и for. Его выполнение приводит к немедленному завершению оператора, содержащего break. Выполнение оператора continue приводит к завершению текущей итерации внешнего цикла, и переходу к следующей итерации. Операторы break и continue имеют специальную форму с меткой, с помощью которой можно ссылаться на помеченные операторы, не ограничиваясь ближайшим 40 блоком.
ОПЕРАТОРЫ BREAK И CONTINUE // суммирование числа 1/N, пока сумма не превысит 10 double sum = 0. 0, next. Sum, limit = 10. 0; int n = 1; while (true) { next. Sum = sum + 1. 0/n++; if (next. Sum > limit) break; sum = next. Sum; } 41
ОПЕРАТОР SWITCH n Оператор switch используется для реализации многовариантного выбора switch (Выражение) { case Вариант1: Операторы1; break; case Вариант2: Операторы2; break; … else Оператор; 42
ОПЕРАТОР SWITCH int a = 2, b = 3; char op = '+'; switch (c ) { case '+': System. out. println(a + b); break; case '-': System. out. println(a - b); break; case '*': System. out. println(a*b); break; case '/': if (b == 0) System. out. println(“Деление на нуль”); else System. out. println(a/b); break; default: System. out. println(“Неправильная операция”); 43
МАССИВЫ n n В языке Java массив — это ссылочный тип данных, позволяющий упорядоченно хранить некоторое фиксированное количество элементов одного типа и получать к ним произвольный доступ по индексу. В качестве типа элементов массива может использоваться любой ранее определенный тип Java. В частности, компонентный тип сам может являться массивом — в этом случае массив называется многомерным. Индексы элементов массива изменяются в пределах от 0 до N – 1, где N — количество элементов массива (длина). Обозначение типа массива состоит из обозначения базового типа и пары квадратных скобок, например: int[] - одномерный массив целых ¨ long[] - одномерный массив длинных целых ¨ char[][] - двумерный массив символов ¨ 44
ОПРЕДЕЛЕНИЕ МАССИВОВ n n Поскольку массивы являются ссылочными типами, переменные-массивы не хранят данные непосредственно, а представляют собой только ссылку на набор элементов массива. Объявление переменной-массива само по себе не приводит к выделению памяти, необходимой для хранения данных. В общем случае определение массива состоит из трех действий: ¨ ¨ ¨ n объявление переменной-массива создание экземпляра массива инициализация (присвоение начальных значений элементам массива) Объявление переменной-массива выполняется так же, как и для простых типов, например: int[] data; // массив целых чисел double[][] matrix; // вещественная матрица 45
ОПРЕДЕЛЕНИЕ МАССИВОВ n n n Создание экземпляра массива инициирует выделение памяти, необходимой для хранения элементов массива и формирование ссылки на новый массив. Полученная ссылка затем сохраняется в ранее объявленной переменной. Элементы нового массива получают нулевые значения (0 для числовых типов, false для boolean, null для ссылок). Для создания одномерного массива используется операция new в следующей форме: new Тип[Размер] Объявление переменной и создание экземпляра можно объединить в одном операторе: int[] data = new int[10]; После создания длину массива изменять нельзя. Если требуется удалить элементы или добавить новые, необходимо создать новый массив и скопировать в него нужные элементы старого массива 46
ОПРЕДЕЛЕНИЕ МАССИВОВ Инициализация массива состоит в задании начальных значений его элементов. n Массив можно инициализировать при помощи списка значений. При объявлении переменной-массива нужно указать список, заключенный в фигурные скобки, в качестве значения массива: int[] data = {1, 2, 3, 4, 5}; n В операциях присваивания вместо этой формы используется вариант операции new (размер массива при этом не указывается): int[] data; 47 data = new int[]{1, 2, 3, 4, 5}; n
ЭЛЕМЕНТЫ МАССИВА n n Для получения доступа к элементу массива нужно указать его индекс в квадратных скобках: a[i] С каждым экземпляров массива связана константа length, в которой хранится количество элементов int[] a = {1, 2, 3, 4, 5}; for (int i = 0; i < a. length; i++) { System. out. println(a[i]); } n Допустимость индекса проверяется при любом обращении к массиву. В случае ошибки возникает исключительная ситуация Array. Index. Out. Of. Bounds. Exception. 48
ЭЛЕМЕНТЫ МАССИВА n n Переменные-массивы, как и все переменные ссылочных типов, могут принимать значение null. В этом случае переменная не ссылается ни на какой реальный массив. Ссылку null следует отличать от ссылки на массив нулевой длины, который существует в памяти и является полноценным экземпляром массива, хотя и не содержит элементов. При попытке обращения к элементу null-массива возникает исключительная ситуация Null. Pointer. Exception, а в случае массива нулевой длины — Array. Index. Out. Of. Bound. Exception. Массивы нулевой длины часто используются вместо ссылок null, так как в этом случае достаточно только проверки длины массива, но не самой ссылки. 49
ОСНОВНЫЕ ОПЕРАЦИИ НАД МАССИВАМИ n n Во многих случаях для работы с массивами удобно использовать специализированный класс Arrays (пакет java. util), содержащий набор статических методов для выполнения стандартных действий с массивами различных типов. В частности, класс Arrays позволяет ¨ заполнять массивы одинаковыми значениями ¨ поэлементно сравнивать два массива ¨ форматировать массив в виде строки ¨ выполнять сортировку массива ¨ выполнять двоичный поиск в упорядоченном массиве 50
ЦИКЛ FOR ДЛЯ МАССИВОВ Циклы for часто используются для перебора элементов массива. В связи с этим, начиная с версии 1. 5, в языке Java предусмотрена специальная форма цикла for, оптимизированная для использования совместно с массивами. for (Тип переменная : Массив) { Операторы; } Например: n int[] primes = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 }; for (int n : primes) { System. out. println(n); } В результате выводится массив данных 51
ЦИКЛ FOR ДЛЯ МАССИВОВ n Для массива null, во время выполнения возникает исключительная ситуация Null. Pointer. Exception double sum = 0. 0; for (double x : data) { sum += x; } n Если при обработке массива требуются значения индексов, необходимо использовать обычный цикл for. 52
КОПИРОВАНИЕ МАССИВА n n Во многих случаях возникает задача копирования элементов одного массива в другой. Простое присваивание переменных не позволяет добиться нужного эффекта, так как массивы являются ссылочными типами и в результате присваивания изменяется только ссылка на сами данные. int[] a = {1, 2, 3, 4, 5}; int[] b = a; b[0] = 6; // изменяется и b[0], и a[0] 53
КОПИРОВАНИЕ МАССИВА В языке Java предусмотрен эффективный способ копирования фрагмента одного массива в другой массив — метод System. arraycopy(): void arraycopy (Object src, int src. Pos, Object dest, int dest. Pos, int length) int[] a = {1, 2, 3, 4, 5}; int[] b = new int[a. length]; System. arraycopy(a, 0, b, 0, a. length); /*src – массив источник, src. Pos – номер элемента массива источника, dest – массив назначения, dest. Pos - номер элемента массива назначения, length – 54 длина массива */ n
МНОГОМЕРНЫЕ МАССИВЫ При создании многомерных массивов используется расширенная форма операции new, позволяющая указать длины массива по нескольким измерениям: new Type[Size 1]. . . [Size. N] n n Массив, созданный такой операцией new, всегда имеет прямоугольную форму double[][] matrix = new double[3][4]; 55
МНОГОМЕРНЫЕ МАССИВЫ n Для создания многомерного массива достаточно указать только первую размерность. В этом случае длины всех массивов по другим измерениям нужно задавать отдельно. Полученный массив может иметь форму, отличающуюся от прямоугольной. 56
МНОГОМЕРНЫЕ МАССИВЫ n n Как и в случае одномерных массивов можно выполнять инициализация при объявлении переменной, указав в фигурных скобках список значений его элементов. Поскольку элементы многомерного массива сами являются массивами, списки должны быть вложены друг в друга. int[][] m = {{1, 2}, {3, 4}}; n Аналогичную конструкцию можно использовать совместно с операцией new. При этом длины измерений массива не указываются: int[][] m; . . . m = new int[][]{{1, 2}, {3, 4}}; 1 3 2 4 58
МНОГОМЕРНЫЕ МАССИВЫ n n n При копировании многомерных массивов с помощью arraycopy() они интерпретируются как одномерные массивы со ссылочным компонентным типом, поэтому в результате будут скопированы только ссылки на соответствующие массивы меньшей размерности. Для полного копирования следует использовать вложенные циклы, которые копируют массивы поэлементно По этой же причине большинство методов класса Arrays, предназначенных для обработки одномерных массивов, не будут корректно работать с многомерными массивами. 59


