Menu
CoddyTech

Переменные экземпляра и статические переменные

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 15 из 87.

До сих пор каждое созданное нами поле принадлежит определённому объекту. Каждый BankAccount имеет собственный balance, а каждый Product — собственное name. Это переменные экземпляра — они существуют отдельно для каждого экземпляра класса.

Но что, если вам нужны данные, общие для всех объектов? Здесь на помощь приходят статические переменные (также называемые переменными класса). Статическая переменная принадлежит самому классу, а не какому-либо конкретному объекту.

public class Student {
    private String name;           // Переменная экземпляра - уникальна для каждого студента
    private static int totalCount; // Статическая переменная - общая для всех студентов
    public Student(String name) {
        this.name = name;
        totalCount++;  // Увеличивает общий счётчик
    }
    public static int getTotalCount() {
        return totalCount;
    }
}

Когда вы создаёте нескольких студентов, у каждого есть собственное name, но все они используют общее totalCount:

Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount());  // Вывод: 2

Обратите внимание, как мы обращаемся к статической переменной через имя класса (Student.getTotalCount()), а не через объект. Это подчёркивает, что статические члены принадлежат классу, а не экземплярам.

Используйте переменные экземпляра для данных, которые различаются у разных объектов (например, имя студента). Используйте статические переменные для данных, которые должны быть общими (например, для подсчёта количества существующих объектов).

challenge icon

Задание

Легко

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

Вы создадите два файла, чтобы организовать свой код:

  • Book.java: создайте класс Book, который хранит информацию об отдельных книгах, а также подсчитывает количество всех когда-либо созданных книг:
    • Переменная экземпляра title (String) — уникальна для каждой книги
    • Переменная экземпляра price (double) — уникальна для каждой книги
    • Статическая переменная totalBooks (int) — общая для всех объектов Book, отслеживает количество созданных книг
    • Конструктор, принимающий название и цену и увеличивающий общее количество книг
    • Геттер getTitle() для получения названия
    • Геттер getPrice() для получения цены
    • Статический метод getTotalBooks(), возвращающий общее количество созданных книг
  • Main.java: создайте несколько объектов Book и продемонстрируйте, как статический счётчик отслеживает все экземпляры. На вход будут поданы три названия книг и три цены. После создания всех трёх книг выведите четыре строки:
    • Название и цену каждой книги в формате: [title]: $[price] (цена отформатирована с точностью до 2 знаков после запятой)
    • Общее количество книг с использованием статического метода: Total books: [count]

Вы получите шесть входных значений в следующем порядке: title1, price1, title2, price2, title3, price3.

Не забудьте обращаться к статическому методу через имя класса (Book.getTotalBooks()), а не через экземпляр объекта. Для форматирования цен используйте String.format("%.2f", price).

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Прочитать входные данные для трёх книг
        String title1 = scanner.nextLine();
        double price1 = Double.parseDouble(scanner.nextLine());
        String title2 = scanner.nextLine();
        double price2 = Double.parseDouble(scanner.nextLine());
        String title3 = scanner.nextLine();
        double price3 = Double.parseDouble(scanner.nextLine());
        
        // TODO: Создать три объекта Book, используя входные данные выше
        
        // TODO: Вывести название и цену каждой книги в формате: [title]: $[price]
        // Используйте String.format("%.2f", price) для форматирования цены до 2 знаков после запятой
        
        // TODO: Вывести общее количество книг, используя статический метод
        // Format: Total books: [count]
        // Не забудьте обращаться к статическому методу через имя класса: Book.getTotalBooks()
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Java