Skip to content

Latest commit

 

History

History
480 lines (363 loc) · 27.1 KB

lab1.md

File metadata and controls

480 lines (363 loc) · 27.1 KB

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

Методические указания

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

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

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

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

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

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

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

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

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

Main-класс

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

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

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

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

Создание, сборка и запуск проекта

Создать новый проект

Запустить «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».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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";

Цикл 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».

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

Евклидово расстояние между заданными точками

Для двух точек двухмерного пространства

p_1=\left(x_1,y_1\right) и p_2=\left(x_2,y_2\right)

евклидово расстояние вычисляется следующим:

d\left( p1,p2 \right)=\sqrt[]{\left( x_1 - x_2 \right)^{2}+\left( y_1 - y_2 \right)^{2}}

Для реализации этой формулы в Java можно использовать класс Math (является частью Java API) который обеспечивает основные метаматематические операции над числами, например:

double x = 4;  
Math.pow(x, 2); // Возведение x в степень 2
Math.sqrt(x); // Квадратный корень из x

Вышеприведенная формула может быть реализована следующим образом:

double d = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));

Другой способ реализации вычисления евклидова расстояния в Java состоит в том, чтобы воспользоваться готовым методом, поставляемом в составе сторонней библиотеки, например Apache Commons Math.

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

Создать новый проект

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

В качестве системы сборки «Build system» выбрать «Maven». Изменить имя проекта «Name» и месторасположение его файлов «Location» при необходимости, а также «GroupId» и «ArtifactId» в скрытой панели «Advanced Settings».

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

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

Добавить пакет и класс с исходным кодом в папку «src/main/java». Раскрыть панель «Maven» справа, затем дважды щелкнуть пункт «install» в списке «Lifecycle». Запустится процесс сборки проекта. На панели «Run» внизу можно увидеть сообщение об успешном выполнении сборки «[INFO] BUILD SUCCESS». На панели «Project» (слева) можно увидеть результаты сборки — JAR файлы, раскрыв папку target.

Снимок экрана: сборка Maven проекта

Добавить зависимость и импортировать класс

Открыть файл pom.xml, выбрав его на панели структуры проекта «Project». Добавить пару тегов <dependencies></dependencies> в конце перед закрывающимся тегом следующим образом:

<?xml version ="1.0" encoding="UTF-8"?>  
<project ...>  
...  
<dependencies>  
</dependencies>  
</project>

Добавить координаты зависимости от библиотеки Apache Commons Math в раздел dependencies следующим образом:

<?xml version="1.0" encoding="UTF-8"?>  
<project ...>  
...
<dependencies>  
<dependency>  
<groupId>org.apache.commons</groupId>  
<artifactId>commons-math3</artifactId>  
<version>3.6.1</version>  
</dependency>  
</dependencies>  
</project>

Актуальные координаты зависимости можно найти на веб-сайте mvnrepository.com.

После добавления зависимости, пакеты и классы библиотеки Apache Commons Math становятся доступными для импорта в разрабатываемые классы. Например, для того чтобы использовать готовую реализацию вычисления Евклидового пространства следует импортировать класс из данной библиотеки org.apache.commons.math3.ml.distance.EuclideanDistance как показано ниже:

package ru.isu.math.example;

import org.apache.commons.math3.ml.distance.EuclideanDistance;

public class MyMainClass {
    public static void main(String[] args) {
        EuclideanDistance ed = new EuclideanDistance();
        double d = ed.compute(new double[]{10,20},new double[]{30.,40.});
        System.out.println("Euclidean distance: " + d);
    }
}

Собрать запускаемый JAR файл

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

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <archive>
              <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>ru.isu.math.example.MyMainClass</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Обновить Maven проект, нажав кнопку «Reload All Maven Projects», удалить предыдущую сборку — «clean» в списке «Lifecycle» и запустить новую сборку — «install» в списке «Lifecycle».

В случае ошибки сборки «Source option 5 is no longer supported. Use 6 or later» добавьте в pom.xml версию Java в секции "properties", например, для Java 8, это будет выглядеть следующим образом:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

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

Создать новый проект

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

В качестве системы сборки «Build system» выбрать «Gradle». Изменить имя проекта «Name» и месторасположение его файлов «Location» при необходимости, а также «GroupId» и «ArtifactId» в скрытой панели «Advanced Settings».

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

Добавить пакет и класс с исходным кодом в папку src/main/java. Раскрыть панель «Gradle» справа, затем дважды щелкнуть пункт «build» в списке «Tasks | build». Запустится процесс сборки проекта. На панели «Run» внизу можно увидеть сообщение об успешном выполнении сборки «BUILD SUCCESSFUL». На панели «Project» (слева) можно увидеть результаты сборки — JAR файлы, раскрыв папку build/libs.

Снимок экрана: сборка Gradle проекта

Добавить зависимость и импортировать класс

Открыть файл build.gradle, выбрав его на панели структуры проекта «Project». Добавить строку с координатами зависимости от библиотеки Apache Commons Math:

implementation group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1'

в раздел «dependencies» следующим образом:

plugins {
  id 'java'
}
group 'ru.isu.math'
version '1.0-SNAPSHOT'
repositories {
  mavenCentral()
}
dependencies {
  testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
  testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
  implementation group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1'
}
test {
  useJUnitPlatform()
}

Актуальные координаты зависимости можно найти на веб-сайте mvnrepository.com.

После этого можно импортировать пакеты и классы из библиотеки Apache Commons Math в разрабатываемые классы.

Собрать запускаемый JAR файл

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

jar {
  manifest {
    attributes "Main-Class": "ru.isu.math.example.MyMainClass"
  }
  from {
    configurations.runtimeClasspath.collect {it.isDirectory() ? it: zipTree(it)}
  }
}

Обновить Gradle проект, нажав кнопку «Reload All Gradle Projects», удалить предыдущую сборку — «clean» в списке «Tasks | build» и запустить новую сборку — «build» в списке «Tasks | build».

Запуск JAR файла в командной строке

Необходимо перейти в папку с запускаемым JAR файлом.

cd <path to jar directory>

Запустить Java VM с флагом -jar, после которого указать имя JARфайла, например:

java -jar MyProject.jar

Командная строка отобразит результаты выполнения JAR файла.

Задание

Часть I

  • Разработать Java программу: вычислить евклидово расстояние между заданными точками.
  • Создать, собрать и запустить Java проект в IDE.

Часть II

  • Скомпилировать Java программу (исходный код) в командной строке.
  • Запустить файл Java программу (байт код) в командной строке.
  • Считать параметры командной строки (некоторые точки евклидова пространства)
  • Дизассемблировать Java программу (байт код)

Часть III

  • Создать, собрать и запустить Maven проект с зависимостью «Apache Commons Math»
  • Создать, собрать и запустить Gradle проект с зависимостью «Apache Commons Math»

Вопросы

  1. Платформа разработки JDK
  2. Платформа исполнения JRE
  3. Интерпретация байт-кода (Just-in-Time компиляция)
  4. Main-метод и main-класс
  5. Литералы
  6. Идентификаторы
  7. Локальные переменные
  8. Блоки кода
  9. Сборка мусора
  10. Управляющие инструкции

Ресурсы