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

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

Язык Java настолько объектно-ориентированный насколько возможно. Не считая импортов и указания имен пакетов, весь рабочий код находится внутри классов. При этом, за редким исключением, каждый класс должен описываться в отдельном файле, имя файла должно совпадать с именем класса. Например, если создается класс HelloWorldApp, то он сохраняется в файле HelloWorldApp.java.

Один из классов обязательно должен содержать метод-функцию main(), которая является точкой входа в java-программу. В случае однофайловой программы, метод main() должен быть в этом единственном файле. Как называется класс, содержащий main(), не важно.

Определение метода main() выглядит так:

public static void main(String[] args) {  }

Допустимо лишь изменение имени переменной args.

Группируя файлы программы по подкаталогам, мы тем самым создаем подпакеты. Самый верхний уровень, т. е. программа, будет пакетом. В тексте файла первой строкой пишется имя пакета или подпакета. Например:

package info.younglinux.pythonexercises;

Здесь файл, содержащий данную инструкцию, находится в каталоге pythonexercises, который вложен в каталог younglinux, который вложен в каталог info. Директория info – это пакет. Компиляция производится из родительского по отношению к info каталога.

Если все файлы программы находятся в одном каталоге и компиляция будет происходить из этого каталога, то инструкция package не нужна. Однако остается необходимой для файлов подкаталогов, т. е. подпакетов.

Рассмотрим пример программы, состоящей из трех файлов, один из которых вложен в подкаталог.

Файл 1:

public class Start {
        public static void main(String[] args) {
                System.out.println(Second.var2);
                System.out.println(utils.Third.var3);
        }
}

Файл 2:

public class Second {
        public static String var2 = "second";
}

Файл 3 (вложен в подкаталог utils):

package utils;
 
public class Third {
        public static String var3 = "third";
}

В классе Start на экран выводятся значение переменной var2 из класса Second, и переменной var3 из класса Third. Обращаясь к переменной третьего класса, мы должны указать имя пакета. В то же время переменная второго класса доступна через указание только самого класса, как будто он находится в том же файле, что и первый класс.

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

Компиляция java-программы из нескольких файлов

Однако можно компилировать все файлы, в том числе передавая шаблон, например, *.java.

Заметим, компилятор javac не компилирует все классы в одну программу из байт-кодов. Вместо этого он компилирует каждый класс по отдельности.

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

Файл 1:

package lesson2;
 
public class Start {
        public static void main(String[] args) {
                System.out.println(lesson2.Second.var2);
                System.out.println(lesson2.utils.Third.var3);
        }
}

Файл 2:

package lesson2;
 
public class Second {
        public static String var2 = "second";
}

Файл 3:

package lesson2.utils;
 
public class Third {
        public static String var3 = "third";
}

Компиляция и передача пакета виртуальной машине будут выполняться из каталога на уровень выше lesson2:

Компиляция пакета

Если сущности других классов используются часто, можно избежать длинных обращений типа lesson2.utils.Third.var3, выполнив инструкцию импорта. Например, первый файл может выглядеть так:

package lesson2;
 
import lesson2.Second;
import lesson2.utils.Third;
 
public class Start {
        public static void main(String[] args) {
                System.out.println(Second.var2);
                System.out.println(Third.var3);
        }
}

Также команда импорта используется для подключения классов из стандартной и сторонних библиотек. Один из стандартных пакетов языка Java импортируется неявно (java.lang), без вашего участия. Одной из его сущностей является функция System.out.println(), выводящая строку на экран, после чего добавляющая символ перехода на новую строку. System.out.print() символ новой строки не добавляет.

Создано