Skip to content

Latest commit

 

History

History
514 lines (388 loc) · 28.5 KB

File metadata and controls

514 lines (388 loc) · 28.5 KB

Занятие 1. Знакомство с Java

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

  • Один из наиболее популярных языков в мире по индексам RedMonk, TIOBE
  • Длительная история развития с 1991
  • Платформонезависимость (Виртуальная машина Java VM)
  • Объектно-ориентированная парадигма
  • Статическая типизация
  • Автоматическая сборка мусора

Инструментальные средства разработки на Java

Платформа разработки JDK

Java Development Kit (JDK) — комплект инструментальных средств для разработки приложений на языке Java. Включает компилятор javac, утилиты, библиотеки классов Java API, документацию и примеры, среду исполнения приложений — Java Runtime Environment (JRE).

JRE включает виртуальную машину Java Virtual Machine (JVM) и cкомпилированные библиотеки классов Java API. Позволяет запускать Java приложения на любых устройствах или операционных системах.

Существует три редакции JDK:

  • SE (Standard Edition) — стандартная редакция JDK, которая используется для разработки консольных и настольных приложений.
  • EE (Enterprise Edition) — редакция для разработки распределенных приложений масштаба предприятий.
  • ME (Micro Edition) — редакция для разработки приложений мобильных устройств и встраиваемых систем.

Интегрированная среда разработки

Интегрированная среда разработки (англ. Integrated Development Environment (IDE) — комплекс программных средств, используемый программистами для разработки программного обеспечения (ПО), в том числе, текстовый редактор, средства автоматизации сборки, отладчик.

Существует несколько популярных IDE для разработки Java приложений:

Что будем использовать?

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

Работа с IDE

Создание проекта

Запустить «IntelliJ IDEA». Если открыт приветственный экран «Welcome to IntelliJ IDEA», нажать кнопку «New Project». Если открыто основное окно, выбрать пункт меню «File | New | Project».

Снимок экрана: создание нового проекта

Выбрать пункт «New Project» из списка слева. Задать имя нового проекта «Name» и изменить его месторасположение «Location», если необходимо. В списке «Languages» должен быть выбран язык «Java». В списке «JDK» должна быть выбрана JDK версии 8 или выше.

Создание пакета и класса

В окне «Project» щелкнуть правой кнопкой мыши папку «src», выбрать пункт «New | Java Class» (Alt+Insert).

Снимок экрана: создание нового класса

Задать полное имя класса следующим образом: «ru.isu.math.example.MyMainClass» и нажать кнопку «OK». В результате будет создан пакет «ru.isu.math.example» и класс «MyMainClass» внутри этого пакета.

package ru.isu.math.example;  

public class MyMainClass {  
}

Первая программа

Добавить в созданный класс main-метод с необходимыми инструкциями.

package ru.isu.math.example;  

public class MyMainClass {  
    public static void main(String[] args) {  
        System.out.println("Hello World!");  
    }  
}

Сборка и запуск приложения

Выбрать пункт меню «Run | Run…» или нажать кнопку «Run» на панели инструментов сверху — «зеленый треугольник» (Alt+Shift+F10). В раскрывшемся списке выбрать «MyMainClass».

Запустится компиляция исходного кода программы в байт-код и затем исполнение приложения в JVM. Результат выполнения программы, сообщение «Hello World!», будет выводиться во встроенной командной строке.

Снимок экрана: проект (слева) и редактируемый класс (справа)

Устройство программы

Файл .java

Файл с расширением .java — это обычный текстовый файл, в котором хранится исходный код (текст) одного или нескольких классов.

Класс

Класс — это шаблон (форма), на основе которого создаются объекты.

Класс состоит из объявления и тела:

class MyClass // Объявление класса
{
    // Тело класса
}

Объект — это конкретная сущность в памяти компьютера, созданная на основе шаблона, которое предоставляет класс. Объект обладает: состоянием — данными, поведением — действиями, которые он может выполнять, и идентичностью — уникальным адресом в памяти.

Класс верхнего уровня

Класс верхнего уровня — это класс, который не является вложенным, то есть он не определен внутри другого класса. Он находится непосредственно на верхнем уровне исходного кода файла .java.

// Класс верхнего уровня
class MyTopLevelClass { 
	//...
	// Вложенный класс
	class MyInnerClass { // Вложенный класс
		//...
	}
}

Публичный класс

Публичный класс — это класс, объявленный с модификатором доступа public.

// Публичный класс
public class MyPublicClass {
	//...
}

Публичный класс верхнего уровня доступен для любых других классов.

В файле .java может быть только один публичный класс верхнего уровня.

Имя файла .java должно полностью совпадать с именем такого публичного класса верхнего уровня. Например, файл .java, содержащий публичный класс верхнего уровня с именем MyPublicClass должен назваться MyPublicClass.java. При компиляции файла MyPublicClass.java компилятор создает файл с байт-кодом с именем MyPublicClass.class.

Main-класс

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

public class MyMainClass {
    // Main-метод
    public static void main(String[] args) {
        // Инструкции
    }
}

Main-метод

Main-метод — это специальный статический метод, который виртуальная машина JVM вызывает при запуске Java-приложения.

Сигнатура этого метода строго определена:

// Main-метод всегда имеет имя main и единственный параметр типа String[]
public static void main(String[] args) {
    // инструкции
}

Особенности именования классов

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

  • Примеры корректного именования классов: Car, BankAccount, HttpRequestHandler
  • Примеры некорректного именования классов:* car, bank_account, httpRequestHandler

Имена классов почти всегда являются существительными или существительными с определениями.

Пакет

Пакет — это механизм для объединения связанных классов в единое пространство имен. Физически пакет представлен каталогом (директорией), внутри которого лежат, содержащего файлы классов.

В самом верху исходного файла .java может быть включено ключевое слово package, после которого следует идентификатор, задающий имя пакета, например:

package ru.isu.math.example;  

Физически такой пакет будет представлен следующей структурой папок:

ru/isu/math/example;

Файл .java с инструкцией package ru.isu.math.example

package ru.isu.math.example;

public class MyMainClass {
    // ...
}

должен быть размещен в каталоге, соответствующем этому пакету, т. е.

ru/isu/math/example/MyMainClass.java;

Импорт классов

Чтобы использовать классы других пакетов необходимо их импортировать с помощью инструкций import.

package ru.isu.math.example;

import java.util.Scanner; // Импортировать класс Scanner из пакета java.util
import java.io.*; // Импортировать все классы пакета java.io

public class MyMainClass {
    // ...
}

Инструкции и блоки кода

Инструкция кода — команда для выполнения в Java VM. Инструкция заканчивается точкой с запятой ;.

// Объявить и инициализировать переменную целочисленного типа
int x = 1;

Блок кода — набор инструкций, заключенный в пару симметричных фигурных скобок.

{  
    int x = 1;
    x = x + 2;  
}

Вывод текста в командную строку

Вывод текста в командную строку осуществляется через встроенный поток вывода:

public class MyMainClass {
    // main-метод  
    public static void main(String[] args) {  
        // Вывести сообщение "my text" в командную строку
        System.out.println("my text");  
    }  
}

Локальные переменные

Локальная переменная — это переменная, объявленная внутри блока кода. Область видимости такой переменной ограничена блоком кода, в котором она объявлена.

public static void main(String[] args) {  
    int x; // Объявить локальную переменную
    x = 1; // Присвоить значение локальной переменной
    System.out.println("x = " + x); // Вывести значение переменной
}

При объявлении переменной необходимо указать ее тип данных. Например, если переменная имеет тип int, то в качестве своих значений она может принимать только целые числа:

int x = 2;

Переменная, объявленная с типом double, содержит только вещественные числа:

double y = 2.5;

Переменная с типом String, будет ссылаться на строки

String s = "my text";

Условие if

Блок кода, следующий за условной инструкцией if, выполняется только если ее аргумент типа boolean имеет значение true.

boolean condition = true;
if (condition) {
   System.out.println("The condition is true");
}

Условная инструкция if-else.

char c = '0';
if (Character.isDigit(c))
    System.out.println("цифра");
else
    System.out.println("не цифра");

Многоступенчатая инструкция if-else-if.

double x = 0.1;

if (x < 0.5) {
    System.out.println("x меньше 0.5");
}
else if (x < 0.75) {
    System.out.println("x меньше 0.75");
}
else if (x < 1.0) {
    System.out.println("x меньше 1.0");
} else {
    System.out.println("x больше или равен 1.0");
}

Цикл for

Цикл — управляющая инструкция, которая определяет выполнение сопряженного блока кода (тела цикла) множество раз.

Цикл for имеет следующий синтаксис:

for (инициализация счетчика; условие завершения; итерация) блок кода

Например, следующий цикл выполняет инструкции тела десять раз:

for (int i = 0; i < 10; i++) {  
    System.out.println("i = " + i);  
}

Аргументы командной строки

Аргументы командной строки передаются приложению в виде единственного параметра main-метода — массива строк:

public class MyMainClass {  
    public static void main(String[] args) {
        // Вывести аргументы командной строки
        for (int i = 0; i < args.length; i++) {
            String arg = args[i];
            System.out.printf("Argument %d: %s%n", i, arg);
        }
    }
}

При запуске приложения из командной строки аргументы указываются после имени main-класса:

java ru.isu.math.example.MyMainClass p0 p1 p2

Для того чтобы задать аргументы командной строки в IDE, необходимо создать новую конфигурацию запуска следующим образом: выбрать пункт меню «Run | Edit Configurations…», добавить новую конфигурацию, выбрав в списке слева пункт «Application», задать имя при необходимости, указать main-класс, ввести значения аргументов в поле «Program Arguments», нажать кнопку «OK».

Снимок экрана: создание конфигурации запуска приложения

Затем запустить программу с помощью созданной конфигурации, выбрав ее по имени в выпадающем списке слева от кнопки запуска «Run».

Снимок экрана: результат запуска приложения

Ввод данных из командной строки

Чтобы считать данные из командной строки можно использовать объект типа Scanner, например:

package ru.isu.math.example;

import java.util.Scanner; // Импортировать класс Scanner

public class MyMainClass {
    public static void main(String[] args) {
        // Создать сканер для чтения данных из командной строки
        Scanner scanner = new Scanner(System.in);
        System.out.println("Введите число");
        // Считать вещественное число
        double x = scanner.nextDouble();
        System.out.println("Вы ввели число: " + x);
    }
}

При запуске программы из IDE, данные вводятся во встроенной командной сроке IDE.

Снимок экрана: ввод данных в эмуляторе командной строки IDE

Генерация случайных чисел

Для генерации случайных чисел можно использовать класс Math, например:

double x = Math.random(); // Сгенерировать число между 0 и 1.0

Также можно воспользоваться объектом типа Random, например:

package ru.isu.math.example;

import java.util.Random; // Импортировать класс Random

public class MyMainClass {
    public static void main(String[] args) {
        // Создать генератор случайных чисел
        Random rand = new Random(); 
        // Сгенерировать случайное число в диапозоне от 0 до 49, включительно
        int n = rand.nextInt(50);
    }
}

Компиляция и запуск из командной строки

Чтобы вам было проще работать с командной строкой настройте переменную среды JAVA_HOME

Для того чтобы откомпилировать класс из командной строки, необходимо перейти в директорию, в которой находится файл с исходным кодом:

cd <path to the scr directory>

запустить компилятор javac, указав в качестве параметра название файла с исходным кодом с расширением:

javac -d target ru/isu/math/example/MyMainClass.java

В результате компилятор создаст файл с байт-кодом с тем же именем класса, но расширением «class» — «MyMainClass.class» в папке «target/ru/isu/math/example».

Для того чтобы исполнить откомпилированный класс необходимо перейти в директорию, в которой находится файл с байт-кодом:

cd <path to the target directory>

и запустить Java VM, указав в качестве параметра название файла с байт-кодом без расширения:

java ru.isu.math.example.MyMainClass

Когда переменная среды JAVA_HOME не настроена, следует указывать полный путь к компилятору javac и виртуальной машине java соответственно:

<path to JDK>/bin/javac -d target ru/isu/math/example/MyMainClass.java
<path to JDK>/bin/java ru.isu.math.example.MyMainClass

Дизассемблирование байт-кода

Для того чтобы дизассемблировать откомпилированный класс необходимо перейти в директорию, в которой находится файл с байт-кодом:

cd <path to the target directory>

запустить дизассемблер javap, указав в качестве параметра название файла с байт-кодом:

javap -c ru/isu/math/example/MyMainClass.class

Когда переменная среды JAVA_HOME не настроена, следует указывать полный путь к дизассемблеру javap:

<path to JDK>/bin/javap -c ru/isu/math/example/MyMainClass.class

Результат дизассемблирования байт-кода выводится в командную строку.

Снимок экрана: результат дизассемблирования байт-кода

Сборка и запуск JAR-файла

JAR (Java Archive) — это способ упаковки и распространения Java-приложений и библиотек в виде ZIP-архива.

JAR-файл — это файл с расширением .jar, в который упакованы:

  • Все скомпилированные классы проекта, организованные по своим пакетам;
  • Файлы ресурсов (*.properties, *.xml, изображения и пр.);
  • Метаинформация в папке META-INF, включая файл — MANIFEST.MF;
  • Опционально другие JAR-файлы.

Исполняемый JAR-файл — это специальным образом сконфигурированный JAR-файл, который можно запустить на исполнение, не указывая вручную Main-класс.

Чтобы JAR-файл стал исполняемым, в манифесте META-INF/MANIFEST.MF должен быть указан Main-класс с помощью атрибута Main-Class.

Manifest-Version: 1.0
Main-Class: ru.isu.math.example.MyMainClass  # JAR-файл будет запускаться при наличии скомпилированного Main-класса: ru/isu/math/example/MyMainClass.class

Задания

Задание 1-1 — 1 балл

  • Разработать консольное приложение, которое позволяет пользователю конвертировать значения между различными единицами измерения длинны, веса, времени, площади или др.
  • Реализовать перевод по крайней мере пяти единиц измерений.
  • Реализовать пользовательский ввод значений и выбор единиц измерений.

Задание 1-2 — 1 балл

  • Разработать консольную игру "Угадай число". Игровое приложение загадывает целое число в заданном диапазоне, а пользователь пытается его угадать. Игровое приложение дает подсказки: "больше" или "меньше".
  • Реализовать случайную генерацию загадываемого числа.
  • Реализовать пользовательский ввод диапазона загадываемых чисел.

Задание 1-3 — 1 балл

  • Разработать продвинутый вариант консольной игры "Угадай число", добавив выбор уровня сложности, от которого зависит количество попыток отгадать число.
  • Реализовать ограничение числа попыток через аргументы командной строки.
  • Реализовать возможность начать игру заново.
  • Скомпилировать Java программу в командной строке с помощью команды javac.
  • Запустить Java программу в командной строке с помощью команды java.
  • Дизассемблировать Java программу (байт код) с помощью команды javap.
  • Собрать и запустить игру в виде JAR-файла.

Что необходимо знать при сдаче заданий

  1. Какими особенностями обладает язык программирования Java?
  2. Что такое платформа разработки JDK?
  3. Что такое платформа исполнения JRE?
  4. Что такое байт-код?
  5. Что такое виртуальная машина JVM?
  6. В каком пакете находится ваш файл с исходным кодом?
  7. Какие классы были импортированы вами?
  8. Как устроен ваш Main-класс?
  9. Как устроен ваш Main-метод?
  10. Как принято именовать классы?
  11. Какие локальные переменные вы объявили?
  12. Как вы инициализировали ваши локальные переменные?
  13. Какие блоки кода есть в вашем исходном коде?
  14. Какие ветвления возможны в процессе исполнения вашей программы?
  15. Какие блоки вашего исходного кода выполняются повторно?
  16. Как вы считываете данные с командной строки?
  17. Как вы выводите текстовые сообщения в командной строке?
  18. Как вы используете аргументы командной строки?
  19. Как вы генерируете случайное число?
  20. Как устроен исполняемый JAR-файл?

Дополнительные ресурсы