Введение в Java

Содержание

Слайд 2

Java и другие языки программирования Язык C (начало1970-х, Bell Laboratories, Деннис

Java и другие языки программирования

Язык C (начало1970-х, Bell Laboratories,

Деннис Ритчи) - универсальный язык процедурного программирования для создания системного программного обеспечения;
Язык C++ (начало 1980-х, Bell Laboratories, Бьерн Страуструп, расширение языка С) - универсальный язык процедурного и объектно-ориентированного программирования для создания системного и прикладного программного обеспечения;
Язык Java (1995, Sun Microsystems, Джеймс Гослинг) – универсальный объектно-ориентированный язык прикладного программирования;
Язык JavaScript (1995, Netscape Communication) – узкоспециализированный прикладной язык программирования HTML-документов, расширяющий возможности HTML.
Язык C#, платформа .Net (2000, Microsoft) – универсальный объектно-ориентированный язык прикладного программирования;
Слайд 3

Java и другие языки программирования Как связаны между собой языки C,

Java и другие языки программирования

Как связаны между собой языки

C, C++, JavaScript и Java? Что между ними общего, и в чём они отличаются? В каких случаях следует, а в каких не следует их применять?
Язык C был создан в 1972 году в одной из исследовательских групп Bell Laboratories при разработке операционной системы Unix. Язык C создавался как язык для создания системного программного обеспечения, и таким он остаётся до сих пор (до сих пор применяется для написания операционных систем и программирования микроконтроллеров). Причины его популярности в том, что он смог обеспечить необходимую функциональность программного обеспечения в условиях низкой производительности компьютеров, крайней ограниченности их ресурсов и неразвитости периферийных устройств! Язык C является языком процедурного программирования, так как его базовыми конструкциями являются подпрограммы (подпрограммы –функции).
C++, Java, и JavaScript являются объектно-ориентированными языками программирования, и все они имеют C-образный синтаксис операторов. Но объектные модели и базовые конструкции этих языков (за исключением синтаксиса операторов) принципиально различны. Ни один из них не является версией или упрощением другого – это совсем разные языки, предназначенные для разных целей.
C++ является базовым языком системного программирования. Длительное время он использовался и для написания прикладных программ. Требования к прикладным программам совпадают к требованиям к системным только в том случае, когда быстродействие компьютера можно рассматривать как низкое, а ресурсы компьютера – малыми.
У языков C и C++ имеется два принципиальных недостатка: а) низкая надёжность как на уровне исходного кода, так и на уровне исполняемого кода; б) отсутствие переносимости на уровне исполняемого кода. С появлением компьютерных сетей эти недостатки стали очень существенным ограничивающим фактором, поскольку вопросы безопасности при работе в локальных, и, особенно, глобальных сетях приобретают первостепенную значимость.
Java – это не только язык программирования, -это целая технология программирования (язык программирования Java + платформа Java). Сначала Java предназначалась для программирования бытовых электронных устройств, таких как телефоны. Потом Java стала применяться для программирования браузеров — появились апплеты.
Слайд 4

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

Java и другие языки программирования

Java также применяется для прикладного

программирования в неоднородных компьютерных сетях как со стороны клиентского компьютера, так и со стороны сервера.
Язык JavaScript создавался как узкоспециализированный прикладной язык программирования HTML-страниц, расширяющий возможности HTML, и в полной мере отвечает этим потребностям до сих пор. Следует подчеркнуть, что язык JavaScript не имеет никакого отношения к Java. Включение слова “Java” в название JavaScript являлось рекламным трюком фирмы Netscape Communication. Он также C-образен, но, в отличие от Java, является интерпретируемым.
Итак, Java- универсальный язык прикладного программирования, JavaScript – узкоспециализированный язык программирования HTML-документов, C++ - универсальный язык системного программирования.
В 2000 году в корпорации Microsoft была разработана платформа .Net (читается “дотнет”, DotNet– в переводе с английского “точка Net” ). Она стала альтернативой платформе Java и во многом повторяла её идеи. Основное различие заключалось в том, что для этой платформы можно использовать произвольное количество языков программирования, а не один. Причём классы .Net оказываются совместимы как в целях наследования, так и по исполняемому коду независимо от языка, используемого для их создания. Важнейшим языком .Net стал Java-образный язык C# (читается “Си шарп”). Фактически, C# унаследовал от Java большинство особенностей - динамическую объектную модель, сборку “мусора”, основные синтаксические конструкции. Хотя и является вполне самостоятельным языком программирования, имеющим много привлекательных черт. В частности, компонентные модели Java и C# принципиально отличаются.
Слайд 5

Категории программ, написанных на языке Java Приложение (application) – аналог “обычной”

Категории программ, написанных на языке Java

Приложение (application) – аналог

“обычной” прикладной программы.
Апплет (applet) – специализированная программа с ограниченными возможностями, работающая в окне WWW-документа под управлением браузера.
Сервлет (servlet) - специализированная программа с ограниченными возможностями, работающая в WWW на стороне сервера. Используется преимущественно в рамках технологии JSP (Java Server Pages - Серверных Страниц Java) для программирования WWW-документов со стороны сервера.
Серверное приложение (Enterprise application) – предназначено для многократного использования на стороне сервера.
Библиотека (Java Class Library – библиотека классов, либо NetBeans Module – модуль платформы NetBeans) – предназначена для многократного использования программами Java
Слайд 6

Выполнение Java-программы Выполнение Java-программы

Выполнение Java-программы

Выполнение Java-программы

Слайд 7

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

Выполнение Java-программы

Как вы знаете, программа, написанная на одном из языков

высокого уровня, к которым относится и язык Java, так называемый исходный модуль ("source"), не может быть сразу же выполнена. Ее сначала надо откомпилировать, т. е. перевести в последовательность машинных команд — объектный модуль. Но и он, как правило, не может быть сразу же выполнен: объектный модуль надо еще скомпоновать с библиотеками использованных в модуле функций, получив в результате загрузочный модуль — полностью готовую к выполнению программу.
Исходный модуль, написанный на Java, не может избежать этих процедур, но здесь проявляется главная особенность технологии Java — программа компилируется сразу в машинные команды, но не команды какого-то конкретного процессора, а в команды так называемой виртуальной машины Java (JVM, Java Virtual Machine). Виртуальная машина Java — это совокупность команд вместе с системой их выполнения. Команды JVM короткие, большинство из них имеет длину 1 байт, отчего команды JVM называют байт-кодами.
Другая особенность Java — все стандартные функции, вызываемые в программе, подключаются к ней только на этапе выполнения, а не включаются в байт-коды. Как говорят специалисты, происходит динамическая компоновка (dynamic binding). Это тоже сильно уменьшает объем откомпилированной программы.
Итак, на первом этапе программа, написанная на языке Java, переводится компилятором в байт-коды. Эта компиляция не зависит от типа какого-либо конкретного процессора и архитектуры некоего конкретного компьютера. Она может быть выполнена один раз сразу же после написания программы. Байт-коды записываются в одном или нескольких файлах, могут храниться во внешней памяти или передаваться по сети. Это особенно удобно благодаря небольшому размеру файлов с байт-кодами. Затем полученные в результате компиляции байт-коды можно выполнять на любом компьютере, имеющем систему, реализующую JVM. При этом не важен ни тип процессора, ни архитектура компьютера. Так реализуется принцип Java "Write once, run anywhere" — "Написано однажды, выполняется где угодно".
Слайд 8

Выполнение Java-программы Интерпретация байт-кодов и динамическая компоновка значительно замедляют выполнение программ.

Выполнение Java-программы

Интерпретация байт-кодов и динамическая компоновка значительно замедляют выполнение программ.

Это не имеет значения в тех ситуациях, когда байт-коды передаются по сети, сеть все равно медленнее любой интерпретации, но в других ситуациях требуется мощный и быстрый компьютер. Поэтому постоянно идет усовершенствование интерпретаторов в сторону увеличения скорости интерпретации. Разработаны JIT-компиляторы (Just-In-Time), запоминающие уже интерпретированные участки кода в машинных командах процессора и просто выполняющие эти участки при повторном обращении, например, в циклах. Это значительно увеличивает скорость повторяющихся вычислений. Фирма SUN разработала целую технологию Hot-Spot и включила ее в свою виртуальную машину Java.
При выполнении программ Java на других процессорах требуется интерпретация команд JVM в команды конкретного процессора, а значит, нужна программа-интерпретатор, причем для каждого типа процессоров, и для каждой архитектуры компьютера следует написать свой интерпретатор.
Эта задача уже решена практически для всех компьютерных платформ. На них реализованы виртуальные машины Java, а для наиболее распространенных платформ имеется несколько реализаций JVM разных фирм. Все больше операционных систем и систем управления базами данных включают реализацию JVM в свое ядро. Создана и специальная операционная система JavaOS, применяемая в электронных устройствах. В большинство браузеров встроена виртуальная машина Java для выполнения апплетов.
Внимательный читатель уже заметил, что кроме реализации JVM для выполнения байт-кодов на компьютере еще нужно иметь набор функций, вызываемых из байт-кодов и динамически компонующихся с байт-кодами. Этот набор оформляется в виде библиотеки классов Java, состоящей из одного или нескольких пакетов. Каждая функция может быть записана байт-кодами, но, поскольку она будет храниться на конкретном компьютере, ее можно записать прямо в системе команд этого компьютера, избегнув тем самым интерпретации байт-кодов. Такие функции называют "родными" методами (native methods). Применение "родных" методов ускоряет выполнение программы.
Слайд 9

Платформа Java Варианты распространения платформы Java: JDK (Java Development Kit); JRE

Платформа Java

Варианты распространения платформы Java:
JDK (Java Development Kit);
JRE (Java Runtime

Environment ).
Версии JDK (Java Development Kit) :
Java SE – комплект Java Standard Edition – для написания программного обеспечения для обычных компьютеров;
Java EE– комплект Java Enterprise Edition – для написания серверного программного обеспечения;
Java ME – комплект Java Micro Edition – для написания программного обеспечения для устройств, обладающих малыми ресурсами, например, сотовых телефонов, микроконтроллеров;
Ссылка для скачивания JRE:
http://java.com/ru/download/index.jsp
Слайд 10

Платформа Java Платфома Java – это программное обеспечение, которое используется для

Платформа Java

Платфома Java – это программное обеспечение, которое используется для

создания и выполнения Java –программ, также коллекция компонентов готовых к использованию, которые существенно упрощают процесс разработки приложений. Эти компоненты сгруппированы в библиотеки классов и интерфейсов. Такие библиотеки называются пакетами (packages).
Замечание: Платформа – это совокупность аппаратного и программного (ОС) обеспечения (Microsoft Windows, Linux, Solaris OS и Mac OS). Платформа Java отличается от этих платформ, так как являет лишь программным обеспечением.
Платформа Java распространяется в двух вариантах – JDK(Java Development Kit) и JRE (Java Runtime Environment ).
JDK - средство разработчика, состоящее в основном из утилит (например, java compiler), стандартных библиотек классов и демонстрационных примеров. JDK является базовым средством разработки приложений. Оно не содержит никаких текстовых редакторов, а оперирует только с уже существующими java-файлами с помощью утилит командной строки.
JRE (среда выполнения Java) - это минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки. Если пользователь хочет только запускать программы, это именно то, что ему нужно. JRE включен в состав JDK.
Слайд 11

Платформа Java Наиболее часто используемые пакеты библиотеки классов: java.lang - базовые

Платформа Java

Наиболее часто используемые пакеты библиотеки классов:
java.lang - базовые классы,

необходимые для работы любого приложения (название - сокращение от language);
java.util - многие полезные вспомогательные классы;
java.applet - классы для создания апплетов;
java.awt, java.swing - библиотека для создания графического интерфейса пользователя(GUI);
java.awt.image - дополнительные классы для работы с изображениями;
java.io - работа с потоками данных (streams) и с файлами;
java.net - работа с сетью.
Слайд 12

Java Development Kit (JDK) Ссылка для скачивания JDK: http://www.oracle.com/technetwork/java/javase/downloads/

Java Development Kit (JDK)

Ссылка для скачивания JDK:
http://www.oracle.com/technetwork/java/javase/downloads/

Слайд 13

Java Development Kit (JDK)

Java Development Kit (JDK)

Слайд 14

Java Development Kit (JDK) javac – компилятор для перевода java-программы в

Java Development Kit (JDK)

javac – компилятор для перевода java-программы в

байт-код, понятный виртуальной машине;
java – утилита для запуска байт-кода java-программы ;
jar – утилита для создания java-архивов
Слайд 15

Java Development Kit (JDK) Проверка версии установленной Java – машины: Проверка

Java Development Kit (JDK)

Проверка версии установленной Java – машины:

Проверка доступности

javac:

Если команда javac недоступна, то нужно добавить путь
“ C:\Program Files\Java\jdk1.7.0_25\bin” к системной переменной
PATH (Пуск->Панель управления->Система->Дополнительно -> Переменные среды)

Слайд 16

Структура Java-программы

Структура Java-программы

Слайд 17

Структура Java-программы Исходный код Java-программы – это текстовый файл, содержащий в

Структура Java-программы

Исходный код Java-программы – это текстовый файл, содержащий в

себе одно или несколько описаний классов, и имеющий расширение java. Хорошим стилем программирования является описание в java-файле одного класса, имя которого совпадает с именем этого класса.
Скомпилированный код (байт-код) для каждого класса записывается в отдельном выходном бинарном файле, с именем совпадающим с именем класса, и расширением class.
Среди классов программы должен быть класс, содержащий метод main(). Именно с метода main() начинает выполнять программу виртуальная java-машина.
Для того, чтобы байт-код был выполнен на каком-либо компьютере, он должен быть переведён в инструкции для соответствующего процессора. Именно этим и занимается Java-машина.
Виртуальная Java-машина не только исполняет байт-код (интерпретирует его, занимается JIT-компиляцией и исполняет JIT-компилированный код), но и выполняет ряд других функций. Например, взаимодействует с операционной системой, обеспечивая доступ к файлам или поддержку графики. А также обеспечивает автоматическое высвобождение памяти, занятой ненужными объектами – так называемую сборку мусора (garbage collection).
Слайд 18

Структура Java-программы Пример программы:

Структура Java-программы

Пример программы:

Слайд 19

Структура Java-программы В рассматриваемом примере файл с программой будет иметь имя

Структура Java-программы
В рассматриваемом примере файл с программой будет иметь имя

HelloWorld и расширение .java (HelloWorld.java). Файл с программой набран и сохранен с помощью программы Geany.
В командной строке запустим компилятор Java под названием javac и получим готовый класс HelloWorld.class. Если вы хотите посмотреть, как этот класс работает, выполните его при помощи команды java HelloWorld. При этом необходимо набрать имя запускаемого класса точно так, как оно написано в исходном тексте программы, т.е. с соблюдением регистра, иначе вы получите сообщение об ошибке. Если установлен JDK , то в Geany можно не только набрать программу на Java, но также ее компилировать и выполнять.
Рассмотрим поэлементно исходный текст нашего примера. Вся программа состоит из одного класса с именем HelloWorld. У этого класса имеется единственный метод main (так называемая точка входа).
Строка System.out.println("Привет, мир") посылает строку текста в стандартный поток вывода, т. е. на экран.
Модификатор доступа public перед именем метода main указывает на то, что этот метод доступен всем классам, желающим его вызвать, независимо от прав доступа и от места их расположения. Модификатор static говорит о том, что для всех экземпляров класса HelloWorld и в наследуемых от него классах существует лишь один метод main, разделяемый между всеми классами, которые, возможно, будут унаследованы от HelloWorld. Это помогает избежать появления множества точек входа в программу, что вызовет ошибку. Через переменную-массив args типа String (строка) передаются параметры командной строки класса.
Слайд 20

Структура Java-программы Пример программы с комментариями:

Структура Java-программы

Пример программы с комментариями:

Слайд 21

Структура Java-программы В текст программы можно вставить комментарии, которые компилятор не

Структура Java-программы
В текст программы можно вставить комментарии, которые компилятор не

будет учитывать. Они очень полезны для пояснений по ходу программы. В период отладки можно выключать из действий один или несколько операторов, пометив их символами комментария. Комментарии вводятся таким образом:
за двумя наклонными чертами подряд //, без пробела между ними, начинается комментарий, продолжающийся до конца строки;
за наклонной чертой и звездочкой /* начинается комментарий, который может занимать несколько строк, до звездочки и наклонной черты */ (без пробелов между этими знаками).
Комментарии очень удобны для чтения и понимания кода, они превращают программу в документ, описывающий ее действия. Программу с хорошими комментариями называют самодокументированной. Поэтому в Java введены комментарии третьего типа, а в состав JDK — программа javadoc , извлекающая эти комментарии в отдельные файлы формата HTML и создающая гиперссылки между ними: за наклонной чертой и двумя звездочками подряд, без пробелов, /** начинается комментарий, который может занимать несколько строк до звездочки (одной) и наклонной черты */ и обрабатываться программой javadoc . В такой комментарий можно вставить указания программе javadoc , которые начинаются с символа @.
Именно так создается документация к JDK. Добавим комментарии к нашему примеру.
Пример, конечно, перегружен пояснениями (это плохой стиль), здесь просто показаны разные формы комментариев.
Слайд 22

Структура Java-программы Пример программы:

Структура Java-программы

Пример программы:

Слайд 23

Структура Java-программы В рассматриваемом примере файл с программой будет иметь имя

Структура Java-программы
В рассматриваемом примере файл с программой будет иметь имя

JavaApplication1 и расширение .java (JavaApplication1.java). Файл с программой набран и сохранен с помощью программы Netbeans.
Ключевое слово “package” означает объявление пакета (грубо говоря, пакет – это контейнер, содержащий классы). Иерархический вид любой программы можно описать следующим образом:
Пакет ► Класс ► Метод. (при запуске – java Пакет.Класс)
Если класс хранится в отдельном файле, то пакету соответствует папка с этими файлами. Если у пакета есть подпакеты, то им соответствуют подпапки этой папки. Содержимое одних пакетов можно использовать в других с помощью команды import (тоже зарезервированное ключевое слово). Подробнее этот механизм мы изучим на следующих занятиях.
Слайд 24

Константы Целые константы: в десятичной форме: +5, -7, 12345678 ; в

Константы
Целые константы:
в десятичной форме: +5, -7, 12345678 ;
в

восьмеричной форме, начиная с нуля: 027, -0326, 0777 ; в записи таких констант недопустимы цифры 8 и 9;
в шестнадцатеричной форме, начиная с нуля и латинской буквы х или X: 0xff0a, 0xFC2D, 0x45a8, 0X77FF ; здесь строчные и прописные буквы не различаются.
Действительные константы:
с фиксированной точкой: 37.25, -128.678967, +27.035 ;
с плавающей точкой: 2.5е34, -0.345е-25, 37.2Е+4 ;
Слайд 25

Константы Символьные константы: Печатные символы можно записать в апострофах: ' а

Константы

Символьные константы:
Печатные символы можно записать в апострофах: ' а

', ' N ', ' ? ‘
Управляющие символы записываются в апострофах с обратной наклонной чертой:
' \n ' — символ перевода строки;
' \t ' — символ горизонтальной;
и др.
Код любого символа с десятичной кодировкой от 0 до 255:
' \123 ' — буква S , ' \346 ' — буква Ж в кодировке СР1251
Код любого символа в кодировке Unicode:
' \u0053 ' — буква S , ' \u0416 ' — буква Ж .
Строковые константы:
"Это строка\nс переносом"
"\"Спартак\" — Чемпион!"
" Сцепление " + "строк" дает в результате строку "Сцепление строк" .
Слайд 26

Константы Замечание :Число, начинающееся с нуля, записано в восьмеричной форме, а

Константы

Замечание :Число, начинающееся с нуля, записано в восьмеричной форме,

а не в десятичной.
Целые константы хранятся в формате типа int (см. ниже).
В конце целой константы можно записать букву прописную L или строчную l , тогда константа будет сохраняться в длинном формате типа long (см. ниже): +25L, -0371, OxffL, OXDFDF1 .
В конце действительной константы можно поставить букву F или f , тогда константа будет сохраняться в формате типа float (см. ниже): 3.5f, -45.67F, 4.7e-5f . Можно приписать и букву D (или d): 0.045D, -456.77889d , означающую тип double , но это излишне, поскольку действительные константы и так хранятся в формате типа double .
Код любого символа с десятичной кодировкой от 0 до 255 можно задать, записав его не более чем тремя цифрами в восьмеричной системе счисления в апострофах после обратной наклонной черты: ' \123 ' — буква S , ' \346 ' — буква Ж в кодировке СР1251. Не рекомендуется использовать эту форму записи для печатных и управляющих символов, перечисленных в предыдущем пункте, поскольку компилятор сразу же переведет восьмеричную запись в указанную выше форму. Наибольший код ' \377 ' — десятичное число 255.
Код любого символа в кодировке Unicode набирается в апострофах после обратной наклонной черты и латинской буквы ц ровно четырьмя шестнад-цатеричными цифрами: ' \u0053 ' — буква S , ' \u0416 ' — буква Ж .
Символы хранятся в формате типа char (см. ниже).
Примечание Прописные русские буквы в кодировке Unicode занимают диапазон от ' \u0410 ' — заглавная буква А , до ' \u042F ' — заглавная Я , строчные буквы от ' \u0430 ' — а , до ' \044F ' — я .
В какой бы форме ни записывались символы, компилятор переводит их в Unicode, включая и исходный текст программы.
Замечание .Компилятор и исполняющая система Java работают только с кодировкой Unicode.
Слайд 27

Константы Строки символов заключаются в кавычки. Управляющие символы и коды записываются

Константы

Строки символов заключаются в кавычки. Управляющие символы и коды

записываются в строках точно так же, с обратной наклонной чертой, но, разумеется, без апострофов, и оказывают то же действие. Строки могут располагаться только на одной строке исходного кода, нельзя открывающую кавычку поставить на одной строке, а закрывающую — на следующей.
Замечание. Строки символов нельзя начинать на одной строке исходного кода, а заканчивать на другой.
Для строковых констант определена операция сцеплений, обозначаемая плюсом.
Не все шрифты Unicode содержат начертания всех символов, поэтому будьте осторожны при выводе строк в кодировке Unicode.
Совет Используйте Unicode напрямую только в крайних случаях.
Слайд 28

Идентификаторы Соглашения о регистре букв в идентификаторах: Имена примитивных типов следует

Идентификаторы
Соглашения о регистре букв в идентификаторах:
Имена примитивных типов

следует писать в нижнем регистре (строчными буквами).
Например, int, float, boolean
Имена ссылочных типов следует начинать с заглавной (большой) буквы. Если имя составное, новую часть имени также начинают с заглавной буквы.
Например, Object, Float, Collection , JButton, JTextField
Для переменных и методов имена, состоящие из одного слова, следует писать в нижнем регистре. Если имя составное, новую часть имени начинают с заглавной буквы.
Например, i, j,obj1, myVar, jButton2, jTextField2.getText()
Имена констант следует писать в верхнем регистре (большими буквами), разделяя входящие в имя составные части символом подчёркивания “_”.
Например, MIN_VALUE, MAX
Слайд 29

Идентификаторы Идентификаторы - это имена переменных, классов, методов и других объектов

Идентификаторы

Идентификаторы - это имена переменных, классов, методов и других объектов

программы.
В идентификаторах можно применять только буквы и цифры, причём первой всегда должна быть буква (в том числе символы подчёркивания и доллара), а далее может идти произвольная комбинация букв и цифр. Некоторые символы национальных алфавитов рассматриваются как буквы, и их можно применять в идентификаторах. Но некоторые используются в качестве символов-разделителей, и в идентификаторах их использовать нельзя.
Замечание . Не указывайте в именах знак доллара. Компилятор Java использует его для записи имен вложенных классов.
Язык Java является регистро - чувствительным. Это значит, что идентификаторы чувствительны к тому, в каком регистре (верхнем или нижнем) набираются символы. Длина идентификатора в Java любая, по крайней мере, в пределах разумного.
Слайд 30

Примитивные и ссылочные типы данных

Примитивные и ссылочные типы данных

Слайд 31

Примитивные и ссылочные типы данных Тип данных - это конструкция языка

Примитивные и ссылочные типы данных

Тип данных - это

конструкция языка программирования, которая позволяет описать для данных:
размер занимаемой памяти,
диапазон допустимых значений,
множество разрешенных операций.
Java все типы делятся на примитивные и ссылочные.
Примитивными типами называются такие, для которых данные содержатся в одной ячейке памяти, и эта ячейка не имеет подъячеек.
Ссылочными типами называются такие, для которых в ячейке памяти (ссылочной переменной) содержатся не сами данные, а только адреса этих данных, то есть ссылки на данные. При присваивании в ссылочную переменную заносится новый адрес, а не сами данные. Но непосредственного доступа к адресу, хранящемуся в ссылочных переменных, нет. Это сделано для обеспечения безопасности работы с данными – как с точки зрения устранения непреднамеренных ошибок, характерных для работы с данными по их адресам в языках C/C++/PASCAL, так и для устранения возможности намеренного взлома информации.
Если ссылочной переменной не присвоено ссылки, в ней хранится нулевой адрес, которому дано символическое имя null. Ссылки можно присваивать друг другу, если они совместимы по типам, а также присваивать значение null. При этом из одной ссылочной переменной в другую копируется адрес. Ссылочные переменные можно сравнивать на равенство, в том числе на равенство null. При этом сравниваются не данные, а их адреса, хранящиеся в ссылочных переменных.
К примитивным типам относятся следующие предопределённые типы: целочисленные типы byte,short,int, long, char, типы данных в формате с плавающей точкой float, double, а также булевский (логический) тип boolean и типы-перечисления, объявляемые с помощью зарезервированного слова enum (сокращение от enumeration – “перечисление”). Все остальные типы Java являются ссылочными.
Ссылочные типы Java используются в объектно – ориентированном программировании. В частности, для работы со строками, файлами, элементами пользовательского интерфейса. Все пользовательские типы (задаваемые программистом) , кроме типов-перечислений, являются ссылочными.
Слайд 32

Переменные Объявление переменных int i1 = i2 = 5; // Ошибка!

Переменные
Объявление переменных
int i1 = i2 = 5; //

Ошибка! Запрещено в Java
class HelloWorld
{
public static int i;
public static double d1, d2 = 2.5;
public static void main (String args [])
{ int k = 0;
System.out.println(i);
System.out.println(d1);
System.out.println(d2);
System.out.println(k);
System.out.println(MAX);
}
}
Слайд 33

Переменные Переменная – это именованная ячейка памяти, содержимое которой может изменяться.

Переменные

Переменная – это именованная ячейка памяти, содержимое которой может изменяться.

При объявлении переменной сначала указывается тип переменной, а затем имя переменной. Указание типа позволяет компилятору задавать объём памяти, выделяемой под переменную или значение данного типа, а также допустимые правила действий с переменными и значениями этого типа.
Синтаксис объявления переменных такой же как и в С++. Объявление переменных может сопровождаться их инициализацией - присваиванием начальных значений. Присваивания вида int i1=i2=5;, характерные для C/C++, запрещены.
Объявление переменных может осуществляться либо в классе, либо в методе.
В классе их можно объявлять как без явного присваивания начального значения, так и с указанием этого значения. Если начальное значение не указано, величина инициализируется нулевым значением. Если объявляется несколько переменных одного типа, после указания имени типа разрешается перечислять несколько переменных, в том числе – с присваиванием им начальных значений.
В методе все переменные перед использованием обязательно надо инициализировать – автоматической инициализации для них не происходит. Это надо делать либо при объявлении, либо до попытки использования значения переменной в подпрограмме. Попытка использования в подпрограмме значения неинициализированной переменной приводит к ошибке во время компиляции.
Слайд 34

Примитивные типы данных и операции Логический тип: boolean a = true;

Примитивные типы данных и операции
Логический тип: boolean a =

true;
boolean b = false;
Логические операции и операции отношения
Слайд 35

Примитивные типы данных и операции Величины типа boolean принимают значения true

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

Величины типа boolean принимают значения

true или false. Логические величины обычно используются в логических выражениях. Значением логического выражения являются true или false. Для работы с логическими выражениями часто применяют так называемые таблицы истинности.
Логические выражения в Java вычисляются в соответствии с так называемым укороченным оцениванием: из приведённой выше таблицы видно, что если a имеет значение false, то значение оператора a&&b будет равно false независимо от значения b. Поэтому если b является булевским выражением, его можно не вычислять. Аналогично, если a имеет значение true, то значение оператора a||b будет равно true независимо от значения b.
Операции отношения - это операции сравнения и принадлежности. Они имеют результат типа boolean. Операции сравнения применимы к любым величинам a и b одного типа, а также к произвольным числовым величинам a и b, не обязательно имеющим один тип.
Про оператор instanceof будет рассказано в разделе, посвящённом динамической проверке типов.
Слайд 36

Примитивные типы данных и операции Целые типы Aрифметические операции: + -

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

Целые типы

Aрифметические операции: + -

/ * % ++ --
Приведение типов:
Слайд 37

Примитивные типы данных и операции Над целыми типами можно производить массу

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

Над целыми типами можно производить

массу операций. Их набор восходит к языку С, он оказался удобным и кочует из языка в язык почти без изменений.
Результат арифметической операции имеет тип int, кроме того случая, когда один из операндов типа long . В этом случае результат будет типа long .
Перед выполнением арифметической операции всегда происходит повышение типов byte , short , char . Они преобразуются в тип int , а может быть, и в тип long , если другой операнд типа long . Операнд типа int повышается до типа long , если другой операнд типа long . Конечно, числовое значение операнда при этом не меняется.
Это правило приводит иногда к неожиданным результатам. Попытка откомпилировать простую программу, представленную на слайде, приведет к сообщениям компилятора.
Эти сообщения означают, что в файле HelloWorld.java, в строке 4, обнаружена возможная потеря точности (possible loss of precision). Затем приводятся обнаруженный (found) и нужный (required) типы, выводится строка, в которой обнаружена (а не сделана) ошибка, и отмечается символ, при разборе которого найдена ошибка. Затем указано общее количество обнаруженных (а не сделанных) ошибок (1 error).
В таких случаях следует выполнить явное приведение типа. В данном случае это будет сужение типа int до типа short . Оно осуществляется операцией явного приведения, которая записывается перед приводимым значением в виде имени типа в скобках. Определение short k = (short)(b1 + b2); будет верным.
Сужение осуществляется просто отбрасыванием старших битов, что необходимо учитывать для больших значений. Например, определение byte b = (byte) 300; даст переменной b значение 44 . Действительно, в двоичном представлении числа 300 , равном 100101100 , отбрасывается старший бит и получается 00101100 .
Таким же образом можно произвести и явное расширение типа, если в этом есть необходимость.
Слайд 38

Примитивные типы данных и операции Если результат целой операции выходит за

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

Если результат целой операции выходит

за диапазон своего типа int или long , то автоматически происходит приведение по модулю, равному длине этого диапазона, и вычисления продолжаются, переполнение никак не отмечается. Замечание В языке Java нет целочисленного переполнения.
В языке Java шесть обычных операций сравнения целых чисел по величине: 
больше > ; 
меньше < ;
больше или равно >= ; 
меньше или равно <= ; 
равно == ; 
не равно != .
Результат сравнения — логическое значение: true , в результате, например, сравнения 3 != 5 ; или false , например, в результате сравнения 3 == 5 .
Для записи сложных сравнений следует привлекать логические операции. Например, в вычислениях часто приходится делать проверки вида а < х < b . Подобная запись на языке Java приведет к сообщению об ошибке, поскольку первое сравнение, а < х , даст true или false , a Java не знает, больше это, чем b , или меньше. В данном случае следует написать выражение (а < х) && (х < b) , причем здесь скобки можно опустить, написать просто а < х && х < b .
Слайд 39

Примитивные типы данных и операции Вещественные типы: Операции присваивания: Простоя операция

Примитивные типы данных и операции
Вещественные типы:
Операции присваивания:
Простоя операция присваивания:

=
Составные операции присваивания:
+= , -= , *=, /=, %=, &=, |=, ^=, <<=, >>=
Схема действия составных операций присваивания:
х ор= а эквивалентно х = (тип х)(х ор а).
short ind =1; ind +=7.8; // получим 8
ind = (short)(ind + 7.8); // получим 8
Слайд 40

Примитивные типы данных и операции К вещественным типам применимы все арифметические

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

К вещественным типам применимы все

арифметические операции и сравнения, перечисленные для целых типов.
Знатокам C/C++: В языке Java взятие остатка от деления %, инкремент ++ и декремент — применяются и к вещественным типам.
Поскольку к вещественным типам применимы все арифметические операции и сравнения, целые и вещественные значения можно смешивать в операциях. При этом правило приведения типов дополняется такими условиями:
если в операции один операнд имеет тип double, то и другой приводится к типу double;
если один операнд имеет тип float, то и другой приводится к типу float; 
в противном случае действует правило приведения целых значений.
Операция присваивания действует так: выражение, стоящее после знака равенства, вычисляется и приводится к типу переменной, стоящей слева от знака равенства. Результатом операции будет приведенное значение правой части.
Слайд 41

Выражения Правила вычисления выражений: Операции одного приоритета вычисляются слева направо: х

Выражения
Правила вычисления выражений:
Операции одного приоритета вычисляются слева направо: х

+ у + z вычисляется как (х + у) + z. Исключение: операции присваивания вычисляются справа налево: х = у = z вычисляется как х = (у = z).
Левый операнд вычисляется раньше правого.
Операнды полностью вычисляются перед выполнением операции.
Перед выполнением составной операции присваивания значение левой части сохраняется для использования в правой части.
int а = 3, b = 5;
b + (b = 3) // результат 8
(b = 3) + b // результат 6
b += (b = 3) // результат 8
Слайд 42

Выражения Из констант и переменных, операций над ними, вызовов методов и

Выражения

Из констант и переменных, операций над ними, вызовов методов

и скобок составляются выражения. Разумеется, все элементы выражения должны быть совместимы, нельзя написать, например, 2 + true.
Порядок вычисления выражения всегда можно отрегулировать скобками.
Слайд 43

Выражения Приоритет операций (в порядке убывания): 1.Постфиксные операции ++ и —.

Выражения

Приоритет операций (в порядке убывания):
1.Постфиксные операции ++ и —.


2. Префиксные операции ++ и —, дополнение ~ и отрицание !.
3. Приведение типа (тип).
4. Умножение *, деление / и взятие остатка %.
5. Сложение + и вычитание -.
6. Сдвиги <<, >>, >>>.
7. Сравнения >, <, >=, <=.
8. Сравнения ==, !=.
9. Побитовая конъюнкция &.
10. Побитовое исключающее ИЛИ ^.
11. Побитовая дизъюнкция | .
12. Конъюнкция &&.
13. Дизъюнкция | | .
14. Условная операция ?: .
15. Присваивания =, +=, -=, *=, /=, %=, &=, ^=, |=, <<, >>, >>>.
Слайд 44

Консольный ввод-вывод Потоковые объекты: System.in – объект класса InputStream; System.out –

Консольный ввод-вывод
Потоковые объекты:
System.in – объект класса InputStream;
System.out – объект

класса OutputStream;
Вывод данных: метод System.out.println( );
System.out.println("Hello World"); // вывод строки
System.out.println(245); // вывод числовой константы
// Вывод строковой или численной переменной
int var = 245; String text = "Hello World";
System.out.println(text); System.out.println(var);
// Вывод произвольного сочетания переменных и констант
System.out.println("Hello" + "number = " + var);
// Вывод вещ. чисел с ограничением числа знаков после запятой
double f = 2.567432;
NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(2);
System.out.println(nf.format(f));
Слайд 45

Консольный ввод-вывод В языке Java для поддержки консольного ввода-вывода имеются три

Консольный ввод-вывод

В языке Java для поддержки консольного ввода-вывода имеются три

встроенных потоковых объекта System.in, System.out и System.err, которые можно использовать в программе, не создавая собственных потоков.
Поток System.in является встроенным объектом подкласса InputStream и предназначен для ввода информации с клавиатуры. Поток System.out является объектом подкласса OutputStream и позволяет выводить информацию на монитор. Поток System.err – поток для вывода сообщений об ошибках на монитор.
Вывод данных в консольном приложении выполняется с помощью метода System.out.println( ) . Данный метод достаточно удобен и позволяет выводить константы и переменные в самых различных сочетаниях.
Наряду с методом println( ) существует также очень похожий метод print( ). Единственное его отличие заключается в том, что он не осуществляет перевода строки, то есть с его помощью можно выводить несколько значений в одну строку.
Для ограничение числа знаков после запятой при выводе вещественных чисел необходимо создать обьект класса NumberFormat и вызвать его метод setMaximumFractionDigits(), с помощью которого можно указать, сколько следует выводить знаков после запятой. Класс NumberFormat входит в состав пакета java.text.
В метод println() передается результат форматирования переменных с помощью метода format() класса NmberFomat.
Слайд 46

Консольный ввод-вывод Ввод данных с клавиатуры: // установить связь с вводимыми

Консольный ввод-вывод
Ввод данных с клавиатуры:
// установить связь

с вводимыми с клавиатуры данными
import java.io.*

BufferedReader bReader = new BufferedReader (new InputStreamReader(System.in));
// ввод строки данных
String cStr; cStr = bReader.readLine();
// преобразование строки данных
int iNum = Integer.parseInt(cStr); float fNum = Float.parseFloat(cStr); double dNum = Double.parseDouble(cStr);
Слайд 47

Консольный ввод-вывод К сожалению, при вводе чисел или знаков в программу

Консольный ввод-вывод

К сожалению, при вводе чисел или знаков в программу

для их обработки, все выглядит немного сложнее. Здесь необходимы специальные классы и механизмы пакета java.io, который в этой теме не будет рассматриваться подробно, так как о нем пойдет речь в следующих темах.
Считывание вводимых с клавиатуры данных производится в программе на Java в два этапа:
установить связь с вводимыми с клавиатуры данными;
преобразовать вводимые пользователем знаки в данные соответствующего типа.
Для того, чтобы установить связь с вводимыми с клавиатуры данными используются три различных класса (BufferedReader, InputStreamRreader, System.in), которые взаимодействуют между собой и возвращают значение в переменную bReader.
Так как мы используем класс BufferedReader из пакета java.io, то необходимо в самом начале программы обеспечить импорт этого пакета с помощью инструкции import java.io.*.
Переменная bReader имеет тип класса BufferedReader, из которого мы используем только метод readLine( ), необходимый для получения введенной пользователем с клавиатуры строки.
Преобразование строки, которая содержит некое число, в соответствующее численное значение производится с помощью специальных методов, которые существуют для каждого элементарного типа данных. Необходимым условием при вызове данных методов является то, что строка cStr должна соответствовать подразумеваемому виду. Если метод получает строку ”Hello”, то при всем своем желании компилятор не сможет преобразовать ее в число!
Слайд 48

Консольный ввод-вывод Класс Scanner: import java.util.Scanner; // импортируем класс public class

Консольный ввод-вывод
Класс Scanner:
import java.util.Scanner; // импортируем класс
public class

Main
{ public static void main(String[] args)
{ Scanner sc = new Scanner(System.in); // создаём объект
// класса Scanner   int i = 2;   System.out.print("Введите целое число: ");   if(sc.hasNextInt())
{ // возвращает истинну если с потока ввода можно
// считать целое число    i = sc.nextInt(); // считывает целое число с потока
// ввода и сохраняем в переменную    System.out.println(i*2);   } else {   System.out.println("Вы ввели не целое число");   }   } }
Слайд 49

Консольный ввод-вывод Класс Scanner: import java.util.Scanner; // импортируем класс public class

Консольный ввод-вывод
Класс Scanner:
import java.util.Scanner; // импортируем класс
public class

Main
{ public static void main(String[] args)
{ Scanner sc = new Scanner(System.in); // создаём объект
// класса Scanner    
double  i = sc.nextDouble(); // если ввести букву s, то
// случится ошибка во время
// выполнения программы   System.out.println(i/3);    } }
Слайд 50

Консольный ввод-вывод Для ввода данных можно использовать класс Scanner из библиотеки

Консольный ввод-вывод

Для ввода данных можно использовать класс Scanner из библиотеки

пакетов Java (java.util). Этот класс надо подключить в программе, где он будет использоваться с помощью команды import (import java.util.Scanner).
В классе есть методы для чтения очередного символа заданного типа со стандартного потока ввода, а также для проверки существования такого символа.
Для работы с потоком ввода необходимо создать объект класса Scanner, при создании указав, с каким потоком ввода он будет связан (см. пример на слайде). Стандартный поток ввода (клавиатура) в Java представлен объектом — System.in. А стандартный поток вывода (дисплей) — уже знакомым вам объектом System.out. Есть ещё стандартный поток для вывода ошибок — System.err.
Метод hasNextDouble(), применённый объекту класса Scanner, проверяет, можно ли считать с потока ввода вещественное число типа double, а метод nextDouble() — считывает его. Если попытаться считать значение без предварительной проверки, то во время исполнения программы можно получить ошибку (отладчик заранее такую ошибку не обнаружит). Например, попробуйте в представленной на слайде программе ввести не какое-то вещественное число, а букву.
 С помощью класса java.util.Scanner можно считывать различного типа данные из файлов (см. пример на следующем слайде).
Слайд 51

Ввод данных из файла Класс Scanner: import java.io.File; import java.io.FileNotFoundException; import

Ввод данных из файла
Класс Scanner:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class

ReadFileByScanner
{ public ReadFileByScanner()
{ // Загружаем созданный текстовый файл
File file = new File("testfile.txt");
try {
// Объявляем класс Scanner, инициализируем его с
// параметром file
// Создаем цикл, который будет считывать строки,
// пока не дойдем до конца файла.
Scanner scanner = new Scanner(file);
Слайд 52

Ввод данных из файла Класс Scanner: while (scanner.hasNextLine()) { if (scanner.hasNextInt())

Ввод данных из файла

Класс Scanner:
while (scanner.hasNextLine())
{ if (scanner.hasNextInt())

{ int i = scanner.nextInt();
System.out.println("Тип Integer: " + i);
} else if (scanner.hasNextDouble())
{ double d = scanner.nextDouble();
System.out.println("Тип double: " + d);
} else if (scanner.hasNextBoolean())
{ Boolean b = scanner.nextBoolean();
System.out.println("Тип boolean: " + b);
} else
{ System.out.println("String: " + scanner.next());}
}
} catch (FileNotFoundException e) { e.printStackTrace(); }
}
public static void main(String[] args)
{ new ReadFileByScanner();}
}