Шпаргалка по Java

Изучите Java с практическими лабораториями

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

Структура программы и базовый синтаксис

Hello World: Базовая программа

Простейшая программа на Java, которая выводит “Hello, World!” на экран.

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

Объявление класса: public class

Класс — это шаблон/проект, описывающий поведение/состояние, которое поддерживают объекты.

public class MyClass {
    // Здесь находится содержимое класса
    int myVariable;

    public void myMethod() {
        System.out.println("Hello from method!");
    }
}

Метод Main: Точка входа программы

Метод main — это место, где начинается выполнение программы на Java.

public static void main(String[] args) {
    // Код программы здесь
    System.out.println("Program starts here");
}
Викторина

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

Какова правильная сигнатура метода main в Java?
public void main(String[] args)
static void main(String[] args)
public static void main(String[] args)
public static int main(String[] args)

Комментарии: Документация кода

Используйте однострочные (//) и многострочные (/* */) комментарии, чтобы сделать код более понятным и удобным для сопровождения.

// Однострочный комментарий
System.out.println("Hello");

/* Многострочный комментарий
   Может занимать несколько строк
   Используется для подробных объяснений */

Инструкции и точки с запятой

Каждая инструкция в Java должна заканчиваться точкой с запятой.

int number = 10;
String name = "Java";
System.out.println(name);

Блоки кода: Фигурные скобки

Блоки кода заключаются в фигурные скобки {}, обозначая начало и конец секций кода.

public class Example {
    public void method() {
        if (true) {
            System.out.println("Inside if block");
        }
    }
}

Типы данных и переменные

Примитивные типы данных

Основные типы данных, встроенные в язык Java.

// Целочисленные типы
byte smallNum = 127;        // -128 до 127
short shortNum = 32000;     // -32,768 до 32,767
int number = 100;           // -2^31 до 2^31-1
long bigNum = 10000L;       // -2^63 до 2^63-1

// Типы с плавающей точкой
float decimal = 3.14f;      // Одинарная точность
double precision = 3.14159; // Двойная точность

// Другие типы
char letter = 'A';          // Один символ
boolean flag = true;        // true или false

Объявление и инициализация переменных

Создание переменных и присвоение им значений.

// Только объявление
int age;
String name;

// Объявление с инициализацией
int age = 25;
String name = "John";

// Множественное объявление
int x = 10, y = 20, z = 30;

// Финальные переменные (константы)
final double PI = 3.14159;

Операции со строками

Строки представляют собой последовательности символов и являются неизменяемыми (immutable), что означает, что после создания их значение изменить нельзя.

String greeting = "Hello";
String name = "World";

// Конкатенация строк
String message = greeting + " " + name;
System.out.println(message); // "Hello World"

// Методы строк
int length = message.length();
boolean isEmpty = message.isEmpty();
String uppercase = message.toUpperCase();
Викторина

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

Что означает, что строки в Java являются неизменяемыми (immutable)?
После создания значение строки изменить нельзя
Строки не могут быть созданы
Строки могут хранить только числа
Строки удаляются автоматически

Операторы управления потоком

Условные операторы: if, else if, else

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

int score = 85;
if (score >= 90) {
    System.out.println("Grade A");
} else if (score >= 80) {
    System.out.println("Grade B");
} else if (score >= 70) {
    System.out.println("Grade C");
} else {
    System.out.println("Grade F");
}

Оператор Switch

Многопутевое ветвление на основе значений переменных.

int day = 3;
switch (day) {
    case 1:
        System.out.println("Monday");
        break;
    case 2:
        System.out.println("Tuesday");
        break;
    case 3:
        System.out.println("Wednesday");
        break;
    default:
        System.out.println("Other day");
}

Цикл For: Повторение по счетчику

Повторяет код определенное количество раз.

// Стандартный цикл for
for (int i = 0; i < 5; i++) {
    System.out.println("Count: " + i);
}

// Улучшенный цикл for (for-each)
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
    System.out.println("Number: " + num);
}
Викторина

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

Для чего используется улучшенный цикл for (for-each)?
Для итерации с переменной-счетчиком
Для бесконечных циклов
Для итерации по массивам и коллекциям без индекса
Только для вложенных циклов

Циклы While и Do-While

Повторяют код, пока условие истинно.

// Цикл While
int i = 0;
while (i < 3) {
    System.out.println("While: " + i);
    i++;
}

// Цикл Do-while (выполняется как минимум один раз)
int j = 0;
do {
    System.out.println("Do-while: " + j);
    j++;
} while (j < 3);
Викторина

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

Каково ключевое различие между циклами while и do-while?
Различий нет
do-while выполняется как минимум один раз, в то время как while может не выполниться ни разу
while работает быстрее
do-while работает только с массивами

Объектно-ориентированное программирование

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

Объекты имеют состояние и поведение. Объект — это экземпляр класса.

public class Car {
    // Переменные экземпляра (состояние)
    String color;
    String model;
    int year;

    // Конструктор
    public Car(String color, String model, int year) {
        this.color = color;
        this.model = model;
        this.year = year;
    }

    // Метод (поведение)
    public void start() {
        System.out.println("Car is starting...");
    }
}

// Создание объектов
Car myCar = new Car("Red", "Toyota", 2022);
myCar.start();

Конструкторы

Специальные методы, используемые для инициализации объектов.

public class Person {
    String name;
    int age;

    // Конструктор по умолчанию
    public Person() {
        name = "Unknown";
        age = 0;
    }

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

Наследование: extends

Наследование позволяет повторно использовать код и создает иерархические отношения между классами.

public class Animal {
    protected String name;

    public void eat() {
        System.out.println(name + " is eating");
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        this.name = name;
    }

    public void bark() {
        System.out.println(name + " is barking");
    }
}

Dog myDog = new Dog("Buddy");
myDog.eat();  // Унаследованный метод
myDog.bark(); // Собственный метод

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

Модификаторы контролируют доступ к классам, методам и переменным.

public class Example {
    public int publicVar;      // Доступно везде
    private int privateVar;    // Только внутри этого класса
    protected int protectedVar; // Внутри пакета + подклассы
    int defaultVar;            // Только внутри пакета

    private void privateMethod() {
        // Доступно только внутри этого класса
    }
}

Методы и функции

Объявление метода

Метод — это, по сути, поведение, в котором пишется логика, обрабатываются данные и выполняются действия.

public class Calculator {
    // Метод с параметрами и возвращаемым значением
    public int add(int a, int b) {
        return a + b;
    }

    // Метод без возвращаемого значения
    public void printSum(int a, int b) {
        int result = add(a, b);
        System.out.println("Sum: " + result);
    }

    // Статический метод (принадлежит классу)
    public static int multiply(int a, int b) {
        return a * b;
    }
}

Перегрузка методов (Method Overloading)

Несколько методов с одинаковым именем, но разными параметрами.

public class MathUtils {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

Параметры метода и возвращаемые типы

Передача данных в методы и возврат результатов.

public class StringHelper {
    // Метод с параметром String и возвращаемым значением
    public String formatName(String firstName, String lastName) {
        return firstName + " " + lastName;
    }

    // Метод с параметром-массивом
    public int findMax(int[] numbers) {
        int max = numbers[0];
        for (int num : numbers) {
            if (num > max) {
                max = num;
            }
        }
        return max;
    }
}

Рекурсивные методы

Методы, которые вызывают сами себя для решения задач.

public class RecursiveExamples {
    // Вычисление факториала
    public int factorial(int n) {
        if (n <= 1) {
            return 1;
        }
        return n * factorial(n - 1);
    }

    // Последовательность Фибоначчи
    public int fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

Массивы и коллекции

Объявление и инициализация массива

Создание и инициализация массивов разных типов.

// Объявление и инициализация массива
int[] numbers = {1, 2, 3, 4, 5};
String[] names = {"Alice", "Bob", "Charlie"};

// Массив с заданным размером
int[] scores = new int[10];
scores[0] = 95;
scores[1] = 87;

// Получение длины массива
int length = numbers.length;
System.out.println("Length: " + length);

// Перебор массива
for (int i = 0; i < numbers.length; i++) {
    System.out.println("Element " + i + ": " + numbers[i]);
}

Многомерные массивы

Массивы массивов для структур данных, похожих на матрицы.

// Объявление 2D массива
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// Доступ к элементам
int element = matrix[1][2]; // Получает 6

// Перебор 2D массива
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

ArrayList: Динамические массивы

Массивы с изменяемым размером, которые могут динамически расти и сжиматься.

import java.util.ArrayList;

// Создание ArrayList
ArrayList<String> list = new ArrayList<>();

// Добавление элементов
list.add("Apple");
list.add("Banana");
list.add("Orange");

// Получение элемента
String fruit = list.get(0); // Получает "Apple"

// Удаление элемента
list.remove(1); // Удаляет "Banana"

// Размер и итерация
System.out.println("Size: " + list.size());
for (String item : list) {
    System.out.println(item);
}

HashMap: Пары ключ-значение

Хранение данных в виде пар ключ-значение для быстрого поиска.

import java.util.HashMap;

// Создание HashMap
HashMap<String, Integer> ages = new HashMap<>();

// Добавление пар ключ-значение
ages.put("Alice", 25);
ages.put("Bob", 30);
ages.put("Charlie", 35);

// Получение значения по ключу
int aliceAge = ages.get("Alice");

// Проверка наличия ключа
if (ages.containsKey("Bob")) {
    System.out.println("Bob's age: " + ages.get("Bob"));
}

Обработка исключений

Блоки Try-Catch

Обработка исключений для предотвращения сбоев программы.

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // Это вызовет ArithmeticException
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) {
            System.out.println("Cannot divide by zero!");
            System.out.println("Error: " + e.getMessage());
        } finally {
            System.out.println("This always executes");
        }
    }
}

Несколько блоков Catch

Обработка различных типов исключений по отдельности.

public void processArray(String[] arr, int index) {
    try {
        int number = Integer.parseInt(arr[index]);
        int result = 100 / number;
        System.out.println("Result: " + result);
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Invalid array index");
    } catch (NumberFormatException e) {
        System.out.println("Invalid number format");
    } catch (ArithmeticException e) {
        System.out.println("Cannot divide by zero");
    }
}

Генерация пользовательских исключений

Создание и генерация собственных исключений.

public class AgeValidator {
    public void validateAge(int age) throws IllegalArgumentException {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
        if (age > 150) {
            throw new IllegalArgumentException("Age seems unrealistic");
        }
        System.out.println("Valid age: " + age);
    }

    public static void main(String[] args) {
        AgeValidator validator = new AgeValidator();
        try {
            validator.validateAge(-5);
        } catch (IllegalArgumentException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}

Общие типы исключений

Часто встречающиеся исключения в программах на Java.

// NullPointerException
String str = null;
// str.length(); // Вызовет NullPointerException

// ArrayIndexOutOfBoundsException
int[] arr = {1, 2, 3};
// int val = arr[5]; // Вызовет ArrayIndexOutOfBoundsException

// NumberFormatException
// int num = Integer.parseInt("abc"); // Вызовет NumberFormatException

// FileNotFoundException (при работе с файлами)
// IOException (общие операции ввода/вывода)

Операции ввода/вывода

Ввод с консоли: Класс Scanner

Чтение ввода с клавиатуры с помощью Scanner.

import java.util.Scanner;

public class InputExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter your name: ");
        String name = scanner.nextLine();

        System.out.print("Enter your age: ");
        int age = scanner.nextInt();

        System.out.print("Enter your height: ");
        double height = scanner.nextDouble();

        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("Height: " + height);

        scanner.close();
    }
}

Вывод на консоль: System.out

Отображение вывода на консоли в различных форматах.

public class OutputExample {
    public static void main(String[] args) {
        // Базовый вывод
        System.out.println("Hello, World!");
        System.out.print("No newline");
        System.out.print(" continues here\n");

        // Форматированный вывод
        String name = "Java";
        int version = 17;
        System.out.printf("Welcome to %s %d!%n", name, version);

        // Вывод переменных
        int x = 10, y = 20;
        System.out.println("x = " + x + ", y = " + y);
        System.out.println("Sum = " + (x + y));
    }
}

Чтение файла: BufferedReader

Эффективное чтение текстовых файлов построчно.

import java.io.*;

public class FileReadExample {
    public static void readFile(String filename) {
        try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
            String line;
            int lineNumber = 1;

            while ((line = reader.readLine()) != null) {
                System.out.println(lineNumber + ": " + line);
                lineNumber++;
            }
        } catch (IOException e) {
            System.out.println("Error reading file: " + e.getMessage());
        }
    }
}

Запись в файл: PrintWriter

Запись текстовых данных в файлы с надлежащей обработкой исключений.

import java.io.*;

public class FileWriteExample {
    public static void writeFile(String filename, String[] data) {
        try (PrintWriter writer = new PrintWriter(new FileWriter(filename))) {
            writer.println("# Data File");
            writer.println("Generated on: " + new java.util.Date());
            writer.println();

            for (int i = 0; i < data.length; i++) {
                writer.println("Line " + (i + 1) + ": " + data[i]);
            }

            System.out.println("File written successfully!");
        } catch (IOException e) {
            System.out.println("Error writing file: " + e.getMessage());
        }
    }
}

Среда разработки Java

Установка JDK

JDK (Java Development Kit) = JRE + Инструменты разработки. Необходим для разработки Java-приложений.

# Скачать JDK с Oracle или OpenJDK
# Установить JDK в вашей системе
# Установить переменную окружения JAVA_HOME
export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

# Проверить установку
java -version
javac -version

Компиляция и запуск программ на Java

Используйте javac для компиляции исходного кода Java и java для запуска скомпилированной программы.

# Скомпилировать исходный файл Java
javac MyProgram.java

# Запустить скомпилированную программу Java
java MyProgram

# Компиляция с указанием classpath
javac -cp .:mylib.jar MyProgram.java

# Запуск с указанием classpath
java -cp .:mylib.jar MyProgram

Настройка и разработка в IDE

Популярные интегрированные среды разработки (IDE) для разработки на Java.

# Популярные IDE для Java:
# - IntelliJ IDEA (JetBrains)
# - Eclipse IDE
# - Visual Studio Code с расширениями Java
# - NetBeans

# Компиляция из командной строки
javac -d bin src/*.java
java -cp bin MainClass

# Создание JAR-файла
jar cf myapp.jar -C bin .

Лучшие практики и общие шаблоны

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

Следуйте стандартам именования Java для лучшей читаемости кода.

// Классы: PascalCase
public class StudentManager { }
public class BankAccount { }

// Методы и переменные: camelCase
int studentAge;
String firstName;
public void calculateGrade() { }
public boolean isValidEmail() { }

// Константы: UPPER_CASE
public static final int MAX_SIZE = 100;
public static final String DEFAULT_NAME = "Unknown";

// Пакеты: lowercase
package com.company.project;
package utils.database;
package com.example.myapp;

Организация кода

Структурирование программ на Java для удобства сопровождения.

import java.util.ArrayList;
import java.util.Scanner;

/**
 * Этот класс демонстрирует хорошую организацию кода на Java
 * @author Your Name
 * @version 1.0
 */
public class WellOrganizedClass {
    // Константы в первую очередь
    private static final int MAX_ATTEMPTS = 3;

    // Переменные экземпляра
    private String name;
    private int value;

    // Конструктор
    public WellOrganizedClass(String name) {
        this.name = name;
        this.value = 0;
    }

    // Публичные методы
    public void doSomething() {
        // Реализация
    }

    // Приватные вспомогательные методы
    private boolean isValid() {
        return value > 0;
    }
}

Предотвращение ошибок

Общие практики для избежания ошибок и повышения качества кода.

public class BestPractices {
    public void safeDivision(int a, int b) {
        // Проверка деления на ноль
        if (b == 0) {
            throw new IllegalArgumentException("Cannot divide by zero");
        }
        int result = a / b;
        System.out.println("Result: " + result);
    }

    public void safeStringOperations(String input) {
        // Проверка на null перед использованием строк
        if (input != null && !input.isEmpty()) {
            System.out.println("Length: " + input.length());
            System.out.println("Uppercase: " + input.toUpperCase());
        } else {
            System.out.println("Invalid input string");
        }
    }

    public void safeArrayAccess(int[] array, int index) {
        // Проверка границ массива
        if (array != null && index >= 0 && index < array.length) {
            System.out.println("Value: " + array[index]);
        } else {
            System.out.println("Invalid array access");
        }
    }
}

Управление ресурсами

Надлежащая обработка ресурсов для предотвращения утечек памяти.

import java.io.*;

public class ResourceManagement {
    // Try-with-resources (автоматическая очистка)
    public void readFileProper(String filename) {
        try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
            String line = reader.readLine();
            System.out.println(line);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
        // Reader автоматически закрывается
    }

    // Ручная очистка ресурсов (не рекомендуется)
    public void readFileManual(String filename) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(filename));
            String line = reader.readLine();
            System.out.println(line);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    System.out.println("Error closing reader");
                }
            }
        }
    }
}

Соответствующие ссылки