Простейшая программа на Java

Простейшая программа на языке программирования Java выглядит примерно так:

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

Это программа, после того как будет запущена, просто выведет указанную строку «Hello world» на экран. Получается, что для вывода одной строки пришлось написать целых пять (к тому же, пока не совсем непонятных). Но когда вы научитесь создавать более полезные программы, решение станут более лаконичным по отношению к результату (например, когда программа не более чем из 20 строк сможет менее, чем за минуту, обработать для вас нужным образом сто страниц текста).

Разберёмся, из чего состоит простейшая программа. Первая строка — создаёт класс с именем Main. Любая программа на Java обязательно содержит один или более классов. Даже если в программе не создаются объекты, класс в ней существовать обязан.

Перед командой, которая начинает класс с указанным именем Main помещено слово public. Оно указывает на то, что данный (и пока единственный) класс в нашей программе будет доступен любым другим частям нашей программы и даже другим программам. В частности, запуск программы будет начинаться именно с этого класса.

Чтобы запуск был возможен, необходимо сохранить программу в файле с именем Main.class (т.е. имя файла определяется именем класса с уровнем доступа public).

Строка заканчивается открывающей фигурной скобкой. От неё и до соответствующей ей закрывающей скобки и будет продолжаться класс. Фигурные скобки называются операторами блока и, для удобства восприятия, внутренности каждого блока смещают вправо с помощью клавиши Tab или добавляя несколько пробелов (обычно два). Благодаря такому структурированию кода легко определить, где начинается и заканчивается каждый блок, а также избавиться от путаницы с вложенными блоками.

Соответственно, последняя строка с закрывающей фигурной скобкой заканчивает блок класса Main. Для удобства регион программы от начала и до конца блока называют телом. В данном случае 2, 3 и 4 строки составляют тело класса Main.

На второй строке внутри класса объявляется метод с названием main.

Имена (или идентификаторы) в Java чувствительны к регистру, поэтому имя класса Main и имя метода main с точки зрения языка — различны. Класс мы могли бы назвать и по-другому, но в любом исполняемом классе обязан существовать метод с именем main. После запуска программы на исполнение Java-машина будет искать в классе метод с именем main и передаст ему управление. Если там такого метода не найдётся, то и выполнять будет нечего (программа не запустится).

Методы предназначены для того, чтобы с их помощью объекты могли взаимодействовать друг с другом. Но объектов в простейшей программе не создаётся и поэтому метод нужен такой, чтобы использовать его можно было без объектов. Такие методы называются статическими, и при их создании до имени указывается модификатор static.

Модификатор public перед методом тоже связан с уровнем доступа и позволяет создать метод, доступный из любой части программы (например, из других классов или для вызывающей его виртуальной машины Java).

Наконец, модификатор void означает, что создаваемый метод не будет по итогам своей работы возвращать какой-то конкретный результат (например, какое-то число). Но бывают методы возвращающие результат — они похоже на математически функции — им передаётся некоторый аргумент или набор аргументов, а методы возвращают для каждого набора аргументов соответствующее значение.

Информация о том, какие аргументы сможет принимать метод в качестве параметра — указывается после его имени в круглых скобках. В данном случае, метода main предусмотрен один аргумент с именем args — т.е. внутри метода к этому аргументу можно будет обращаться, и работать с тем значением, которые в аргумент передавалось при вызове метода. String[] — это тип аргумента, в данном случае — массив (или набор) текстовых строк. Что это за строки и зачем предусмотрен такой аргумент даже в простейшей программе?

Это параметры командной строки. Например, команду для просмотра содержимого директории можно запустить так:

ls

Выведется содержание текущей директории. Но можно запустить с аргументами:

ls -h /var

И тогда выведется содержание директории /var, при этом размер файлов будет указан в килобайтах, мегабайтах и пр. Создаваемые на Java программы также, как и команда ls, могут получать аргументы командной строки из массива args и, в зависимости от них, работать по-разному.

Соответственно, в конце второй строки и на четвертой строке начинается и заканчивается блок метода main.

На третьей строке мы пользуемся готовым методом System.out.println(Hello world). Мы не создаём его, а вызываем (используем), передав ему аргумент Hello world, чтобы тот был выведен на экран. Метод System.out.println создан заранее разработчиками языка (как и огромный набор других готовых методов), чтобы остальные программисты могли его с лёгкостью использовать для такой типичной задачи, как вывод на экран. Но где-то в недрах библиотеки Java он был также описан с модификаторами, параметрами и телом из многих строк.

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

Создание, сохранение, компиляция в байт-код и запуск программы

В чём работать с исходным кодом программы на Java — принципиальной разницы нет (хотя, разумеется, специализированные инструменты создают дополнительные удобства). Но для начала можно обойтись простейшим текстовым редактором. Важно, чтобы редактор сохранял текст без форматирования (plain-text), т.е., например, «Word» или «OpenOffice.org Writer» для наших целей не подошли бы, но подходят «GEdit» или «Блокнот».

В редакторе нужно создать файл с именем Main.java и поместить туда исходный код программы:

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

Файл нужно сохранить.

Далее файл надо откомпилировать командой:

javac Main.java

Команду следует запускать из той же директории, где сохранён файл с сиходным кодом.

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

$ javac Main.java
Main.java:3: ';' expected
        System.out.println("Hello world")
                                         ^
1 error

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

Если компиляция пройдёт успешно, то никаких сообщений об ошибках вы не увидите, но в текущей директории появится новый файл Main.class — он содержит байт-код, который сможет исполняться на виртуальной машине.

$ ls 
Main.class  Main.java

Внутри файла с байт-кодом содержатся двоичные данные, это уже не просто текст, а инструкции в подготовленном для исполнения виртуальной машиной виде. Если файл с байт-кодом появился, то программу можно запускать на исполнение:

java Main

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

Итак, следует запомнить эту последовательность действий:

  1. Создать файл с исходным кодом программы в любом текстовом редакторе.
  2. Сохранить файл под именем Main.java, где Main — имя основного класса программы с уровнем доступа public, внутри которого обязательно содержится метод main.
  3. Откомпилировать файл в байт-код командой: javac Main.java
  4. Запустить успешно откомпилированную программу командой java Main

Задачи

  1. Создайте программу, которая вычислит выражение 20ˣ⅓+158² и выведет результат на экран.

  2. Создайте программу, которая вычислит выражение 14/209+14ˣ(29-13²+14/3) и выведет результат на экран. При этом число 14 обязательно сохраните в отдельной переменной, выбрав для неё подходящий тип.

  3. В переменной n хранится двузначное число. Создайте программу, вычисляющую и выводящую на экран сумму цифр n.

  4. В переменной n хранится вещественное число с ненулевой дробной частью. Создайте программу, округляющую число n до ближайшего целого и выводящую результат на экран.

  5. В переменной n хранится трёхзначное число. Создайте программу, вычисляющую и выводящую на экран сумму цифр n.