Найти в Дзене
Анастасия Софт

Урок 10 для Java-разработчика. 💻 Как Java хранит объекты и строки: просто о сложном

Привет! Сегодня мы разберём, как Java создаёт объекты и управляет строками. Погрузимся в кучу (heap), стек (stack) и даже в таинственный string pool. Если эти слова пока ни о чём не говорят — не переживай, к концу статьи ты всё поймёшь! В Java объекты хранятся в специальной области памяти под названием куча (heap). Это место, где "живут" все экземпляры классов. Ты не можешь напрямую управлять этой памятью — этим занимается виртуальная машина Java (JVM). class Car {
String model;
int year;
}
public class Demo {
public static void main(String[] args) {
Car myCar = new Car(); // Создание объекта
myCar.model = "Toyota";
myCar.year = 2020;
}
} 🔍 Разбор кода: Когда объект больше не нужен (на него нет ссылок), сборщик мусора (garbage collector) автоматически освобождает занятую память. String greeting = "Hello"; Вот ты написал простую строку, но в фоне происходит много чего: public class Strings {
public static void main(String[] args) {
S
Оглавление

Привет! Сегодня мы разберём, как Java создаёт объекты и управляет строками. Погрузимся в кучу (heap), стек (stack) и даже в таинственный string pool. Если эти слова пока ни о чём не говорят — не переживай, к концу статьи ты всё поймёшь!

🔧 Создание объектов в Java

В Java объекты хранятся в специальной области памяти под названием куча (heap). Это место, где "живут" все экземпляры классов. Ты не можешь напрямую управлять этой памятью — этим занимается виртуальная машина Java (JVM).

Как создаётся объект?

class Car {
String model;
int year;
}

public class Demo {
public static void main(String[] args) {
Car myCar = new Car(); // Создание объекта
myCar.model = "Toyota";
myCar.year = 2020;
}
}

🔍 Разбор кода:

  • Car myCar = new Car(); — создаётся объект Car, память под него выделяется в куче.
  • myCar.model = "Toyota"; — строка "Toyota" создаётся в string pool, а ссылка присваивается полю объекта.
  • myCar.year = 2020; — число хранится прямо в объекте.

Когда объект больше не нужен (на него нет ссылок), сборщик мусора (garbage collector) автоматически освобождает занятую память.

🧵 Строковые литералы: что с ними не так?

String greeting = "Hello";

Вот ты написал простую строку, но в фоне происходит много чего:

  • "Hello" — это строковый литерал.
  • Все строковые литералы сохраняются в специальной области памяти — string pool.
  • Если ты ещё раз напишешь "Hello", Java не создаст новый объект, а просто вернёт ссылку на уже существующую строку.

Пример:

public class Strings {
public static void main(String[] args) {
String s1 = "Java";
String s2 = "Java";
System.out.println(s1 == s2); // true
}
}

🔍 Почему true?

Обе переменные s1 и s2 ссылаются на один и тот же объект в string pool.

🚫 null — пустая ссылка

Иногда переменная-ссылка ни на что не указывает. Тогда её значение — null.

public class NullDemo {
public static void main(String[] args) {
String text = null;
System.out.println(text.length()); // Ошибка!
}
}

❗ Это вызовет NullPointerException, потому что ты пытаешься вызвать метод у "ничего".

⚙️ Stack vs Heap

Область памятиЧто хранитсяStackЛокальные переменные, ссылкиHeapОбъекты, поля объектов

📋 Тест: Проверь себя

  1. Что такое string pool?

    A. Часть стека

    B. Специальная область памяти для строк

    C. Переменная, хранящая строку

    D. Команда компилятора
  2. Где хранятся объекты, созданные через new?

    A. Stack

    B. Heap

    C. String pool

    D. Кэш процессора
  3. Что произойдёт, если обратиться к методу у переменной со значением null?

    A. Ничего

    B. Вернёт null

    C. NullPointerException

    D. Ошибка компиляции

🧠 Практические задачи

Задача 1: Один и тот же объект?

public class Test {
public static void main(String[] args) {
String a = "Code";
String b = "Co" + "de";
System.out.println(a == b);
}
}

Что выведет программа и почему?

Задача 2: Объекты и null

class Book {
String title;
}

public class Test {
public static void main(String[] args) {
Book b = null;
b.title = "Java"; // Что произойдёт?
}
}

✅ Заключение

Вот что мы сегодня узнали:

  • Объекты создаются через new и хранятся в куче (heap).
  • Строковые литералы помещаются в string pool, что экономит память.
  • Переменная со значением null — это пустая ссылка, вызов метода у неё приводит к NullPointerException.
  • Stack используется для хранения ссылок и локальных переменных, а heap — для объектов.

🧪 Ответы на тест

  1. Что такое string pool?

    ✅ Правильный ответ:
    B. Специальная область памяти для строк
  2. Где хранятся объекты, созданные через new?

    ✅ Правильный ответ:
    B. Heap
  3. Что произойдёт, если обратиться к методу у переменной со значением null?

    ✅ Правильный ответ:
    C. NullPointerException

🔍 Подробный разбор задач

Задача 1: Один и тот же объект?

String a = "Code";
String b = "Co" + "de";
System.out.println(a == b);

Ответ: true

Почему:

Обе строки — компилируются как литералы и попадают в string pool. Поэтому a и b ссылаются на один и тот же объект.

Задача 2: Объекты и null

Book b = null;
b.title = "Java";

Ответ: NullPointerException

Почему:

Ты пытаешься обратиться к полю у null — переменная b не ссылается ни на какой объект, следовательно, JVM выбрасывает исключение.