Логический тип boolean — true, false и логические операции
Изучаем тип boolean, операторы сравнения, логические операторы AND, OR, NOT, таблицы истинности и short-circuit вычисления
Зачем нужен логический тип?
В повседневной жизни мы постоянно принимаем решения на основе условий: «если на улице дождь — возьму зонтик», «если я голоден — поем». Компьютеры делают то же самое, но на основе логических значений: true (истина) или false (ложь).
Тип boolean — самый простой тип в Java. Он может хранить только два значения: true или false. Никаких чисел, никаких символов — только «да» или «нет», «истина» или «ложь».
Это как выключатель света: он может быть только включён (true) или выключен (false). Нет промежуточного состояния.
Объявление и присваивание
Объявление переменной boolean идентично другим типам:
public class BooleanBasic {
public static void main(String[] args) {
boolean isRaining = true;
boolean isSunny = false;
boolean temperatureAboveZero = true;
System.out.println("Идёт дождь: " + isRaining);
System.out.println("Солнечно: " + isSunny);
System.out.println("Температура выше нуля: " + temperatureAboveZero);
}
}
Важно: В Java (в отличие от C/C++) нельзя использовать числа 0 и 1 как false и true. Также нельзя использовать true/false как числа. Выражение boolean x = 1; вызовет ошибку компиляции.
boolean также поддерживает вывод типа (var) с Java 10:
public class BooleanVar {
public static void main(String[] args) {
var flag = true;
var result = false;
System.out.println("flag: " + flag);
System.out.println("result: " + result);
}
}
Операторы сравнения
Операторы сравнения сравнивают два значения и возвращают boolean:
public class ComparisonOperators {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a == b: " + (a == b));
System.out.println("a != b: " + (a != b));
System.out.println("a > b: " + (a > b));
System.out.println("a < b: " + (a < b));
System.out.println("a >= b: " + (a >= b));
System.out.println("a <= b: " + (a <= b));
String s1 = "Привет";
String s2 = "Привет";
String s3 = "Мир";
System.out.println("s1 == s2: " + (s1 == s2));
System.out.println("s1.equals(s2): " + s1.equals(s2));
System.out.println("s1.equals(s3): " + s1.equals(s3));
}
}
| Оператор | Описание | Пример |
|---|---|---|
| == | Равно | 5 == 5 → true |
| != | Не равно | 5 != 3 → true |
| > | Больше | 5 > 3 → true |
| < | Меньше | 5 < 3 → false |
| >= | Больше или равно | 5 >= 5 → true |
| <= | Меньше или равно | 5 <= 3 → false |
Не путайте оператор присваивания = с оператором сравнения ==. Один знак «равно» присваивает значение, два — сравнивает. Это одна из самых частых ошибок новичков!
Логический оператор AND (&&)
Оператор && (логическое И) возвращает true только когда оба условия истинны. Это как двухзамочный замок: оба ключа должны быть повёрнуты, чтобы открыть дверь.
public class AndOperator {
public static void main(String[] args) {
boolean sunny = true;
boolean warm = true;
boolean raining = false;
boolean goSwimming = sunny && warm;
boolean goHiking = sunny && !raining;
System.out.println("Идти купаться: " + goSwimming);
System.out.println("Идти на прогулку: " + goHiking);
int age = 25;
boolean hasID = true;
boolean canEnter = age >= 18 && hasID;
System.out.println("Можно войти: " + canEnter);
}
}
Таблица истинности для AND (&&)
| A | B | A && B |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
Запомните: для AND нужна оба условия true. Достаточно одному быть false, чтобы результат был false.
Логический оператор OR (||)
Оператор || (логическое ИЛИ) возвращает true когда хотя бы одно условие истинно. Это как электрическая цепь с двумя выключателями параллельно: достаточно включить любой, чтобы лампа зажглась.
public class OrOperator {
public static void main(String[] args) {
boolean hasTicket = true;
boolean hasVIP = false;
boolean hasInvitation = true;
boolean canEnter = hasTicket || hasVIP || hasInvitation;
boolean isWeekend = true;
boolean isHoliday = false;
boolean dayOff = isWeekend || isHoliday;
System.out.println("Можно войти: " + canEnter);
System.out.println("Выходной: " + dayOff);
int score = 85;
boolean passed = score >= 60 || score >= 80;
System.out.println("Экзамен сдан: " + passed);
}
}
Таблица истинности для OR (||)
| A | B | A || B |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
Для OR достаточно одного true. Достаточно одному условию быть true, чтобы результат был true.
Логический оператор NOT (!)
Оператор ! (логическое НЕ) инвертирует значение: true становится false, а false — true. Это как перевёртывание выключателя.
public class NotOperator {
public static void main(String[] args) {
boolean isDaytime = true;
boolean isNighttime = !isDaytime;
boolean isRaining = false;
boolean isNotRaining = !isRaining;
System.out.println("День: " + isDaytime);
System.out.println("Ночь: " + isNighttime);
System.out.println("Не дождь: " + isNotRaining);
int age = 15;
boolean isAdult = age >= 18;
boolean isMinor = !isAdult;
System.out.println("Совершеннолетний: " + isAdult);
System.out.println("Несовершеннолетний: " + isMinor);
}
}
Таблица истинности для NOT (!)
| A | !A |
|---|---|
| true | false |
| false | true |
Приоритет операторов
Приоритет определяет порядок вычислений. NOT (!) имеет наивысший приоритет, затем AND (&&), затем OR (||):
public class PriorityExample {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
boolean result1 = a || b && c;
System.out.println("a || b && c: " + result1);
boolean result2 = (a || b) && c;
System.out.println("(a || b) && c: " + result2);
boolean result3 = !a && b;
System.out.println("!a && b: " + result3);
boolean result4 = !(a && b);
System.out.println("!(a && b): " + result4);
}
}
Рекомендация: Используйте скобки для ясности! Даже если вы помните приоритет, скобки делают код читаемым: (a || b) && c понятнее, чем a || b && c.
Порядок приоритета (от высшего к низшему):
- ! (NOT) — наивысший приоритет
- && (AND) — средний приоритет
- || (OR) — низкий приоритет
Short-circuit вычисления
Java использует «ленивые» (short-circuit) вычисления для && и ||. Это значит, что второе условие вычисляется только если это необходимо:
Для && (AND):
Если первое условие false — второе НЕ вычисляется, потому что результат и так false.
public class ShortCircuitAnd {
public static void main(String[] args) {
int x = 0;
boolean result = (x != 0) && (10 / x > 2);
System.out.println("Результат: " + result);
x = 5;
result = (x != 0) && (10 / x > 2);
System.out.println("Результат: " + result);
}
}
Когда x = 0, первое условие (x != 0) — false. Второе условие (10 / x > 2) НЕ вычисляется, поэтому деления на ноль не происходит!
Для || (OR):
Если первое условие true — второе НЕ вычисляется, потому что результат и так true.
public class ShortCircuitOr {
public static void main(String[] args) {
int x = 0;
boolean result = (x == 0) || (10 / x > 2);
System.out.println("Результат: " + result);
x = 5;
result = (x == 0) || (10 / x > 2);
System.out.println("Результат: " + result);
}
}
Когда x = 0, первое условие (x == 0) — true. Второе условие НЕ вычисляется, деления на ноль не происходит!
Битовые vs логические операторы: Существуют также битовые операторы & (AND) и | (OR), которые НЕ используют short-circuit. Всегда используйте логические && и || для логических операций!
Составные логические операторы
Помимо основных, существуют составные операторы:
public class CompoundOperators {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean xor = a ^ b;
System.out.println("XOR (a ^ b): " + xor);
boolean nand = !(a && b);
System.out.println("NAND (!(a && b)): " + nand);
boolean nor = !(a || b);
System.out.println("NOR (!(a || b)): " + nor);
}
}
Таблица истинности для XOR (^)
| A | B | A ^ B |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
XOR (исключающее ИЛИ) возвращает true только когда операнды различаются. Это полезно для простого шифрования и обмена значений.
boolean в условиях if/else
boolean — основа конструкций условий в Java:
public class BooleanInConditions {
public static void main(String[] args) {
int age = 20;
boolean hasTicket = true;
if (age >= 18 && hasTicket) {
System.out.println("Добро пожаловать!");
} else if (age >= 18) {
System.out.println("Нужен билет");
} else {
System.out.println("Только для взрослых");
}
boolean isWeekend = true;
boolean isHoliday = false;
if (isWeekend || isHoliday) {
System.out.println("Можно отдохнуть!");
} else {
System.out.println("Рабочий день");
}
if (!isHoliday) {
System.out.println("Нужно работать");
}
}
}
В условии if можно писать if (flag) вместо if (flag == true) — это эквивалентно и считается лучшим стилем. Аналогично if (!flag) вместо if (flag == false).
Тернарный оператор
Тернарный оператор ?: — компактная запись условия с возвратом значения:
public class TernaryOperator {
public static void main(String[] args) {
int age = 25;
String status = (age >= 18) ? "взрослый" : "ребёнок";
System.out.println("Статус: " + status);
int a = 10, b = 20;
int max = (a > b) ? a : b;
System.out.println("Максимум: " + max);
boolean isPositive = true;
int value = isPositive ? 1 : -1;
System.out.println("Значение: " + value);
}
}
Формат: условие ? значение_если_true : значение_если_false. Это сокращённая запись if/else, когда нужно выбрать одно из двух значений.
Практический пример: калькулятор скидок
public class DiscountCalculator {
public static void main(String[] args) {
double price = 5000;
int age = 25;
boolean isVIP = true;
boolean isBirthday = false;
int purchaseCount = 12;
boolean isStudent = age >= 18 && age <= 25;
boolean hasLoyalty = purchaseCount >= 10;
double discount = 0;
if (isVIP) {
discount = 15;
} else if (isStudent) {
discount = 10;
}
if (isBirthday) {
discount += 5;
}
if (hasLoyalty) {
discount += 3;
}
discount = Math.min(discount, 30);
double finalPrice = price * (1 - discount / 100);
System.out.println("=== Калькулятор скидок ===");
System.out.printf("Цена: %.2f руб.%n", price);
System.out.println("VIP: " + isVIP);
System.out.println("Студент: " + isStudent);
System.out.println("День рождения: " + isBirthday);
System.out.println("Постоянный клиент: " + hasLoyalty);
System.out.printf("Скидка: %.0f%%%n", discount);
System.out.printf("Итого: %.2f руб.%n", finalPrice);
}
}
Частые ошибки новичков
Ошибка 1: Путаница = и ==
boolean flag = true;
if (flag = false) { ... } // Присваивает false! Всегда false.
if (flag == false) { ... } // Сравнивает. Правильно.
Ошибка 2: Использование чисел вместо boolean
int x = 1;
if (x) { ... } // ОШИБКА компиляции!
if (x != 0) { ... } // Правильно
Ошибка 3: Избыточные сравнения
boolean flag = true;
if (flag == true) { ... } // Избыточно!
if (flag) { ... } // Лучше
if (!flag) { ... } // Для false
Итоги урока
- boolean хранит только true или false
- Операторы сравнения: ==, !=, >, <, >=, <=
- Логические операторы: && (AND), || (OR), ! (NOT)
- Таблицы истинности: AND — оба true, OR — хотя бы один true, NOT — инверсия
- Short-circuit: && останавливается на первом false, || — на первом true
- Приоритет: ! > && > ||
- Используйте скобки для ясности
- Тернарный оператор ?: для компактного выбора значения
- Не путайте = (присваивание) и == (сравнение)
- Пишите if (flag), а не if (flag == true)
Проверяем понимание
6 вопросов