Переменные экземпляра и статические переменные
Часть раздела Объектно-ориентированное программирование путешествия по 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()), а не через объект. Это подчёркивает, что статические члены принадлежат классу, а не экземплярам.
Используйте переменные экземпляра для данных, которые различаются у разных объектов (например, имя студента). Используйте статические переменные для данных, которые должны быть общими (например, для подсчёта количества существующих объектов).
Задание
ЛегкоСоздадим систему учёта книг 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()
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java