Операторы в Java: что это, виды и примеры для новичков
Операторы в Java — это специальные символы, которые говорят компилятору выполнить определенные математические, логические или другие манипуляции с данными. Проще говоря, это инструменты, позволяющие вам «командовать» значениями и переменными. Без операторов Java-программа напоминала бы человека, который может назвать предметы, но не способен совершать с ними никаких действий. В этом курсе мы рассмотрим все типы operatorв Java: от основных до специфических, разберем примеры и увидим, как они взаимодействуют друг с другом.

Хотя на первый взгляд operator кажутся простыми (ну кто не знает, что значит «+», правда?), за ними скрывается целый мир особенностей и нюансов, понимание которых отличает опытного разработчика от новичка. От простейших арифметических вычислений до сложных побитовых операций — операторы Java позволяют писать эффективный, лаконичный и выразительный код.
- Классификация в Java
 - Оператор присваивания
 - Арифметические
 - Операторы сравнения
 - Логические
 - Побитовые
 - Тернарный
 - Приоритет и порядок выполнения
 - Итоги и выводы
 - Рекомендуем посмотреть курсы по Java
 
Классификация в Java
Это как швейцарский нож в кармане программиста: множество инструментов для разных ситуаций, упакованных в компактную систему символов. И прежде чем погрузиться в дебри каждого конкретного operator, давайте разложим их по полочкам — так будет проще не заблудиться в этом синтаксическом лабиринте.
По количеству операндов (тех самых значений, над которыми производятся действия) operator Java делятся на три группы:
- Унарные — работают только с одним операндом. Это как одиночное плавание в море кода. Например, оператор инкремента ++ увеличивает значение переменной на единицу: x++. Другие примеры: отрицание !, унарный минус -.
 - Бинарные — требуют двух операндов, расположенных по обе стороны от operator. Классический пример — сложение: a + b. Сюда же относятся операторы вычитания, умножения, деления и большинство других operator Java.
 - Тернарный — единственный в своем роде оператор, работающий сразу с тремя операндами. Это условный operator ?:, который действует как компактная версия конструкции if-else: условие ? выражение1 : выражение2.
 
Кроме того, их можно классифицировать по типу выполняемых действий:
- Арифметические (+, -, *, /)
 - Сравнения (==, !=, <, >)
 - Логические (&&, ||, !)
 - Присваивания (=, +=, -=)
 - Побитовые (&, |, ^, ~)
 
Каждая группа имеет свои особенности и правила использования, которые мы подробно разберем далее. Осознание того, как различные операторы взаимодействуют между собой и какой у них приоритет, позволит вам писать код, который не просто работает, а работает элегантно.
Оператор присваивания
Оператор присваивания (=) — это, пожалуй, самый недооцененный и в то же время самый используемый operator в Java. Казалось бы, что может быть проще — взять значение справа и запихнуть его в переменную слева. Но, как обычно, дьявол кроется в деталях.
int x = 42; // Классическое присваивание
На самом деле происходит следующее: значение справа вычисляется и затем копируется в переменную слева. Причем Java, как дотошный бухгалтер, следит за типами данных — нельзя просто так взять и присвоить строку числовой переменной.
Помимо стандартного operator =, Java предлагает набор составных операторов присваивания, которые позволяют сэкономить несколько нажатий на клавиатуру (и, возможно, заработать немного больше морщин у коллег, читающих ваш код):
x += 5; // То же самое, что x = x + 5; x -= 3; // То же самое, что x = x - 3; x *= 2; // То же самое, что x = x * 2; x /= 4; // То же самое, что x = x / 4; x %= 3; // То же самое, что x = x % 3;
Интересная особенность составных operator — они умеют автоматически приводить типы. Например:
int a = 10; double b = 3.14; a = a + b; // Ошибка компиляции! Java не может неявно преобразовать double к int a += b; // Это также вызовет ошибку компиляции, так как compound assignment не выполняет неявное сужающее преобразование. Необходимо явное приведение типов: a += (int) b;
Это как если бы вы говорили: «Слушай, Java, я знаю, что делаю, просто впихни туда сколько влезет». И Java, скрепя сердце, соглашается.
И еще один финт — цепочка присваиваний:
int a, b, c; a = b = c = 10; // Всем переменным присваивается значение 10
Здесь значения «текут» справа налево: сначала c получает 10, потом b получает значение c (то есть 10), и наконец a получает значение b (опять же, 10). Элегантно, но использовать с осторожностью — такие конструкции могут запутать коллег и будущего вас.
Арифметические
Базовые арифметические
Это как старые добрые друзья из школьной математики, только немного своенравные и с парочкой сюрпризов в рукаве. Они делают именно то, что вы ожидаете… почти всегда.
Основная пятерка арифметических:
int a = 10; int b = 3; System.out.println(a + b); // 13, сложение System.out.println(a - b); // 7, вычитание System.out.println(a * b); // 30, умножение System.out.println(a / b); // 3, деление (внимание, целочисленное!) System.out.println(a % b); // 1, остаток от деления
Казалось бы, всё просто. Но вот это целочисленное деление… о, сколько седых волос оно добавило начинающим Java-разработчикам! Когда вы делите целое число на целое, результат тоже целый, даже если математически он должен быть дробным. Java безжалостно отсекает дробную часть, не заморачиваясь с округлением.
System.out.println(10 / 3); // 3, а не 3.333... System.out.println(10 / 4); // 2, а не 2.5
Чтобы получить дробный результат, хотя бы один из операндов должен быть дробным:
System.out.println(10.0 / 3); // 3.3333333333333335 System.out.println(10 / 3.0); // 3.3333333333333335
А еще у operator + есть секретная суперспособность — он умеет соединять строки (конкатенация):
System.out.println("Hello, " + "world!");  // Hello, world!
System.out.println("The answer is " + 42); // The answer is 42

Это иллюстрация вывода Java-программы, показывающей поведение двух выражений
Инкремент и декремент
Теперь перейдем к операторам, которые вызывают больше всего головной боли у начинающих — инкремент (++) и декремент (—). По сути, они просто увеличивают или уменьшают значение переменной на единицу, но делают это с особым шиком.
int i = 5; i++; // Теперь i равно 6 i--; // И снова 5
Но вот где начинается веселье: эти operator могут стоять как перед переменной (префиксная форма), так и после нее (постфиксная форма). И разница критическая:
int x = 5; int y = ++x; // Сначала увеличивает x до 6, потом присваивает y значение x // x = 6, y = 6 int a = 5; int b = a++; // Сначала присваивает b значение a (5), потом увеличивает a до 6 // a = 6, b = 5
Эта особенность превратила много простых строчек кода в головоломки:
int i = 5; System.out.println(i++ + ++i); // Что выведет? 5 + 7 = 12!
Из-за таких выражений некоторые компании запрещают использовать инкремент и декремент в сложных выражениях. И правильно делают — код должен быть понятным, а не выглядеть как заклинание черной магии.
Арифметические операторы — это основа вычислений в Java. Они могут показаться простыми, но их нюансы и взаимодействие с разными типами данных делают их гораздо более интересными и сложными, чем кажется на первый взгляд.
Операторы сравнения
Это те самые инструменты, которые помогают вашей программе принимать решения. Они сравнивают значения и возвращают булевский результат: либо true (истина), либо false (ложь). Проще говоря, они отвечают на вопросы типа «Это больше того?», «Эти два значения равны?» и тому подобные.

Изображение демонстрирует результат двух выражений в Java: str1 == str2 и str1.equals(str2). Первое сравнение возвращает false, так как сравниваются ссылки на объекты, а не их содержимое. Второе — true, поскольку метод equals() сравнивает строки по значению
В арсенале Java есть шесть основных operator сравнения:
int a = 10; int b = 20; System.out.println(a == b); // false (равно) System.out.println(a != b); // true (не равно) System.out.println(a > b); // false (больше) System.out.println(a < b); // true (меньше) System.out.println(a >= b); // false (больше или равно) System.out.println(a <= b); // true (меньше или равно)
На первый взгляд, всё кажется предельно ясным. Но не торопитесь — у операторов сравнения есть несколько подводных камней, особенно когда дело касается сравнения объектов, а не примитивных типов.
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);  // false! Почему?
Удивлены? Дело в том, что == для объектов сравнивает не содержимое, а ссылки — указывают ли они на один и тот же объект в памяти. В нашем случае str1 и str2 — это два разных объекта с одинаковым содержимым. Для сравнения содержимого нужно использовать метод equals():
System.out.println(str1.equals(str2)); // true
Ещё одна интересная особенность — сравнение чисел с плавающей точкой (float, double). Из-за особенностей их представления в компьютере, прямое сравнение на равенство может дать неожиданные результаты:
double a = 0.1 + 0.2; double b = 0.3; System.out.println(a == b); // false, потому что a на самом деле 0.30000000000000004
Это не баг Java, а особенность двоичного представления дробных чисел. Для надежного сравнения чисел с плавающей точкой лучше использовать допустимую погрешность
System.out.println(Math.abs(a - b) < 0.0001); // true
Операторы сравнения чаще всего используются в условных конструкциях, таких как if, while и for:
if (age >= 18) {
    System.out.println("Добро пожаловать во взрослую жизнь!");
} else {
    System.out.println("Подрасти ещё немного.");
}
Правильное использование operator сравнения критически важно для создания корректной логики программы. Одна ошибка в сравнении — и ваша программа может пойти по совершенно неожиданному пути, оставляя вас в недоумении и с кучей дебаггинга.
Логические
Операции логики
Это инструменты для работы с булевыми значениями, которые позволяют строить сложные условия и принимать решения на их основе. Если сравнить программирование с детективным расследованием, то логические операторы — это те самые связи между уликами, которые помогают найти преступника… или хотя бы исправить баг в коде.

Эта иллюстрация демонстрирует разницу между операторами && и & в Java. В верхнем блоке показан безопасный способ проверки условий, при котором потенциально опасный метод не вызывается, если результат уже известен. В нижнем — пример, где использование & приводит к выполнению метода несмотря на то, что логическое значение уже определено. Такой код может привести к исключениям.
В Java используются три основных логических оператора:
boolean isRaining = true; boolean hasUmbrella = false; // Логическое И (AND) System.out.println(isRaining && hasUmbrella); // false - дождь идет, но зонта нет // Логическое ИЛИ (OR) System.out.println(isRaining || hasUmbrella); // true - хотя бы одно условие истинно // Логическое НЕ (NOT) System.out.println(!isRaining); // false - отрицание истины дает ложь
Оператор && (логическое И) вернет true только если оба операнда истинны. Это как двойная проверка безопасности — должны быть выполнены все условия.
Оператор || (логическое ИЛИ) более снисходителен и вернет true, если хотя бы один из операндов истинен. Это как выбор между пиццей и суши — любой вариант вас устроит.
Оператор ! (логическое НЕ) просто инвертирует значение — превращает true в false и наоборот. Это как переключатель света — щелк, и всё наоборот.
Разница между & и &&, | и ||
Здесь мы подошли к одному из тех моментов, когда Java показывает свое коварство. Помимо стандартных логических операторов (&&, ||), в языке есть их побитовые аналоги (&, |), которые тоже можно использовать для логических операций. Но есть существенная разница.
boolean a = false; boolean b = true; // Оба выражения дадут одинаковый результат для этих значений System.out.println(a && b); // false System.out.println(a & b); // false
Ключевое отличие заключается в «коротком замыкании» (short-circuit evaluation). Операторы && и || не вычисляют правый операнд, если результат уже определен по левому.
boolean a = false;
boolean b = someMethodThatMightThrowException();  // Этот метод не будет вызван!
if (a && b) {  // Так как a уже false, Java не станет вычислять b
    System.out.println("Сюда мы никогда не попадем");
}
А вот побитовые операторы & и | всегда вычисляют оба операнда:
boolean a = false;
boolean b = someMethodThatWillDefinitelyBeExecuted();  // Этот метод будет вызван!
if (a & b) {  // Даже если a уже false, Java всё равно вычислит b
    System.out.println("Сюда мы тоже никогда не попадем");
}
Это может иметь серьезные последствия, особенно если вычисление второго операнда имеет побочные эффекты или может вызвать исключение.
Таблица истинности для логических:
| A | B | A && B | A || B | !A | 
|---|---|---|---|---|
| true | true | true | true | false | 
| true | false | false | true | false | 
| false | true | false | true | true | 
| false | false | false | false | true | 
Логические операторы — это мощные инструменты для управления потоком выполнения программы. Они позволяют создавать сложные условия и принимать решения на основе комбинации различных факторов. Но как и с любым мощным инструментом, с ними нужно обращаться осторожно, особенно когда речь идет о выборе между побитовыми и логическими версиями.
Побитовые
Это тот темный уголок Java, куда обычные разработчики заглядывают примерно с той же частотой, с какой средний житель мегаполиса посещает канализационные коллекторы. И примерно с таким же восторгом. Однако, как и канализация, они критически важны для функционирования системы, особенно когда речь идет о низкоуровневом программировании, оптимизации производительности или работе с битовыми масками.
Основные побитовые operator в Java работают с отдельными битами целочисленных типов (byte, short, int, long):
int a = 5; // В двоичном представлении: 00000000 00000000 00000000 00000101 int b = 3; // В двоичном представлении: 00000000 00000000 00000000 00000011 // Побитовое И (AND) System.out.println(a & b); // 1 (00000001) - только 1-й бит включен в обоих числах // Побитовое ИЛИ (OR) System.out.println(a | b); // 7 (00000111) - включены все биты, которые включены хотя бы в одном числе // Побитовое исключающее ИЛИ (XOR) System.out.println(a ^ b); // 6 (00000110) - включены биты, которые различаются в обоих числах // Побитовое НЕ (NOT) System.out.println(~a); // -6 (11111111 11111111 11111111 11111010) - инвертирует все биты
Для тех, кто прогуливал школьную информатику (или не дошел до этой темы): двоичная система — это когда числа представляются последовательностью нулей и единиц. Каждый разряд — это бит, который может быть либо включен (1), либо выключен (0). Например, число 5 в двоичной системе — это 101 (из десятичной системы: 1×4 + 0×2 + 1×1 = 5).
Операторы сдвига — это отдельная тема, которая вызывает панический ужас у многих программистов. Они перемещают биты числа влево или вправо:
int x = 5; // 00000101 в двоичной системе // Сдвиг влево (умножение на 2 в степени сдвига) System.out.println(x << 1); // 10 (00001010) - каждый бит сдвинут на 1 позицию влево System.out.println(x << 2); // 20 (00010100) - каждый бит сдвинут на 2 позиции влево // Сдвиг вправо с сохранением знака System.out.println(x >> 1); // 2 (00000010) - каждый бит сдвинут на 1 позицию вправо // Сдвиг вправо с заполнением нулями (беззнаковый сдвиг) System.out.println(x >>> 1); // 2 (00000010) - для положительных чисел работает так же, как >>
Разница между >> и >>> становится заметной для отрицательных чисел:
int y = -5; // 11111111 11111111 11111111 11111011 в двоичной системе (дополнительный код) // Сдвиг вправо с сохранением знака System.out.println(y >> 1); // -3 (11111111 11111111 11111111 11111101) - старший бит остается 1 // Сдвиг вправо с заполнением нулями System.out.println(y >>> 1); // 2147483645 (01111111 11111111 11111111 11111101) - старший бит становится 0
Когда применять эти странные операторы? Вот несколько реальных сценариев:
- Битовые флаги и маски — когда нужно упаковать несколько булевых значений в одно целое число для экономии памяти.
 - Низкоуровневая оптимизация — умножение и деление на степени двойки с помощью сдвигов работает быстрее.
 - Работа с цветами в графике — каждый компонент RGB можно упаковать в 32-битное целое.
 - Шифрование и хеширование — многие алгоритмы криптографии используют побитовые операции.
 
Это как хирургические инструменты программиста: крайне полезны в специфических ситуациях, но в повседневной работе с ними лучше быть предельно осторожным. Неправильное использование может привести к коду, который будет вызывать истерический смех у опытных разработчиков и слезы отчаяния у тех, кому придется его поддерживать.
Тернарный
Это тот самый инструмент, который или решительно упрощает ваш код, или превращает его в нечитаемую головоломку. По сути, это сокращенная форма конструкции if-else, упакованная в одну строчку. Иногда — элегантный способ выразить простое условие, а иногда — причина для «разговора по душам» с тимлидом.
Синтаксис тернарного operator выглядит так:
условие ? выражение1 : выражение2
Если условие истинно (true), вычисляется и возвращается выражение1. В противном случае — выражение2. Простой пример:
int age = 20;
String status = (age >= 18) ? "взрослый" : "несовершеннолетний";
// Эквивалентно:
// String status;
// if (age >= 18) {
//     status = "взрослый";
// } else {
//     status = "несовершеннолетний";
// }
Выглядит довольно безобидно, правда? Но тернарный оператор может стать настоящим монстром, когда разработчики начинают его вкладывать друг в друга:
int age = 20; int experience = 1; String rating = (age >= 18) ? ((experience > 5) ? "опытный специалист" : "начинающий специалист") : "стажер";
Эта конструкция — эквивалент следующего кода:
String rating;
if (age >= 18) {
    if (experience > 5) {
        rating = "опытный специалист";
    } else {
        rating = "начинающий специалист";
    }
} else {
    rating = "стажер";
}
Видите разницу? Блочная структура гораздо нагляднее показывает логику. Вложенные тернарные операторы превращают код в матрешку, которую сложно разбирать.
Еще одна тонкость заключается в том, что тернарный operator — это выражение, а не инструкция. Это значит, что он должен возвращать значение, и оба его ветвления должны быть совместимыми типами:
// Так нельзя:
(x > 0) ? System.out.println("Положительное") : System.out.println("Отрицательное");
// Надо так:
String message = (x > 0) ? "Положительное" : "Отрицательное";
System.out.println(message);
Золотое правило использования тернарного оператора: применяйте его только для простых условий и присваиваний. Если вы начинаете строить многоэтажные конструкции или вложенные тернарные операторы — это повод задуматься об использовании обычных условий if-else. Код должен быть не только функциональным, но и читаемым. Особенно через полгода, когда вы к нему вернетесь и попытаетесь понять, что же вы такое написали.
Приоритет и порядок выполнения
Это та самая таинственная иерархия, которая определяет, в каком порядке будут выполняться операции в сложных выражениях. Примерно как в школьной математике — сначала умножение и деление, потом сложение и вычитание. Только в Java этих уровней гораздо больше, и запомнить их все — задача, сравнимая с заучиванием телефонной книги.
Вот упрощенная таблица приоритетов (от высшего к низшему):
| Приоритет | Операторы | Описание | 
|---|---|---|
| 1 | (), [], . | Скобки, доступ к элементам массива, доступ к полям | 
| 2 | ++, —, +, -, ~, ! | Унарные операторы | 
| 3 | *, /, % | Умножение, деление, остаток | 
| 4 | +, — | Сложение, вычитание | 
| 5 | <<, >>, >>> | Побитовые сдвиги | 
| 6 | <, <=, >, >=, instanceof | Сравнения | 
| 7 | ==, != | Равенство/неравенство | 
| 8 | & | Побитовое И | 
| 9 | ^ | Побитовое исключающее ИЛИ | 
| 10 | | | Побитовое ИЛИ | 
| 11 | && | Логическое И | 
| 12 | || | Логическое ИЛИ | 
| 13 | ?: | Тернарный оператор | 
| 14 | =, +=, -=, *=, /=, etc. | Операторы присваивания | 
Когда мы пишем сложное выражение, компилятор Java использует эту таблицу, чтобы решить, что вычислять первым
int result = 2 + 3 * 4; // 14, а не 20, потому что * имеет приоритет над +
Но есть еще один нюанс — ассоциативность. Она определяет, в каком порядке выполняются operator с одинаковым приоритетом. Большинство бинарных операторов в Java являются левоассоциативными, то есть выполняются слева направо:
int a = 10 - 5 - 2; // (10 - 5) - 2 = 3, а не 10 - (5 - 2) = 7
Но есть исключения. Например, операторы присваивания и унарные операторы являются правоассоциативными:
int a, b, c; a = b = c = 5; // Эквивалентно: a = (b = (c = 5))
Здесь значение течет справа налево: сначала c получает значение 5, затем b получает значение c, и наконец a получает значение b.
Запомнить все эти правила практически невозможно, да и не нужно. Гораздо важнее использовать скобки, чтобы явно указать порядок вычислений:
int result = (2 + 3) * 4; // Теперь результат 20, как мы и хотели
Скобки имеют высший приоритет и могут изменить естественный порядок выполнения операций. Это не только делает код правильным, но и более читаемым — человеку не придется мысленно воспроизводить таблицу приоритетов, чтобы понять ваше выражение.
Правильно расставленные скобки — это как дорожные знаки на сложном перекрестке. Они могут раздражать опытных водителей, но для новичков (и для тех, кто будет поддерживать ваш код в будущем) они незаменимы. И помните: лучше лишняя пара скобок, чем многочасовой дебаггинг из-за неверно вычисленного выражения.
// Пример 1: Использование побитовых операций для работы с флагами public class BitFlagsExample { // Определение битовых флагов для прав доступа (как в Unix) private static final int READ = 4;     // 100 в двоичной системе private static final int WRITE = 2;    // 010 в двоичной системе private static final int EXECUTE = 1;  // 001 в двоичной системе
public static void main(String[] args) {
    // Пользователь с правами на чтение и запись
    int userPermissions = READ | WRITE;  // 110 в двоичной системе, 6 в десятичной
   
    // Проверка наличия прав
    boolean canRead = (userPermissions & READ) != 0;      // true
    boolean canWrite = (userPermissions & WRITE) != 0;    // true
    boolean canExecute = (userPermissions & EXECUTE) != 0; // false
   
    System.out.println("Права доступа пользователя:");
    System.out.println("Чтение: " + canRead);
    System.out.println("Запись: " + canWrite);
    System.out.println("Выполнение: " + canExecute);
   
    // Добавление права на выполнение
    userPermissions |= EXECUTE;  // Теперь 111 в двоичной системе, 7 в десятичной
   
    // Проверка после обновления
    canExecute = (userPermissions & EXECUTE) != 0;  // true
    System.out.println("Право на выполнение после обновления: " + canExecute);
   
    // Отзыв права на запись
    userPermissions &= ~WRITE;  // Удаляем бит WRITE, теперь 101 в двоичной системе, 5 в десятичной
   
    canWrite = (userPermissions & WRITE) != 0;  // false
    System.out.println("Право на запись после отзыва: " + canWrite);
}
}
// Пример 2: Эффективная проверка четности числа public class ParityCheckExample { public static void main(String[] args) { int number = 42;
    // Неэффективный способ проверки четности
    boolean isEvenUsingModulo = (number % 2 == 0);
   
    // Эффективный способ с использованием побитовой операции
    boolean isEvenUsingBitwise = (number & 1) == 0;
   
    System.out.println("Число " + number + " четное? " + isEvenUsingBitwise);
   
    // Демонстрация для нескольких чисел
    for (int i = 0; i < 5; i++) {
        System.out.println("Число " + i + " четное? " + ((i & 1) == 0));
    }
}
}
// Пример 3: Краткое вычисление в логических выражениях public class ShortCircuitExample { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5}; int index = 3;
    // Безопасная проверка с использованием короткого замыкания
    if (index >= 0 && index < numbers.length && numbers[index] > 3) {
        System.out.println("Элемент на позиции " + index + " больше 3");
    }
   
    // Опасная проверка без короткого замыкания
    // Если index < 0 или index >= numbers.length, будет исключение ArrayIndexOutOfBoundsException
    // if (index >= 0 & index < numbers.length & numbers[index] > 3) {
    //     System.out.println("Этот код может выбросить исключение!");
    // }
   
    // Использование || для обработки специальных случаев
    String input = null;
    String name = (input != null && !input.trim().isEmpty()) ? input : "Гость";
    System.out.println("Привет, " + name);
}
}
// Пример 4: Общие ошибки начинающих public class CommonMistakesExample { public static void main(String[] args) { // Ошибка 1: Перепутать = и ==
int a = 5;
if (a = 10) { // Ошибка компиляции: присваивание возвращает значение типа int, который нельзя использовать в условии if
System.out.println("Это не будет выполнено в Java");
}
    // Ошибка 2: Неверное использование инкремента
    int i = 5;
    int j = i++;
    System.out.println("i = " + i + ", j = " + j);  // i = 6, j = 5
   
    int x = 5;
    int y = ++x;
    System.out.println("x = " + x + ", y = " + y);  // x = 6, y = 6
   
    // Ошибка 3: Сложное выражение без скобок
    int result = 2 + 3 * 4;  // Многие новички ожидают 20, но получают 14
    System.out.println("2 + 3 * 4 = " + result);
   
    result = (2 + 3) * 4;  // С правильными скобками получаем 20
    System.out.println("(2 + 3) * 4 = " + result);
   
    // Ошибка 4: Целочисленное деление
    double divisionResult = 10 / 4;  // Ожидаемо 2.5, но получаем 2.0
    System.out.println("10 / 4 = " + divisionResult);
   
    divisionResult = 10.0 / 4;  // Правильно: 2.5
    System.out.println("10.0 / 4 = " + divisionResult);
}
}
Итоги и выводы
Итак, мы прошли извилистый путь через лес Java-операторов, от простых арифметических до коварных побитовых. Что же можно вынести из этого путешествия, кроме легкого головокружения и смутного ощущения, что программирование — это одновременно и наука, и черная магия?
Во-первых, операторы — это не просто синтаксический сахар, а фундаментальные инструменты языка, которые определяют логику выполнения программы. Без них наш код был бы просто набором бессмысленных деклараций и определений.
Во-вторых, наиболее часто используемые operator в повседневной разработке — это:
- Операторы присваивания (=, +=, -=)
 - Арифметические operator (+, -, *, /)
 - Операторы сравнения (==, !=, <, >)
 - Логические операторы (&&, ||, !)
 
Побитовые операторы и сдвиги — это уже инструменты для специфических задач, и большинство программистов могут прожить долгую и счастливую карьеру, ни разу не используя >>>.
В-третьих, никогда нельзя недооценивать потенциал operator вызывать неожиданное поведение программы. Особенно это касается:
- Оператора сравнения объектов == (используйте equals() для сравнения содержимого)
 - Целочисленного деления (не забывайте о явном приведении типов, если нужен дробный результат)
 - Инкремента/декремента в сложных выражениях (лучше просто избегать такого)
 - Побитовых операций с отрицательными числами (осторожно с дополнительным кодом)
 
Наконец, несколько практических советов для чистого и понятного кода:
- Используйте скобки даже там, где они не обязательны. Это сделает ваш код более читаемым и защитит от ошибок, связанных с приоритетом operator .
 - Избегайте слишком сложных выражений. Разбивайте их на несколько простых с промежуточными переменными. Код, который легко читать, легче поддерживать.
 - Комментируйте неочевидные операторы. Особенно это касается побитовых операций и сложных логических условий.
 - Тестируйте граничные случаи. Они могут вести себя неожиданно при экстремальных значениях операндов.
 
Операторы Java — это не просто инструменты для манипуляции данными, а средство выражения вашей логики, ваших алгоритмов, вашего подхода к решению задачи. Понимание их тонкостей не только помогает писать корректный код, но и освобождает ваше мышление для решения более интересных проблем, чем отладка странного поведения программы из-за неправильно использованного инкремента.
И помните: лучший оператор — тот, который делает ваш код более понятным, а не более «умным» или компактным. Простота — высшая форма элегантности в программировании.
Если вы хотите углубить свои знания в Java и научиться применять операторы на практике в реальных проектах, рекомендуем ознакомиться с подборкой лучших курсов по Java-программированию. На странице собраны актуальные обучающие программы для начинающих и продолжающих разработчиков.
Рекомендуем посмотреть курсы по Java
| Курс | Школа | Цена | Рассрочка | Длительность | Дата начала | Ссылка на курс | 
|---|---|---|---|---|---|---|
| 
             
                Java-разработчик             
                        
         | 
                
             
                Eduson Academy             
                        
            
                75 отзывов
                     | 
                        
             Цена 
                                                                                            
                        Ещё -5% по промокоду 
                    
                                                                        
                    115 000 ₽                 
                 | 
                
             
                    От                 
                                
                    9 583 ₽/мес                                         
                
                            0% на 24 месяца                         
                    
                    15 476 ₽/мес                 
             | 
        
             Длительность 
                        
                7.5 месяцев            
                                 | 
        
             Старт 
            
                                скоро                                 
        
                        Пн,Ср, 19:00-22:00                     
                 | 
        Ссылка на курс | 
| 
             
                Профессия Java-разработчик             
                        
         | 
                
             
                Skillbox             
                        
            
                168 отзывов
                     | 
                        
             Цена 
                                                                                            
                        Ещё -20% по промокоду 
                    
                                                                        
                    173 217 ₽                 
                
                    346 434 ₽                 
             | 
                
             
                    От                 
                                
                    5 095 ₽/мес                                         
                
                            Это минимальный ежемесячный платеж. От Skillbox без %.                         
                    
                    8 692 ₽/мес                 
             | 
        
             Длительность 
                        
                9 месяцев            
                                    
                    Эта длительность обучения очень примерная, т.к. все занятия в записи (но преподаватели ежедневно проверяют ДЗ). Так что можно заниматься более интенсивно и быстрее пройти курс или наоборот.                 
             | 
        
             Старт 
            
                                идет донабор                                             
         | 
        Ссылка на курс | 
| 
             
                Java-разработчик с нуля             
                        
         | 
                
             
                Нетология             
                        
            
                43 отзыва
                     | 
                        
             Цена 
                                                                                                                        с промокодом kursy-online
                                                                                                
                    116 400 ₽                 
                
                    258 720 ₽                 
             | 
                
             
                    От                 
                                
                    3 593 ₽/мес                                         
                
                            Без переплат на 2 года.                         
                     | 
        
             Длительность 
                        
                14 месяцев            
                                 | 
        
             Старт 
            
                                10 ноября                                             
         | 
        Ссылка на курс | 
| 
             
                Java-разработчик             
                        
         | 
                
             
                Академия Синергия             
                        
            
                30 отзывов
                     | 
                        
             Цена 
                                                                                    
                    103 236 ₽                 
                
                    258 090 ₽                 
             | 
                
             
                    От                 
                                
                    3 585 ₽/мес                                     
                
                    10 240 ₽/мес                 
             | 
        
             Длительность 
                        
                6 месяцев            
                                 | 
        
             Старт 
            
                                11 ноября                                             
         | 
        Ссылка на курс | 
| 
             
                Java-разработка             
                         | 
                
             
                Moscow Digital Academy             
                        
            
                66 отзывов
                     | 
                        
             Цена 
                                                                                    
                    132 720 ₽                 
                
                    165 792 ₽                 
             | 
                
             
                    От                 
                                
                    5 530 ₽/мес                                         
                
                            на 12 месяца.                         
                    
                    6 908 ₽/мес                 
             | 
        
             Длительность 
                        
                12 месяцев            
                                 | 
        
             Старт 
            
                                в любое время                                             
         | 
        Ссылка на курс | 
                                                      
                          
                          
                          Зачем программисту знать, как работает алгоритм из 1956 года?
Алгоритм Дейкстры — это не скучная теория, а практический инструмент, который скрыт в вашем навигаторе, играх и сетевых протоколах. Хотите понять, как он всё это делает? Тогда читайте дальше.
                                                      
                          
                          
                          Стажировки в IT: что это, зачем нужны и как попасть
Хотите попасть на стажировку в IT-компанию, но не знаете, с чего начать? В статье вы узнаете, какие форматы стажировок существуют, как выбрать подходящую программу и подготовиться к отбору, чтобы получить оффер.
                                                      
                          
                          
                          Всё, что нужно знать о 3D-анимации: мифы и реальность
Что такое 3D-анимация? Мы расскажем, как она создается, какие программы используют специалисты, и какие вызовы стоят перед индустрией. Узнайте больше!
                                                      
                          
                          
                          Как работать со шрифтами в Figma: пошаговое руководство и советы дизайнеру
В этой статье мы разберём шрифты в фигме от установки до продвинутых функций и плагинов. Узнаете, как выбрать гарнитуру, настроить её и сохранить типографическую целостность макета.