Язык Java

Содержание

Слайд 2

План

Немного истории
Особенности Java
Компилятор и интерпретатор
JVM
Hello world
Примитивные типы данных
Методы в Java
Java переменные
Ввод с

План Немного истории Особенности Java Компилятор и интерпретатор JVM Hello world Примитивные
клавиатуры Java языка

Слайд 3

Немного истории

Первая версия языка появилась еще в 1996 году в недрах компании

Немного истории Первая версия языка появилась еще в 1996 году в недрах
Sun Microsystems, впоследствии поглощенной компанией Oracle. Java задумывался как универсальный язык программирования, который можно применять для различного рода задач.

Слайд 4

Немного истории

Java задумывался как универсальный язык программирования, который можно применять для различного

Немного истории Java задумывался как универсальный язык программирования, который можно применять для
рода задач. И к настоящему времени язык Java проделал большой путь, было издано множество различных версий.
Java превратилась из просто универсального языка в целую платформу и экосистему, которая объединяет различные технологии, используемые для целого ряда задач: от создания десктопных приложений до написания крупных веб-порталов и сервисов. Кроме того, язык Java активно применяется для создания программного обеспечения для множества устройств: обычных ПК, планшетов, смартфонов и мобильных телефонов и даже бытовой техники. Достаточно вспомнить популярность мобильной ОС Android, большинство программ для которой пишутся именно на Java.

Слайд 5

Особенности Java

Ключевой особенностью языка Java является то, что его код сначала транслируется

Особенности Java Ключевой особенностью языка Java является то, что его код сначала
в специальный байт-код, независимый от платформы. А затем этот байт-код выполняется виртуальной машиной JVM (Java Virtual Machine). В этом плане Java отличается от стандартных интерпретируемых языков как PHP или Perl, код которых сразу же выполняется интерпретатором. В то же время Java не является и чисто компилируемым языком, как С или С++.
Подобная архитектура обеспечивает кроссплатформенность и аппаратную переносимость программ на Java, благодаря чему подобные программы без перекомпиляции могут выполняться на различных платформах - Windows, Linux, Mac OS и т.д. Для каждой из платформ может быть своя реализация виртуальной машины JVM, но каждая из них может выполнять один и тот же код.

Слайд 6

Особенности Java

Java является языком с Си-подобным синтаксисом и близок в этом отношении

Особенности Java Java является языком с Си-подобным синтаксисом и близок в этом
к C/C++ и C#. Поэтому, если вы знакомы с одним из этих языков, то овладеть Java будет легче.
Еще одной ключевой особенностью Java является то, что она поддерживает автоматическую сборку мусора. А это значит, что вам не надо освобождать вручную память от ранее использовавшихся объектов, как в С++, так как сборщик мусора это сделает автоматически за вас.

Слайд 7

Особенности Java

Java является объектно-ориентированным языком. Он поддерживает полиморфизм, наследование, статическую типизацию. Объектно-ориентированный

Особенности Java Java является объектно-ориентированным языком. Он поддерживает полиморфизм, наследование, статическую типизацию.
подход позволяет решить задачи по построению крупных, но в тоже время гибких, масштабируемых и расширяемых приложений.

Слайд 8

Компилятор и интерпретатор

Компиляторы и интерпретаторы - это трансляторы, которые преобразуют исходный код

Компилятор и интерпретатор Компиляторы и интерпретаторы - это трансляторы, которые преобразуют исходный
в машинный код, только разными способами. Интерпретатор читает исходный код программы и выполняет его. Преобразование исходного кода в бинарный и выполнение происходит построчно.

Слайд 9

Компилятор и интерпретатор

Достоинства интерпретаторов:
Независимость от ОС (переносимость кода).
При внесении изменений НЕ требуется

Компилятор и интерпретатор Достоинства интерпретаторов: Независимость от ОС (переносимость кода). При внесении
перекомпиляция кода.
Недостатки интерпретаторов:
Для запуска программы требуется наличие интерпретатора.
Низкая скорость работы.

Слайд 10

Интерпретатор

Достоинства интерпретаторов:
Независимость от ОС (переносимость кода).
При внесении изменений НЕ требуется перекомпиляция кода.
Недостатки

Интерпретатор Достоинства интерпретаторов: Независимость от ОС (переносимость кода). При внесении изменений НЕ
интерпретаторов:
Для запуска программы требуется наличие интерпретатора.
Низкая скорость работы.

Слайд 11

Компилятор

Достоинства компиляторов:
Быстрота работы программ;
Отсутствие надобности компилятора на компьютере пользователя.
Недостатки компиляторов:
Программа зависит от

Компилятор Достоинства компиляторов: Быстрота работы программ; Отсутствие надобности компилятора на компьютере пользователя.
ОС, под которую была скомпилирована.
При внесении изменений требуется перекомпиляция кода.

Слайд 12

Байт-код

Все языки можно условно разделить на компилируемые и интерпретируемые. В Java используется третий

Байт-код Все языки можно условно разделить на компилируемые и интерпретируемые. В Java
подход — байт-код. Исходный код Java преобразуется компилятором в байт-код (а не машинный код). A байт-код Java преобразуется в машинный код с помощью специального интерпретатора, называемого виртуальной машиной Java (Java Virtual Machine — JVM).

Слайд 13

Байт-код

Рассмотрим более детально как работает Java:
Создается исходный  документ (исходник) – файл c

Байт-код Рассмотрим более детально как работает Java: Создается исходный документ (исходник) –
расширением .java.
Исходник пропускается через компилятор, который проверяет код на ошибки и выдает конечный результат.
Компилятор создает новый документ, закодированный с помощью байт-кода. Любое устройство, способное выполнять Java, сможет интерпретировать этот файл в такой формат, который сможет запустить. Скомпилированный байт-код не зависит  от платформы.
Виртуальная машина считывает и выполняет байт-код. 

Слайд 14

JVM

JVM имеет две основные функции:
Позволяет запускать Java приложения на любых устройствах или

JVM JVM имеет две основные функции: Позволяет запускать Java приложения на любых
операционных системах (принцип – «Написал один раз, запускай везде»)
Управляет и оптимизирует память, используемую приложением

Слайд 15

JVM

В 1995 году, когда Java появилась, все компьютерные программы были написаны под

JVM В 1995 году, когда Java появилась, все компьютерные программы были написаны
определенные операционные системы и управлять памятью приходилось разработчику программного обеспечения. Так что появление JVM было революцией.

Слайд 16

JVM

Существует техническое определение JVM, а также его повседневная формулировка:
Техническое определение: JVM –

JVM Существует техническое определение JVM, а также его повседневная формулировка: Техническое определение:
это программное обеспечение, которое выполняет код и предоставляет среду выполнения для этого кода
Повседневная формулировка: JVM – это способ запуска наших Java приложений. Мы настраиваем параметры JVM, а затем полагаемся на нее автоматическое управление ресурсами программы во время выполнения
Когда разработчики говорят о JVM, обычно имеют в виду процесс, запущенный на устройстве, который предоставляет и контролирует использование ресурсов Java приложением. Спецификация JVM описывает требования для разработки программ, выполняющих эти задачи.

Слайд 17

JVM

JVM (Java Virtual Machine) - виртуальная машина Java - основная часть исполняющей

JVM JVM (Java Virtual Machine) - виртуальная машина Java - основная часть
системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM обеспечивает платформо-независимый способ выполнения кода. Программисты могут писать код не задумываясь как и где он будет выполняться.
JRE (Java Runtime Environment) - минимальная реализация виртуальной машины, необходимая для исполнения Java -приложений, без компилятора и других средств разработки. Состоит из виртуальной машины и библиотек Java классов.
JDK (Java Development Kit) - комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему JRE.

Слайд 18

Стек

Для оптимальной работы приложения JVM делит память на область стека (stack) и

Стек Для оптимальной работы приложения JVM делит память на область стека (stack)
область кучи (heap). Всякий раз, когда мы объявляем новые переменные, создаем объекты или вызываем новый метод, JVM выделяет память для этих операций в стеке или в куче.

Слайд 19

Стек

Стек работает по схеме LIFO (последним вошел, первым вышел). Всякий раз, когда

Стек Стек работает по схеме LIFO (последним вошел, первым вышел). Всякий раз,
вызывается новый метод, содержащий примитивные значения или ссылки на объекты, то на вершине стека под них выделяется блок памяти.
Когда метод завершает выполнение, блок памяти, отведенный для его нужд, очищается, и пространство становится доступным для следующего метода.

Слайд 20

Стек

Помимо того, что мы рассмотрели, существуют и другие особенности стека:
Он заполняется и

Стек Помимо того, что мы рассмотрели, существуют и другие особенности стека: Он
освобождается по мере вызова и завершения новых методов
Переменные в стеке существуют до тех пор, пока выполняется метод в котором они были созданы
Если память стека будет заполнена, Java бросит исключение java.lang.StackOverFlowError
Доступ к этой области памяти осуществляется быстрее, чем к куче
является потокобезопасным, поскольку для каждого потока создается свой отдельный стек

Слайд 21

Куча

Эта область памяти используется для объектов и классов. Новые объекты всегда создаются

Куча Эта область памяти используется для объектов и классов. Новые объекты всегда
в куче, а ссылки на них хранятся в стеке.
Эти объекты имеют глобальный доступ и могут быть получены из любого места программы.
Эта область памяти разбита на несколько более мелких частей, называемых поколениями:
Young Generation — область где размещаются недавно созданные объекты. Когда она заполняется, происходит быстрая сборка мусора
Old (Tenured) Generation — здесь хранятся долгоживущие объекты. Когда объекты из Young Generation достигают определенного порога "возраста", они перемещаются в Old Generation
Permanent Generation — эта область содержит метаинформацию о классах и методах приложения, но начиная с Java 8 данная область памяти была упразднена.

Слайд 23

Куча

Eden Space (heap) – в этой области выделятся память под все создаваемые

Куча Eden Space (heap) – в этой области выделятся память под все
из программы объекты. Большая часть объектов живет недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), GC выполняет быструю (minor collection) сборку мусора. По сравнению с полной сборкой мусора она занимает мало времени, и затрагивает только эту область памяти — очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область.

Слайд 24

Куча

Survivor Space (heap) – сюда перемещаются объекты из предыдущей, после того, как

Куча Survivor Space (heap) – сюда перемещаются объекты из предыдущей, после того,
они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space.

Слайд 25

Куча

Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты,

Куча Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые
синглтоны, менеджеры ресурсов и проч.). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.

Слайд 26

Куча

Помимо рассмотренных ранее, куча имеет следующие ключевые особенности:
Когда эта область памяти полностью

Куча Помимо рассмотренных ранее, куча имеет следующие ключевые особенности: Когда эта область
заполняется, Java бросает java.lang.OutOfMemoryError
Доступ к ней медленнее, чем к стеку
Эта память, в отличие от стека, автоматически не освобождается. Для сбора неиспользуемых объектов используется сборщик мусора
В отличие от стека, куча не является потокобезопасной и ее необходимо контролировать, правильно синхронизируя код

Слайд 29

Hello world

Данный пример находится в исходном файле с именем MyFirstApp.java. Данная программа

Hello world Данный пример находится в исходном файле с именем MyFirstApp.java. Данная
выводит сообщение "Hello world!!!" на консоль.

Слайд 30

Основные правила по написанию приложений на Java

В Java исходный файл называется единицей

Основные правила по написанию приложений на Java В Java исходный файл называется
компиляции. Он представляет собой текстовый файл, содержащий определения одного или нескольких классов. (Мы будем пока что пользоваться исходными файлами, содержащими только один класс.)
Компилятор Java требует, чтобы исходный файл имел расширение .java.
По принятому соглашению имя главного класса должно совпадать с именем файла, содержащего исходный код программы.
В Java весь код должен размещаться в классе.
Java учитывает регистр символов!
Все определение класса, в том числе его членов, должно располагаться между открывающей ( { ) и закрывающей ( } ) фигурными скобками.

Слайд 31

Основные правила по написанию приложений на Java

Выполнение всех прикладных программ нa Java

Основные правила по написанию приложений на Java Выполнение всех прикладных программ нa
начинается с вызова метода main().
Правильные объявления метода main():
Компилятор Java скомпилирует классы, в которых отсутствует метод main(), но загрузчик приложений (java) не сможет выполнить код таких классов.
Для передачи любой информации, требующейся методу, служат переменные, указываемые в скобках вслед за именем метода. Эти переменные называются параметрами. Если параметры не требуются методу, то указываются пустые скобки.
В языке Java все операторы обычно должны оканчиваться точкой с запятой.
Большинство пробелов, табуляций, символов переноса строки и так далее игнорируются.

Слайд 32

Добавление класса в пакет

Обычно проект содержит большое количество классов и держать их

Добавление класса в пакет Обычно проект содержит большое количество классов и держать
в одном каталоге крайне неудобно. Кроме того, может возникнуть ситуация, когда два программиста создали класс с одинаковым названием. Для решения этих проблем в Java существует такой механизм как пакеты. Пакеты по своей сути очень похожи на каталоги файловой системы и должны совпадать с ней.

Слайд 33

Добавление класса в пакет

Существуют также правила для наименования пакетов. Для коммерческих проектов

Добавление класса в пакет Существуют также правила для наименования пакетов. Для коммерческих
пакет должен начинаться с com, потом следует имя организации и название проекта. Потом пакеты обычно именуются по какому-то функциональному признаку.
Кроме разделения пространств имен классов, пакеты также служат для управления доступностью объектов. В пакете можно определить классы, недоступные для кода за пределами этого пакета. В нем можно также определить члены класса, доступные только другим членам этого же пакета. Благодаря такому механизму классы могут располагать полными сведениями друг о друге, но не предоставлять эти сведения остальному миру. 

Слайд 34

Добавление класса в пакет

Хорошей практикой считается добавлять классы в пакеты. Но так

Добавление класса в пакет Хорошей практикой считается добавлять классы в пакеты. Но
как полное имя класса включает в себя имя пакета, в коде это может привести к достаточно длинным строкам, что крайне неудобно. Для решения этой проблемы в Java придуман такой механизм как импорт. Оператор import позволяет импортировать класс, после чего к нему можно обращаться просто по имени.

Слайд 35

Добавление класса в пакет

Существует один пакет, классы которого импортируются в код по

Добавление класса в пакет Существует один пакет, классы которого импортируются в код
умолчанию. Это пакет jаva.lang, в котором находятся наиболее часто используемые классы.
Вы можете импортировать два пакета, в которых находятся классы с одинаковыми именами. Но обращаться к ним по короткому имени будет ошибкой - компилятор не сможет определить какой именно класс вам нужен. Поэтому к таким классам придется обращаться только по полному имени.

Слайд 36

Примитивные типы данных

Типы в Java распределены на две категории: примитивные (простые) и

Примитивные типы данных Типы в Java распределены на две категории: примитивные (простые)
ссылочные (объектные). Ссылочные типы - это массивы, классы и интерфейсы.

Слайд 37

Примитивные типы данных

Примитивные типы можно разделить на следующие четыре группы:
Целые числа.

Примитивные типы данных Примитивные типы можно разделить на следующие четыре группы: Целые
Эта группа включает в себя типы данных byte, short, int и long, представляющие целые числа со знаком.
Числа с плавающей точкой. Эта группа включает в себя типы данных flоаt и double, представляющие числа с точностью до определенного знака после десятичной точки.
Символы. Эта группа включает в себя тип данных char, представляющий символы, например буквы и цифры, из определенного набора.
Логические значения. Эта группа включает в себя тип данных boolean, специально предназначенный для представления логических значений.

Слайд 38

Примитивные типы данных

Примитивные типы данных

Слайд 39

Примитивные типы данных

Типы byte, short, int, long
Целочисленные числа представлены в языке Java

Примитивные типы данных Типы byte, short, int, long Целочисленные числа представлены в
четырьмя типами - byte, short, int и long.
int — основной целочисленный тип, используемый в Java по умолчанию. Любое целое число будет рассматриваться компилятором как число типа int. Используется в качестве счётчика циклов, индексов массивов и индексов символов в строках.
long — целочисленный тип содержащий практически бесконечное количество значений. Используется в случаях, где числа превосходят 2 миллиарда и стандартного int уже не хватает. Используется в повседневной жизни для создания уникальных значений.
byte — используется для передачи данных по сети, записи и чтения из файла. В математических операциях, как правило, не используется.
short — самый редко используемый тип в Java, может использоваться только в целях экономии памяти.

Слайд 40

Примитивные типы данных

Примитивные типы данных

Слайд 41

Примитивные типы данных

Типы byte, short, int, long
Целочисленные числа представлены в языке Java

Примитивные типы данных Типы byte, short, int, long Целочисленные числа представлены в
четырьмя типами - byte, short, int и long.
int — основной целочисленный тип, используемый в Java по умолчанию. Любое целое число будет рассматриваться компилятором как число типа int. Используется в качестве счётчика циклов, индексов массивов и индексов символов в строках.
long — целочисленный тип содержащий практически бесконечное количество значений. Используется в случаях, где числа превосходят 2 миллиарда и стандартного int уже не хватает. Используется в повседневной жизни для создания уникальных значений.
byte — используется для передачи данных по сети, записи и чтения из файла. В математических операциях, как правило, не используется.
short — самый редко используемый тип в Java, может использоваться только в целях экономии памяти.

Слайд 42

Примитивные типы данных

Числа с плавающей точкой (или действительные числа) представлены типами float

Примитивные типы данных Числа с плавающей точкой (или действительные числа) представлены типами
и double. Используются для хранения значений с точностью до определенного знака после десятичной точки.
double — это числа с двойной точностью, максимально приближённые к заданным или полученным в результате вычислений значениям. Используется в Java для любых математических вычислений (квадратный корень, синус, косинус,..).
float — менее точный тип с плавающей точкой. Используется очень редко с целью экономии памяти.

Слайд 43

Примитивные типы данных

В языке Java есть три специальных числа плавающей точкой, которые

Примитивные типы данных В языке Java есть три специальных числа плавающей точкой,
используются для обозначения переполнения и ошибок:
положительная бесконечность - результат деления положительного числа на 0. Представлены константами Double.POSITIVE_INFINITY и Float.POSITIVE_INFINITY.
отрицательная бесконечность - результат деления отрицательного числа на 0. Представлены константами Double.NEGATIVE_INFINITY и Float.NEGATIVE_INFINITY.
NaN (не число) - вычисление 0/0 или извлечение квадратного корня из отрицательного числа. Представлены константами Double.NaN и Float.NAN.

Слайд 44

Примитивные типы данных

Java тип char
Символы описываются в языке Java char типом. Символы

Примитивные типы данных Java тип char Символы описываются в языке Java char
преобразуются по таблице кодировки UTF-16. По большому счёту это все буквы, числа и специальные символы существующие на нашей планете. 
Размер в байтах - 2 байта
Возможные значения (от..до) - 0..65,535
Значение по умолчанию - '\u0000'
Тип char является псевдоцелочисленным типом, поэтому значения этого типа можно задавать в виде числа - кода символа из таблицы кодировки UTF-16. Каждому символу соответствует определённое число из таблицы и Java при виде этого числа в рамках типа char выводит его на экран как символ.

Слайд 45

Примитивные типы данных

Java тип boolean
Примитивный тип boolean предназначен для хранения логических значений.

Примитивные типы данных Java тип boolean Примитивный тип boolean предназначен для хранения
Логические переменные этого типа могут принимать только два значения: true – истина и false – ложь. Памяти на переменную такого типа требуется 1 бит.

Слайд 46

Методы в Java

Практически весь код в Java пишется в методах. Рассмотрим синтаксис

Методы в Java Практически весь код в Java пишется в методах. Рассмотрим
написания методов.
Общая форма объявления метода:
Существует также такое понятие как сигнатура метода Java языка - это имя метода и его параметры. Возвращаемый тип не входит в сигнатуру.

Слайд 47

Методы в Java

Методы в Java не возвращающие значение
В следующем примере метод print

Методы в Java Методы в Java не возвращающие значение В следующем примере
не принимает на вход никаких значений - список параметров у него пустой. Возвращаемый тип у него void - это значит, что он ничего не возвращает.
Метод выводит на консоль сообщение "Print some info".

Слайд 48

Методы в Java

Методы в Java возвращающие значение
Метод getVolume принимает на вход три

Методы в Java Методы в Java возвращающие значение Метод getVolume принимает на
параметра типа double, а также возвращает значение типа double. Метод возвращает значение с помощью ключевого слова return:

Слайд 49

Методы в Java

Тип метода
Тип обозначает конкретный тип данных, возвращаемых методом. Он может

Методы в Java Тип метода Тип обозначает конкретный тип данных, возвращаемых методом.
быть любым допустимым типом данных, в том числе и типом созданного класса.
Если метод не возвращает значение, то его возвращаемым типом должен быть void.
Методы, возвращаемый тип которых отличается от void, возвращают значение: return значение;

Слайд 50

Методы в Java

Имя и параметры метода
Для указания имени метода служит идентификатор имя.

Методы в Java Имя и параметры метода Для указания имени метода служит
Это может быть любой допустимый идентификатор, кроме тех, которые уже используются другими элементами кода в текущей области действия.
Список параметров обозначает последовательность пар "тип-идентификатор", разделенных запятыми. По существу, параметры - это переменные, которые принимают значения аргументов, передаваемых методу во время его вызова. Если у метода отсутствуют параметры, то список_параметров оказывается пустым.

Слайд 51

Методы в Java

Параметр и аргумент
Важно различать два термина: параметр и аргумент.
Параметр -

Методы в Java Параметр и аргумент Важно различать два термина: параметр и
это переменная, определенная методом, которая принимает значение при вызове метода.
Аргумент - это значение, передаваемое методу при его вызове. Например, square(100) передает 100 в качестве аргумента. Внутри метода square() параметр i получает это значение.

Слайд 52

Java переменные

Простая форма объявления Java переменных:
Общая форма объявления Java переменных и их

Java переменные Простая форма объявления Java переменных: Общая форма объявления Java переменных
инициализации:
Где параметр тип обозначает один из примитивных типов данных в Java, имя класса или интерфейса. А идентификатор - это имя переменной.

Слайд 53

Java переменные

Java - строго типизированный язык. Каждая переменная в Java имеет конкретный тип,

Java переменные Java - строго типизированный язык. Каждая переменная в Java имеет
который определяет размер и размещение её в памяти; диапазон значений, которые могут храниться в памяти; и набор операций, которые могут быть применены к переменной.
Необходимо объявить все переменные, прежде чем их использовать. 
Если требуется объявить несколько переменных заданного типа, это можно сделать в виде разделенного запятыми списка имен переменных.
Переменная может быть инициализирована при объявлении или позже.
Во время выполнения программы значение переменной может изменяться.
Инициализирующее выражение должно возвращать значение того же самого (или совместимого) типа, что и у переменной.

Слайд 54

Java переменные

Пример объявления и инициализации переменных

Java переменные Пример объявления и инициализации переменных

Слайд 55

Java переменные

Область видимости переменной в Java
В Java допускается объявление переменных в любом

Java переменные Область видимости переменной в Java В Java допускается объявление переменных
блоке кода. Блок кода заключается в фигурные скобки, задавая тем самым область видимости или действия. Таким образом, при открытии каждого нового блока кода создается новая область видимости. 
Две основные области видимости в Java определяются классом и методом, хотя такое их разделение несколько искусственно.
В языке Java видимость переменных, определяемая методом, начинается с его открывающей фигурной скобки. Если у метода имеются параметры, то они также включаются в область видимости метода и действуют точно так же, как и любая другая переменная в методе.
Переменные, объявленные в области видимости, не доступны из кода за пределами этой области.
Области видимости могут быть вложенными. 
Переменные создаются при входе в их область действия и уничтожаются при выходе из нее.
Во внутреннем блоке кода нельзя объявлять переменные с тем же именем, что и во внешней области действия.

Слайд 56

Java переменные

Рассмотрим области действия переменных на следующем примере:

Java переменные Рассмотрим области действия переменных на следующем примере:

Слайд 57

Преобразование и приведение примитивных типов в Java

Иногда возникают ситуации, когда необходимо переменной

Преобразование и приведение примитивных типов в Java Иногда возникают ситуации, когда необходимо
одного типа присвоить значение переменной другого типа. Например:

Слайд 58

Преобразование и приведение примитивных типов в Java

В Java существует два типа преобразований

Преобразование и приведение примитивных типов в Java В Java существует два типа
- автоматическое преобразование (неявное) и приведение типов (явное преобразование).

Слайд 59

Преобразование и приведение примитивных типов в Java

Автоматическое преобразование типов Java
Рассмотрим сначала автоматическое

Преобразование и приведение примитивных типов в Java Автоматическое преобразование типов Java Рассмотрим
преобразование. Если оба типа совместимы, их преобразование будет выполнено в Java автоматически. Например, значение типа byte всегда можно присвоить переменной типа int, как это показано в предыдущем примере.
Для автоматического преобразования типа должно выполняться два условия:
оба типа должны быть совместимы
длина целевого типа должна быть больше длины исходного типа
В этом случае происходит преобразование с расширением. 

Слайд 60

Преобразование и приведение примитивных типов в Java

Следующая схема показывает расширяющее преобразование в

Преобразование и приведение примитивных типов в Java Следующая схема показывает расширяющее преобразование в Java:
Java:

Слайд 61

Преобразование и приведение примитивных типов в Java

Сплошные линии обозначают преобразования, выполняемые без

Преобразование и приведение примитивных типов в Java Сплошные линии обозначают преобразования, выполняемые
потери данных. Штриховые линии говорят о том, что при преобразовании может произойти потеря точности.
Например, тип данных int всегда достаточно велик, чтобы хранить все допустимые значения типа byte, поэтому никакие операторы явного приведения типов в данном случае не требуются. С точки зрения расширяющего преобразования числовые типы данных, в том числе целочисленные и с плавающей точкой, совместимы друг с другом. В то же время не существует автоматических преобразований числовых типов в тип char или boolean. Типы char и boolean также не совместимы друг с другом.

Слайд 62

Преобразование и приведение примитивных типов в Java

Стоит немного пояснить почему, к примеру

Преобразование и приведение примитивных типов в Java Стоит немного пояснить почему, к
тип byte не преобразуется автоматически (не явно) в тип char, хотя тип byte имеет ширину 8 бит, а char - 16, тоже самое касается и преобразования типа short в char. Это происходит потому, что byte и short знаковые типы данных, а char без знаковый. Поэтому в данном случае требуется использовать явное приведение типов, поскольку компилятору надо явно указать, что вы знаете чего хотите и как будет обрабатываться знаковый бит типов byte и short при преобразовании к типу char.
Поведение величины типа char в большинстве случаев совпадает с поведением величины целого типа, следовательно, значение типа char можно использовать везде, где требуются значения int или long. Однако напомним, что тип char не имеет знака, поэтому он ведет себя отлично от типа short, несмотря на то что диапазон обоих типов равен 16 бит.

Слайд 63

Преобразование и приведение примитивных типов в Java

Приведение типов Java
Несмотря на все удобство

Преобразование и приведение примитивных типов в Java Приведение типов Java Несмотря на
автоматического преобразования типов, оно не в состоянии удовлетворить все насущные потребности. Например, что делать, если значение типа int нужно присвоить переменной типа byte? Это преобразование не будет выполняться автоматически, поскольку длина типа byte меньше, чем у типа int. Иногда этот вид преобразования называется сужающим преобразованием, поскольку значение явно сужается, чтобы уместиться в целевом типе данных.
Чтобы выполнить преобразование двух несовместимых типов данных, нужно воспользоваться приведением типов. Приведение - это всего лишь явное преобразование типов. Общая форма приведения типов имеет следующий вид:
где параметр целевой тип обозначает тип, в который нужно преобразовать указанное значение.

Слайд 64

Преобразование и приведение примитивных типов в Java

Например, в следующем фрагменте кода тип

Преобразование и приведение примитивных типов в Java Например, в следующем фрагменте кода
int приводится к типу byte:
Рассмотрим пример преобразования значений с плавающей точкой в целые числа. В этом примере дробная часть значения с плавающей точкой просто отбрасывается (операция усечения):

Слайд 65

Преобразование и приведение примитивных типов в Java

При приведении более емкого целого типа

Преобразование и приведение примитивных типов в Java При приведении более емкого целого
к менее емкому старшие биты просто отбрасываются:
При приведении более емкого значения с плавающей точкой в целое число происходит усечение и отбрасывание старших битов:

Слайд 66

Преобразование и приведение примитивных типов в Java

Автоматическое продвижение типов в выражениях
Помимо операций присваивания,

Преобразование и приведение примитивных типов в Java Автоматическое продвижение типов в выражениях
определенное преобразование типов может выполняться и в выражениях.
В языке Java действуют следующие правила:
Если один операнд имеет тип double, другой тоже преобразуется к типу double.
Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
Иначе оба операнда преобразуются к типу int.
В выражениях совмещенного присваивания (+=,-=,*=,/=) нет необходимости делать приведение. 

Слайд 67

Преобразование и приведение примитивных типов в Java

Приведем пример:
При умножении переменной b1 (byte)

Преобразование и приведение примитивных типов в Java Приведем пример: При умножении переменной
на 2 (int) результат будет типа int. Поэтому при попытке присвоить результат в переменную b2 (byte) возникнет ошибка компиляции. Но при использовании совмещенной операции присваивания (*=), такой проблемы не возникнет:

Слайд 68

Преобразование и приведение примитивных типов в Java

В следующем примере тоже возникнет ошибка

Преобразование и приведение примитивных типов в Java В следующем примере тоже возникнет
компиляции - несмотря на то, что складываются числа типа byte, результатом операции будет тип int, а не short.

Слайд 69

Преобразование и приведение примитивных типов в Java

Следующий пример аналогичен предыдущему, но используется

Преобразование и приведение примитивных типов в Java Следующий пример аналогичен предыдущему, но
операция совмещенного присваивание, в которой приведение происходит автоматически:

Слайд 70

Ввод с клавиатуры Java языка

Для того, чтобы пользователь мог что-то ввести с

Ввод с клавиатуры Java языка Для того, чтобы пользователь мог что-то ввести
клавиатуры, существует стандартный поток ввода, представленный объектом System.in. Рассмотрим, как это происходит.
Для ввода данных с клавиатуры в Java используется метод System.in.read() - он возвращает код введенного символа. После его выполнения JVM останавливает программу и ждет пока пользователь введет символ с клавиатуры. Для того, чтобы вывести сам символ на консоль, выполняется его приведение к типу char:

Слайд 71

Ввод с клавиатуры Java языка

Конечно же, использовать System.in в чистом виде не

Ввод с клавиатуры Java языка Конечно же, использовать System.in в чистом виде
очень удобно, если нам необходимо ввести не один символ, а целую строку. В этом случае можно воспользоваться классом Scanner. Этот класс находится в пакете java.util, поэтому его надо импортировать:

Слайд 72

Ввод с клавиатуры Java языка

Методы этого класса позволяют считывать строку, значение типа

Ввод с клавиатуры Java языка Методы этого класса позволяют считывать строку, значение
int или double. 
Методы класса Scanner:
hasNextInt() - возвращает true если с потока ввода можно считать целое число.
nextInt() - считывает целое число с потока ввода.
hasNextDouble() - проверяет, можно ли считать с потока ввода вещественное число типа double.
nextDouble() - считывает вещественное число с потока ввода.
nextLine() - позволяет считывать целую последовательность символов, то есть строку.
hasNext() - проверяет остались ли в потоке ввода какие-то символы.

Слайд 73

Ввод с клавиатуры Java языка

В следующем примере метод hasNextInt() проверяет, ввел ли

Ввод с клавиатуры Java языка В следующем примере метод hasNextInt() проверяет, ввел
пользователь целое число. И с помощью метода nextInt() считываем введенное число. Если пользователь ввел строку, то программа выведет на консоль "Вы ввели не целое число":

Слайд 74

Ввод с клавиатуры Java языка

Рассмотрим пример, в котором используется метод nextDouble() для

Ввод с клавиатуры Java языка Рассмотрим пример, в котором используется метод nextDouble()
считывания дробного числа. Если же пользователь введет строку, то программа завершится с ошибкой времени выполнения. Чтобы этого не происходило, перед вызовом метода nextDouble(), сделайте проверку с помощью метода hasNextDouble():