Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

Основы синтаксиса Java

Материалы

ТипСсылка
ДокументJava Language Specification
ВидеоJava Tutorial for Beginners

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

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

Каждая Java-программа состоит из одного или нескольких классов. Вот минимальная программа:

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

Анатомия программы

┌─────────────────────────────────────────────────────────────┐
│  public class HelloWorld {                                   │
│  ├── Модификатор доступа: public                            │
│  ├── Ключевое слово: class                                  │
│  └── Имя класса: HelloWorld (должно совпадать с файлом!)    │
├─────────────────────────────────────────────────────────────┤
│      public static void main(String[] args) {               │
│      ├── public: доступен JVM для запуска                   │
│      ├── static: не требует создания объекта                │
│      ├── void: ничего не возвращает                         │
│      ├── main: точка входа в программу                      │
│      └── String[] args: аргументы командной строки          │
├─────────────────────────────────────────────────────────────┤
│          System.out.println("Hello, World!");               │
│          └── Оператор (statement), заканчивается ;          │
│      }                                                       │
│  }                                                           │
└─────────────────────────────────────────────────────────────┘

Правило: один public класс = один файл

// Файл: Calculator.java
public class Calculator {
    // ...
}

// В этом же файле можно добавить НЕ-public классы
class Helper {
    // ...
}

Имя файла ДОЛЖНО совпадать с именем public класса:

  • Calculator.java содержит public class Calculator
  • MyProgram.java содержит public class MyProgram

Пакеты (Packages)

Пакеты организуют классы в логические группы и предотвращают конфликты имён.

Объявление пакета

package com.company.project;

public class MyClass {
    // ...
}

Пакет должен быть первой строкой в файле (после комментариев).

Структура каталогов

Пакет отражается в структуре папок:

src/
└── com/
    └── company/
        └── project/
            └── MyClass.java

Соглашения об именовании пакетов

// Обратный домен компании
package com.google.common;
package org.apache.commons;

// Для учебных проектов
package ru.example.myapp;
package edu.university.course;

Пакеты пишутся строчными буквами без camelCase.

Импорты (Imports)

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

Импорт конкретного класса

import java.util.ArrayList;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        HashMap<String, Integer> map = new HashMap<>();
    }
}

Импорт всего пакета

import java.util.*;  // все классы из java.util

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        LinkedList<Integer> linked = new LinkedList<>();
        HashMap<String, String> map = new HashMap<>();
    }
}

Статический импорт

Импортирует static члены класса:

import static java.lang.Math.PI;
import static java.lang.Math.sqrt;
import static java.lang.System.out;

public class Main {
    public static void main(String[] args) {
        out.println("PI = " + PI);           // вместо System.out.println
        out.println("sqrt(16) = " + sqrt(16)); // вместо Math.sqrt
    }
}

Автоматически импортированный пакет

Пакет java.lang импортируется автоматически:

// Не нужно писать: import java.lang.String;
// Не нужно писать: import java.lang.System;
// Не нужно писать: import java.lang.Math;

String s = "Hello";  // java.lang.String
System.out.println(s);  // java.lang.System
int x = Math.abs(-5);  // java.lang.Math

Комментарии

Java поддерживает три типа комментариев.

Однострочные комментарии

// Это однострочный комментарий
int age = 25;  // комментарий в конце строки

Многострочные комментарии

/* Это многострочный комментарий.
   Он может занимать несколько строк.
   Используется для временного отключения кода. */

int result = calculate(x, y);

/*
System.out.println("Этот код закомментирован");
System.out.println("И не выполняется");
*/

Документационные комментарии (Javadoc)

/**
 * Вычисляет факториал числа.
 *
 * <p>Факториал определён только для неотрицательных чисел.
 * Для отрицательных чисел выбрасывается исключение.</p>
 *
 * @param n неотрицательное целое число
 * @return факториал числа n
 * @throws IllegalArgumentException если n отрицательное
 * @see Math#abs(int)
 * @since 1.0
 */
public static long factorial(int n) {
    if (n < 0) {
        throw new IllegalArgumentException("n должно быть >= 0");
    }
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

Основные теги Javadoc:

ТегОписание
@paramОписание параметра метода
@returnОписание возвращаемого значения
@throws / @exceptionОписание исключения
@seeСсылка на связанный элемент
@sinceВерсия, с которой появился элемент
@deprecatedПомечает устаревший элемент
@authorАвтор класса
@versionВерсия класса

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

Идентификатор — это имя переменной, метода, класса или другого элемента.

Правила именования

Допустимо:

  • Буквы (a-z, A-Z), включая Unicode
  • Цифры (0-9), но НЕ в начале
  • Знак подчёркивания _
  • Знак доллара $ (не рекомендуется)

Недопустимо:

  • Начинать с цифры
  • Использовать пробелы
  • Использовать ключевые слова Java
// Допустимые идентификаторы
int age;
String firstName;
double _value;
int число;        // Unicode разрешён, но не рекомендуется
int MAX_SIZE;

// Недопустимые идентификаторы
// int 2ndPlace;  // начинается с цифры
// int my-var;    // содержит дефис
// int class;     // ключевое слово

Соглашения об именовании (Code Conventions)

Java использует разные стили для разных элементов:

ЭлементСтильПримеры
КлассыPascalCaseMyClass, ArrayList, StringBuilder
ИнтерфейсыPascalCaseRunnable, Comparable, List
МетодыcamelCasegetName(), calculateTotal(), isEmpty()
ПеременныеcamelCasefirstName, totalCount, isActive
КонстантыUPPER_SNAKE_CASEMAX_VALUE, DEFAULT_SIZE, PI
Пакетыlowercasejava.util, com.company.app
package com.example.shop;  // пакет: lowercase

public class ShoppingCart {  // класс: PascalCase

    private static final int MAX_ITEMS = 100;  // константа: UPPER_SNAKE_CASE

    private List<Item> items;  // переменная: camelCase
    private int totalCount;

    public void addItem(Item item) {  // метод: camelCase
        if (totalCount < MAX_ITEMS) {
            items.add(item);
            totalCount++;
        }
    }

    public int getTotalCount() {  // getter: camelCase
        return totalCount;
    }

    public boolean isEmpty() {  // boolean getter: is/has/can
        return totalCount == 0;
    }
}

Ключевые слова Java

Java имеет 67 зарезервированных слов (включая литералы и зарезервированные для будущего):

Модификаторы доступа

public    protected    private

Модификаторы классов/методов/полей

abstract    static    final    native
synchronized    transient    volatile    strictfp

Управление потоком

if    else    switch    case    default
for    while    do    break    continue    return

Исключения

try    catch    finally    throw    throws

Типы данных

boolean    byte    char    short    int    long    float    double
void

Классы и объекты

class    interface    enum    record    extends    implements
new    this    super    instanceof

Пакеты

package    import

Другие

assert    const (зарезервировано)    goto (зарезервировано)

Литералы (не ключевые слова, но зарезервированы)

true    false    null

Контекстуальные ключевые слова (Java 9+)

var    yield    sealed    permits    non-sealed    record

Операторы (Statements)

Оператор — это завершённая единица выполнения. Операторы заканчиваются точкой с запятой ;.

Типы операторов

Объявление переменной:

int count;
String name = "Java";
final double PI = 3.14159;

Выражение-оператор:

count = 10;              // присваивание
count++;                 // инкремент
System.out.println(x);   // вызов метода
new ArrayList<>();       // создание объекта

Управляющий оператор:

if (condition) { }
for (int i = 0; i < 10; i++) { }
while (running) { }
return value;
break;
continue;

Блоки кода

Блок — это группа операторов в фигурных скобках:

{
    int x = 10;
    int y = 20;
    System.out.println(x + y);
}

Переменные, объявленные в блоке, видны только внутри него:

{
    int x = 10;
    System.out.println(x);  // OK
}
// System.out.println(x);  // ОШИБКА: x не видна здесь

Точка с запятой и фигурные скобки

Когда нужна точка с запятой

// После каждого оператора
int x = 5;
System.out.println(x);
return x;

// После объявления поля
private int count;

// После import и package
package com.example;
import java.util.List;

Когда НЕ нужна точка с запятой

// После фигурных скобок блоков
if (condition) {
    // код
}  // НЕТ точки с запятой

for (int i = 0; i < 10; i++) {
    // код
}  // НЕТ точки с запятой

public void method() {
    // код
}  // НЕТ точки с запятой

class MyClass {
    // код
}  // НЕТ точки с запятой

Исключение: инициализация массивов

int[] arr = {1, 2, 3};  // точка с запятой после }

Пробелы и форматирование

Java игнорирует лишние пробелы и переносы строк. Технически это валидный код:

public class Ugly{public static void main(String[]args){System.out.println("Работает!");}}

Но читать его невозможно. Используйте форматирование:

public class Beautiful {
    public static void main(String[] args) {
        System.out.println("Работает!");
    }
}

Рекомендации по форматированию

Отступы: 4 пробела (не табуляция)

public class Example {
    public void method() {
        if (condition) {
            // 4 пробела на уровень
        }
    }
}

Фигурные скобки: открывающая на той же строке

// Рекомендуемый стиль (K&R / Java style)
if (condition) {
    doSomething();
}

// Альтернативный стиль (Allman) - менее распространён в Java
if (condition)
{
    doSomething();
}

Пробелы вокруг операторов:

// Хорошо
int sum = a + b;
if (x == 5) { }
for (int i = 0; i < 10; i++) { }

// Плохо
int sum=a+b;
if(x==5){}
for(int i=0;i<10;i++){}

Пустые строки для разделения логических блоков:

public class Person {
    // Поля
    private String name;
    private int age;

    // Конструктор
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Геттеры
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Полный пример программы

Соберём всё вместе:

package com.example.greeting;

import java.util.Scanner;
import java.time.LocalTime;

/**
 * Программа приветствия пользователя.
 *
 * Запрашивает имя и выводит приветствие
 * в зависимости от времени суток.
 *
 * @author Developer
 * @version 1.0
 */
public class GreetingApp {

    // Константы для времени суток
    private static final int MORNING_START = 6;
    private static final int AFTERNOON_START = 12;
    private static final int EVENING_START = 18;
    private static final int NIGHT_START = 22;

    /**
     * Точка входа в программу.
     *
     * @param args аргументы командной строки (не используются)
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Запрашиваем имя
        System.out.print("Как вас зовут? ");
        String name = scanner.nextLine();

        // Получаем текущий час
        int hour = LocalTime.now().getHour();

        // Формируем приветствие
        String greeting = getGreeting(hour);

        // Выводим результат
        System.out.println(greeting + ", " + name + "!");

        scanner.close();
    }

    /**
     * Возвращает приветствие в зависимости от времени суток.
     *
     * @param hour текущий час (0-23)
     * @return строка приветствия
     */
    private static String getGreeting(int hour) {
        if (hour >= MORNING_START && hour < AFTERNOON_START) {
            return "Доброе утро";
        } else if (hour >= AFTERNOON_START && hour < EVENING_START) {
            return "Добрый день";
        } else if (hour >= EVENING_START && hour < NIGHT_START) {
            return "Добрый вечер";
        } else {
            return "Доброй ночи";
        }
    }
}

Итоги

Вы изучили основы синтаксиса Java:

  • Структура программы: класс с методом main() как точка входа
  • Пакеты: организация кода в логические группы
  • Импорты: использование классов из других пакетов
  • Комментарии: однострочные, многострочные и Javadoc
  • Идентификаторы: правила именования элементов
  • Соглашения: PascalCase, camelCase, UPPER_SNAKE_CASE
  • Ключевые слова: зарезервированные слова языка
  • Операторы: завершённые единицы выполнения
  • Форматирование: отступы, скобки, пробелы

Теперь вы готовы писать правильно структурированный Java-код.

Задания для практики

  1. Создайте программу Calculator.java в пакете com.example.math с методами для базовых операций

  2. Напишите класс с правильными Javadoc-комментариями для всех публичных методов

  3. Отформатируйте следующий код по стандартам Java:

    public class ugly{public static void main(String[]a){int x=5;int y=10;if(x<y){System.out.println("x меньше");}else{System.out.println("y меньше или равно");}}}
    
  4. Определите, какие из следующих идентификаторов допустимы:

    • myVariable
    • 2ndValue
    • _count
    • class
    • my-value
    • MAX_SIZE