0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>9 мар 2021</li>
2
<ul><li>9 мар 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Узнаём про булев тип, операции сравнения, условные конструкции if-else, switch и тернарный оператор. Осмысляем instanceof. Всё подробно и с примерами.</p>
4
</ul><p>Узнаём про булев тип, операции сравнения, условные конструкции if-else, switch и тернарный оператор. Осмысляем instanceof. Всё подробно и с примерами.</p>
5
<p>Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.</p>
5
<p>Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.</p>
6
<p><strong>Boolean</strong> - это тип данных, переменные которого принимают одно из значений:</p>
6
<p><strong>Boolean</strong> - это тип данных, переменные которого принимают одно из значений:</p>
7
<ul><li><strong>true</strong>(истина, "да", логическая единица "<strong>1</strong>");</li>
7
<ul><li><strong>true</strong>(истина, "да", логическая единица "<strong>1</strong>");</li>
8
<li><strong>false</strong>(ложь, "нет", логический ноль "<strong>0</strong>").</li>
8
<li><strong>false</strong>(ложь, "нет", логический ноль "<strong>0</strong>").</li>
9
</ul><p>Булевы переменные в Java создают так:</p>
9
</ul><p>Булевы переменные в Java создают так:</p>
10
boolean a = true; boolean b = false;<p>Значение типа boolean возвращают операции сравнения, логические операции и их сочетания. Выражения с ними - это по сути<strong>условные высказывания</strong>, которые могут быть правдивы или нет.</p>
10
boolean a = true; boolean b = false;<p>Значение типа boolean возвращают операции сравнения, логические операции и их сочетания. Выражения с ними - это по сути<strong>условные высказывания</strong>, которые могут быть правдивы или нет.</p>
11
<p>В каждой операции сравнения участвуют два операнда. А выглядит она как обычное неравенство в математике. Например: a > b.</p>
11
<p>В каждой операции сравнения участвуют два операнда. А выглядит она как обычное неравенство в математике. Например: a > b.</p>
12
<p>Операция сравнения возвращает:</p>
12
<p>Операция сравнения возвращает:</p>
13
<ul><li>значение true ("истина"), если высказывание с оператором правдивое (условие выполняется),</li>
13
<ul><li>значение true ("истина"), если высказывание с оператором правдивое (условие выполняется),</li>
14
<li>и false ("ложь") - если высказывание с оператором ложное (условие не выполняется).</li>
14
<li>и false ("ложь") - если высказывание с оператором ложное (условие не выполняется).</li>
15
</ul><p>Например, мы хотим сравнить в Java значения переменных a и b. Для этого используем оператор >, который возвращает булево значение (true или false).</p>
15
</ul><p>Например, мы хотим сравнить в Java значения переменных a и b. Для этого используем оператор >, который возвращает булево значение (true или false).</p>
16
<p>a > b равно true, когда значение переменной a больше значения переменной b (операнд слева от > больше правого), а иначе - false.</p>
16
<p>a > b равно true, когда значение переменной a больше значения переменной b (операнд слева от > больше правого), а иначе - false.</p>
17
<p>Пример:</p>
17
<p>Пример:</p>
18
int a = 4; int b = 3; boolean c = a > b; System.out.println(c); --OUTPUT> true<p>Оператор > сравнил операнд слева с операндом справа. Результат сравнения мы присвоили булевой переменной c.</p>
18
int a = 4; int b = 3; boolean c = a > b; System.out.println(c); --OUTPUT> true<p>Оператор > сравнил операнд слева с операндом справа. Результат сравнения мы присвоили булевой переменной c.</p>
19
<p>Так как 4 > 3 (высказывание правдиво), значение переменной c после выполнения кода станет равным true.</p>
19
<p>Так как 4 > 3 (высказывание правдиво), значение переменной c после выполнения кода станет равным true.</p>
20
<p>Один оператор сравнения мы рассмотрели выше, а всего в Java их шесть:</p>
20
<p>Один оператор сравнения мы рассмотрели выше, а всего в Java их шесть:</p>
21
<strong>Оператор сравнения</strong><strong>Обозначение в Java</strong><strong>Пример операции</strong><strong>Результат операции</strong>Меньше<a < btrue, если операнд слева меньше правого, иначе falseБольше>a > btrue, если операнд слева больше правого, иначе falseМеньше или равно<=a <= btrue, если операнд слева<em>меньше</em>правого или они<em>равны</em>, иначе falseБольше или равно>=a >= btrue, если операнд слева<em>больше</em>правого или<em>равен</em>ему, иначе falseРавно==a == btrue, если операнд слева<em>равен</em>операнду справаНе равно!=a != btrue, если операнд слева<em>не равен</em>операнду справа<p>Примеры:</p>
21
<strong>Оператор сравнения</strong><strong>Обозначение в Java</strong><strong>Пример операции</strong><strong>Результат операции</strong>Меньше<a < btrue, если операнд слева меньше правого, иначе falseБольше>a > btrue, если операнд слева больше правого, иначе falseМеньше или равно<=a <= btrue, если операнд слева<em>меньше</em>правого или они<em>равны</em>, иначе falseБольше или равно>=a >= btrue, если операнд слева<em>больше</em>правого или<em>равен</em>ему, иначе falseРавно==a == btrue, если операнд слева<em>равен</em>операнду справаНе равно!=a != btrue, если операнд слева<em>не равен</em>операнду справа<p>Примеры:</p>
22
int a = 6; int b = 7; boolean c = a < b; System.out.println(c); --OUTPUT> true int a = 6; int b = 7; boolean c = a >= b; System.out.println(c); --OUTPUT> false<p>Булевы значения и условные выражения часто используются в условиях операторов ветвления, тернарного оператора и циклов.</p>
22
int a = 6; int b = 7; boolean c = a < b; System.out.println(c); --OUTPUT> true int a = 6; int b = 7; boolean c = a >= b; System.out.println(c); --OUTPUT> false<p>Булевы значения и условные выражения часто используются в условиях операторов ветвления, тернарного оператора и циклов.</p>
23
<p>Оператор ветвления позволяет выбрать и исполнить определённый блок кода в зависимости от срабатывания некоторого условия.</p>
23
<p>Оператор ветвления позволяет выбрать и исполнить определённый блок кода в зависимости от срабатывания некоторого условия.</p>
24
<p>Есть два оператора ветвления (условные конструкции): if-else и switch.</p>
24
<p>Есть два оператора ветвления (условные конструкции): if-else и switch.</p>
25
<p>Оператор if</p>
25
<p>Оператор if</p>
26
<p>Его синтаксис выглядит так:</p>
26
<p>Его синтаксис выглядит так:</p>
27
<p>if (условие) {</p>
27
<p>if (условие) {</p>
28
<p>//код</p>
28
<p>//код</p>
29
<p>} else {</p>
29
<p>} else {</p>
30
<p>//код</p>
30
<p>//код</p>
31
<p>}</p>
31
<p>}</p>
32
<p>В круглых скобках после if указывают условное выражение (высказывание). Если оно истинно (то есть результат его вычисления равен true), то выполняется код в фигурных скобках после условия, иначе выполняется код по ветке else (если она есть).</p>
32
<p>В круглых скобках после if указывают условное выражение (высказывание). Если оно истинно (то есть результат его вычисления равен true), то выполняется код в фигурных скобках после условия, иначе выполняется код по ветке else (если она есть).</p>
33
<p>Примеры:</p>
33
<p>Примеры:</p>
34
if (3 > 2) { System.out.println("Высказывание в скобках правдивое."); } --OUTPUT> Высказывание в скобках правдивое.<p>Проверяем условие в круглых скобках:</p>
34
if (3 > 2) { System.out.println("Высказывание в скобках правдивое."); } --OUTPUT> Высказывание в скобках правдивое.<p>Проверяем условие в круглых скобках:</p>
35
<p>3 > 2?</p>
35
<p>3 > 2?</p>
36
<p>Если да, то в консоль выводим:<em>"Высказывание в скобках правдивое"</em>, иначе ничего не выводим.</p>
36
<p>Если да, то в консоль выводим:<em>"Высказывание в скобках правдивое"</em>, иначе ничего не выводим.</p>
37
<p>Так как 3 и правда больше 2, то в консоли появилось наше сообщение.</p>
37
<p>Так как 3 и правда больше 2, то в консоли появилось наше сообщение.</p>
38
if (3 < 2) { System.out.println("Высказывание в скобках правдивое."); } else { System.out.println("Высказывание в скобках ложное."); } --OUTPUT> Высказывание в скобках ложное.<p>Печатаем "Высказывание в скобках правдивое", если результат вычислений в круглых скобках = true. В ином случае выводим: "Высказывание в скобках ложное".</p>
38
if (3 < 2) { System.out.println("Высказывание в скобках правдивое."); } else { System.out.println("Высказывание в скобках ложное."); } --OUTPUT> Высказывание в скобках ложное.<p>Печатаем "Высказывание в скобках правдивое", если результат вычислений в круглых скобках = true. В ином случае выводим: "Высказывание в скобках ложное".</p>
39
<p>Так как выражение (3 < 2) возвращает false, то и в консоли видим: "Высказывание в скобках ложное".</p>
39
<p>Так как выражение (3 < 2) возвращает false, то и в консоли видим: "Высказывание в скобках ложное".</p>
40
<p>Допустим, мы хотим проверить некое условие, и если оно не выполнилось - проверить другое условие и так далее. Сделать это можно двумя способами.</p>
40
<p>Допустим, мы хотим проверить некое условие, и если оно не выполнилось - проверить другое условие и так далее. Сделать это можно двумя способами.</p>
41
<p><strong>1. Вложенный</strong><strong>if</strong></p>
41
<p><strong>1. Вложенный</strong><strong>if</strong></p>
42
<p>Синтаксис тут такой:</p>
42
<p>Синтаксис тут такой:</p>
43
<p>if (условие1) {</p>
43
<p>if (условие1) {</p>
44
<p>//действия, если условие1 выполнено;</p>
44
<p>//действия, если условие1 выполнено;</p>
45
<p>} else {</p>
45
<p>} else {</p>
46
<p>if (условие2) {</p>
46
<p>if (условие2) {</p>
47
<p>//действия, если условие2 выполнено;</p>
47
<p>//действия, если условие2 выполнено;</p>
48
<p>}</p>
48
<p>}</p>
49
<p><…></p>
49
<p><…></p>
50
<p>else {</p>
50
<p>else {</p>
51
<p>//действия, если все предыдущие условия не выполнились;</p>
51
<p>//действия, если все предыдущие условия не выполнились;</p>
52
<p>}</p>
52
<p>}</p>
53
<p>Пример:</p>
53
<p>Пример:</p>
54
boolean expression1 = 3 < 2; boolean expression2 = 5 > 4; if (expression1) { System.out.println("Первое выражение правдивое."); } else { if (expression2) { System.out.println("Первое выражение ложное, а второе - правдивое."); } else { System.out.println("Оба выражения ложные."); } } --OUTPUT> Первое выражение ложное, а второе - правдивое.<p><strong>2. Конструкция</strong><strong>else if</strong></p>
54
boolean expression1 = 3 < 2; boolean expression2 = 5 > 4; if (expression1) { System.out.println("Первое выражение правдивое."); } else { if (expression2) { System.out.println("Первое выражение ложное, а второе - правдивое."); } else { System.out.println("Оба выражения ложные."); } } --OUTPUT> Первое выражение ложное, а второе - правдивое.<p><strong>2. Конструкция</strong><strong>else if</strong></p>
55
<p>Каждое логическое условие записывают через комбинацию else if, после которых в круглых скобках идёт альтернативное условие. Последний вариант (если ни одно из условий не сработало) записывается через else без условия.</p>
55
<p>Каждое логическое условие записывают через комбинацию else if, после которых в круглых скобках идёт альтернативное условие. Последний вариант (если ни одно из условий не сработало) записывается через else без условия.</p>
56
<p>Синтаксически это выглядит так:</p>
56
<p>Синтаксически это выглядит так:</p>
57
<p>if (условие1) {</p>
57
<p>if (условие1) {</p>
58
<p>//действия, если условие1 выполнено;</p>
58
<p>//действия, если условие1 выполнено;</p>
59
<p>}</p>
59
<p>}</p>
60
<p>else if (условие2) {</p>
60
<p>else if (условие2) {</p>
61
<p>//действия, если условие2 выполнено;</p>
61
<p>//действия, если условие2 выполнено;</p>
62
<p>}</p>
62
<p>}</p>
63
<p>else if (условие3) {</p>
63
<p>else if (условие3) {</p>
64
<p>//действия, если условие3 выполнено;</p>
64
<p>//действия, если условие3 выполнено;</p>
65
<p>}</p>
65
<p>}</p>
66
<p><…></p>
66
<p><…></p>
67
<p>else {</p>
67
<p>else {</p>
68
<p>//действия, если условие последнего if тоже не выполнилось;</p>
68
<p>//действия, если условие последнего if тоже не выполнилось;</p>
69
<p>}</p>
69
<p>}</p>
70
<p>Пример:</p>
70
<p>Пример:</p>
71
boolean statement1 = 3 < 2; boolean statement2 = 5 > 4; if (statement1) { System.out.println("Первое высказывание правдивое."); } else if (statement2) { System.out.println("Первое высказывание ложное, а второе - правдивое."); } else { System.out.println("Оба высказывания ложные."); } --OUTPUT> Первое высказывание ложное, а второе - правдивое.<p>Каждое следующее условие проверяется только в том случае, если предыдущее не выполнилось. Как только найдётся одно правдивое условие (или мы достигнем последнего else), выполнится код в фигурных скобках после этого условия, а оставшаяся цепочка условий будет пропущена.</p>
71
boolean statement1 = 3 < 2; boolean statement2 = 5 > 4; if (statement1) { System.out.println("Первое высказывание правдивое."); } else if (statement2) { System.out.println("Первое высказывание ложное, а второе - правдивое."); } else { System.out.println("Оба высказывания ложные."); } --OUTPUT> Первое высказывание ложное, а второе - правдивое.<p>Каждое следующее условие проверяется только в том случае, если предыдущее не выполнилось. Как только найдётся одно правдивое условие (или мы достигнем последнего else), выполнится код в фигурных скобках после этого условия, а оставшаяся цепочка условий будет пропущена.</p>
72
<p>Иногда условий else if нужно довольно много:</p>
72
<p>Иногда условий else if нужно довольно много:</p>
73
int dayOfWeekNum = 5; if (dayOfWeekNum == 1) { System.out.println("Понедельник"); } else if (dayOfWeekNum == 2) { System.out.println("Вторник"); } else if (dayOfWeekNum == 3) { System.out.println("Среда"); } else if (dayOfWeekNum == 4) { System.out.println("Четверг"); } else if (dayOfWeekNum == 5) { System.out.println("Пятница"); } else if (dayOfWeekNum == 6) { System.out.println("Суббота"); } else if (dayOfWeekNum == 7) { System.out.println("Воскресенье"); } --OUTPUT> Пятница<p>Такой код сложно воспринимать: увеличение глубины вложенности быстро сделало его запутанным. Для таких случаев придуман оператор switch.</p>
73
int dayOfWeekNum = 5; if (dayOfWeekNum == 1) { System.out.println("Понедельник"); } else if (dayOfWeekNum == 2) { System.out.println("Вторник"); } else if (dayOfWeekNum == 3) { System.out.println("Среда"); } else if (dayOfWeekNum == 4) { System.out.println("Четверг"); } else if (dayOfWeekNum == 5) { System.out.println("Пятница"); } else if (dayOfWeekNum == 6) { System.out.println("Суббота"); } else if (dayOfWeekNum == 7) { System.out.println("Воскресенье"); } --OUTPUT> Пятница<p>Такой код сложно воспринимать: увеличение глубины вложенности быстро сделало его запутанным. Для таких случаев придуман оператор switch.</p>
74
<p>Он применяется, когда нужно выполнить один из нескольких блоков кода в зависимости от значения аргумента.</p>
74
<p>Он применяется, когда нужно выполнить один из нескольких блоков кода в зависимости от значения аргумента.</p>
75
<p>Выгода от switch тем очевиднее, чем больше проверок и вариантов действий нам нужно.</p>
75
<p>Выгода от switch тем очевиднее, чем больше проверок и вариантов действий нам нужно.</p>
76
<p>Например:</p>
76
<p>Например:</p>
77
int dayOfWeekNum = 5; switch (dayOfWeekNum) { case 1: System.out.println("Понедельник"); break; case 2: System.out.println("Вторник"); break; case 3: System.out.println("Среда"); break; case 4: System.out.println("Четверг"); break; case 5: System.out.println("Пятница"); break; case 6: System.out.println("Суббота"); break; case 7: System.out.println("Воскресенье"); break; } --OUTPUT> Пятница<p>В круглых скобках указывается аргумент для switch, а в каждом блоке case - чему этот аргумент должен равняться, чтобы выполнился код после двоеточия.</p>
77
int dayOfWeekNum = 5; switch (dayOfWeekNum) { case 1: System.out.println("Понедельник"); break; case 2: System.out.println("Вторник"); break; case 3: System.out.println("Среда"); break; case 4: System.out.println("Четверг"); break; case 5: System.out.println("Пятница"); break; case 6: System.out.println("Суббота"); break; case 7: System.out.println("Воскресенье"); break; } --OUTPUT> Пятница<p>В круглых скобках указывается аргумент для switch, а в каждом блоке case - чему этот аргумент должен равняться, чтобы выполнился код после двоеточия.</p>
78
<p>В нашем случае выполнится case 5, так как переменная dayOfWeekNum (порядок дня в неделе) равна 5.</p>
78
<p>В нашем случае выполнится case 5, так как переменная dayOfWeekNum (порядок дня в неделе) равна 5.</p>
79
<p>В конце каждого блока case мы ставим break. Если этого не сделать, то выполнится также код из следующего блока case и так далее.</p>
79
<p>В конце каждого блока case мы ставим break. Если этого не сделать, то выполнится также код из следующего блока case и так далее.</p>
80
<p>Например:</p>
80
<p>Например:</p>
81
int dayOfWeekNum = 6; switch (dayOfWeekNum) { case 1: System.out.println("Понедельник"); break; case 2: System.out.println("Вторник"); break; case 3: System.out.println("Среда"); break; case 4: System.out.println("Четверг"); break; case 5: System.out.println("Пятница"); break; case 6: System.out.println("Суббота"); case 7: System.out.println("Воскресенье"); break; } --OUTPUT> Суббота --OUTPUT> Воскресенье<p>Если для нескольких значений аргумента нужно выполнять один и тот же код, то блоки case можно объединить.</p>
81
int dayOfWeekNum = 6; switch (dayOfWeekNum) { case 1: System.out.println("Понедельник"); break; case 2: System.out.println("Вторник"); break; case 3: System.out.println("Среда"); break; case 4: System.out.println("Четверг"); break; case 5: System.out.println("Пятница"); break; case 6: System.out.println("Суббота"); case 7: System.out.println("Воскресенье"); break; } --OUTPUT> Суббота --OUTPUT> Воскресенье<p>Если для нескольких значений аргумента нужно выполнять один и тот же код, то блоки case можно объединить.</p>
82
<p>Например, для будних дней (dayOfWeekNum от 1 до 5) будем выводить, какой это по счёту рабочий день, а для уикенда - первый или второй это выходной:</p>
82
<p>Например, для будних дней (dayOfWeekNum от 1 до 5) будем выводить, какой это по счёту рабочий день, а для уикенда - первый или второй это выходной:</p>
83
int dayOfWeekNum = 3; switch (dayOfWeekNum) { case 1: case 2: case 3: case 4: case 5: System.out.println(dayOfWeekNum + "-й рабочий день"); break; case 6: case 7: System.out.println(dayOfWeekNum-5 + "-й выходной"); break; } --OUTPUT> 3-й рабочий день<p>Теперь при значении переменной dayOfWeekNum от 1 до 5 выполнится один и тот же код, и для значений 6 и 7 - тоже одинаковый.</p>
83
int dayOfWeekNum = 3; switch (dayOfWeekNum) { case 1: case 2: case 3: case 4: case 5: System.out.println(dayOfWeekNum + "-й рабочий день"); break; case 6: case 7: System.out.println(dayOfWeekNum-5 + "-й выходной"); break; } --OUTPUT> 3-й рабочий день<p>Теперь при значении переменной dayOfWeekNum от 1 до 5 выполнится один и тот же код, и для значений 6 и 7 - тоже одинаковый.</p>
84
<p>Также можно задать действие, если ни одно из условий не сработало. Делается это с помощью ключевого слова default:</p>
84
<p>Также можно задать действие, если ни одно из условий не сработало. Делается это с помощью ключевого слова default:</p>
85
int dayOfWeekNum = 8; switch (dayOfWeekNum) { case 1: case 2: case 3: case 4: case 5: System.out.println(dayOfWeekNum + "-й рабочий день"); break; case 6: case 7: System.out.println(dayOfWeekNum-5 + "-й выходной"); break; default: System.out.println("Такого по счёту дня в неделе нет."); } --OUTPUT> Такого по счёту дня в неделе нет.<p><strong>Примечание.</strong>Слово break означает выход из switch…case. Поэтому если ваш блок default стоит не последним, то тоже завершайте его словом break, иначе выполнится код из следующего case.</p>
85
int dayOfWeekNum = 8; switch (dayOfWeekNum) { case 1: case 2: case 3: case 4: case 5: System.out.println(dayOfWeekNum + "-й рабочий день"); break; case 6: case 7: System.out.println(dayOfWeekNum-5 + "-й выходной"); break; default: System.out.println("Такого по счёту дня в неделе нет."); } --OUTPUT> Такого по счёту дня в неделе нет.<p><strong>Примечание.</strong>Слово break означает выход из switch…case. Поэтому если ваш блок default стоит не последним, то тоже завершайте его словом break, иначе выполнится код из следующего case.</p>
86
<p>Есть ряд условий, которые следует выполнять:</p>
86
<p>Есть ряд условий, которые следует выполнять:</p>
87
<ol><li>Тип значений в case должен соответствовать типу значения в switch.</li>
87
<ol><li>Тип значений в case должен соответствовать типу значения в switch.</li>
88
<li>Не поддерживаются типы boolean, long, с плавающей запятой (double, float).</li>
88
<li>Не поддерживаются типы boolean, long, с плавающей запятой (double, float).</li>
89
<li>В case должны быть указаны либо константы, либо выражения, значения которых компилятор сможет вычислить. Например, компилятор сможет вычислить выражение (1 + 2 + 3) * 4 до запуска кода и подставит вместо него итоговое значение 24. А значение переменной или результат метода компилятор до запуска программы предсказать не может, поэтому ни переменную, ни метод подставлять в case нельзя.</li>
89
<li>В case должны быть указаны либо константы, либо выражения, значения которых компилятор сможет вычислить. Например, компилятор сможет вычислить выражение (1 + 2 + 3) * 4 до запуска кода и подставит вместо него итоговое значение 24. А значение переменной или результат метода компилятор до запуска программы предсказать не может, поэтому ни переменную, ни метод подставлять в case нельзя.</li>
90
<li>Значения в case не могут повторяться, а default у каждого switch может быть только один.</li>
90
<li>Значения в case не могут повторяться, а default у каждого switch может быть только один.</li>
91
</ol><p>С версии 14 Java поддерживает новый синтаксис switch:</p>
91
</ol><p>С версии 14 Java поддерживает новый синтаксис switch:</p>
92
switch (value) { case val1 -> { //код } case val2 -> { //код } default -> { //код } }<p>Теперь нам не нужно писать break, а двоеточие заменено на стрелочку и фигурные скобки. Блок default по-прежнему не обязателен.</p>
92
switch (value) { case val1 -> { //код } case val2 -> { //код } default -> { //код } }<p>Теперь нам не нужно писать break, а двоеточие заменено на стрелочку и фигурные скобки. Блок default по-прежнему не обязателен.</p>
93
<p>Если код блока case состоит всего из одной строки, то фигурные скобки можно не использовать:</p>
93
<p>Если код блока case состоит всего из одной строки, то фигурные скобки можно не использовать:</p>
94
switch (value) { case val1 -> //код; case val2 -> //код; default -> //код; }<p>В операторе switch прошлой версии мы задавали одно действие для нескольких значений case, располагая пустые case над case c кодом:</p>
94
switch (value) { case val1 -> //код; case val2 -> //код; default -> //код; }<p>В операторе switch прошлой версии мы задавали одно действие для нескольких значений case, располагая пустые case над case c кодом:</p>
95
switch (value) { case val1: case val2: //код break; }<p>В новой версии для этого хватает одного case, а связанные с ним значения разделяются запятой. Например:</p>
95
switch (value) { case val1: case val2: //код break; }<p>В новой версии для этого хватает одного case, а связанные с ним значения разделяются запятой. Например:</p>
96
string dayOfWeek = "Суббота"; switch (dayOfWeek) { case "Понедельник", "Вторник", "Четверг" -> System.out.println("Работа."); case "Среда" -> { System.out.println("Зенит рабочей недели."); System.out.println("Очень много работы."); } case "Пятница" -> System.out.println("Последний рабочий день перед выходными."); case "Суббота" -> System.out.println("Ура, первый выходной! Можно и поспать."); case "Воскресенье" -> { System.out.println("Остался последний выходной, пора готовиться к работе."); System.out.println("Но можно и поспать :)"); } default -> System.out.println("Не знаю такого дня, но я бы поспал!"); } --OUTPUT> Ура, первый выходной! Можно и поспать.<p>Теперь switch - уже не просто оператор ветвления, он может вернуть значение. Это делается с помощью вспомогательного оператора yield.</p>
96
string dayOfWeek = "Суббота"; switch (dayOfWeek) { case "Понедельник", "Вторник", "Четверг" -> System.out.println("Работа."); case "Среда" -> { System.out.println("Зенит рабочей недели."); System.out.println("Очень много работы."); } case "Пятница" -> System.out.println("Последний рабочий день перед выходными."); case "Суббота" -> System.out.println("Ура, первый выходной! Можно и поспать."); case "Воскресенье" -> { System.out.println("Остался последний выходной, пора готовиться к работе."); System.out.println("Но можно и поспать :)"); } default -> System.out.println("Не знаю такого дня, но я бы поспал!"); } --OUTPUT> Ура, первый выходной! Можно и поспать.<p>Теперь switch - уже не просто оператор ветвления, он может вернуть значение. Это делается с помощью вспомогательного оператора yield.</p>
97
<p>Пример:</p>
97
<p>Пример:</p>
98
string dayOfWeek = "Среда"; int dayOfWeekNum = switch (dayOfWeek) { case "Понедельник": yield 1; case "Вторник": yield 2; case "Среда": System.out.println("Очень сложный день"); yield 3; case "Четверг": yield 4; case "Пятница": yield 5; case "Суббота": yield 6; case "Воскресенье": yield 7; default: yield -1; }; System.out.println(dayOfWeekNum); --OUTPUT> Очень сложный день --OUTPUT> 3<p>В новой версии switch, когда нам нужно лишь вернуть значение из соответствующего case (он должен быть без кода), - можно обойтись и без слова yield:</p>
98
string dayOfWeek = "Среда"; int dayOfWeekNum = switch (dayOfWeek) { case "Понедельник": yield 1; case "Вторник": yield 2; case "Среда": System.out.println("Очень сложный день"); yield 3; case "Четверг": yield 4; case "Пятница": yield 5; case "Суббота": yield 6; case "Воскресенье": yield 7; default: yield -1; }; System.out.println(dayOfWeekNum); --OUTPUT> Очень сложный день --OUTPUT> 3<p>В новой версии switch, когда нам нужно лишь вернуть значение из соответствующего case (он должен быть без кода), - можно обойтись и без слова yield:</p>
99
int dayOfWeekNum = switch (dayOfWeek) { case "Понедельник" -> 1; case "Вторник" -> 2; case "Среда" -> { System.out.println(""); yield 3; } case "Четверг" -> 4; case "Пятница" -> 5; case "Суббота" -> 6; case "Воскресенье" -> 7; default -> -1; };<p>1. Фигурные скобки после if или else разрешено не ставить, если тело блока состоит всего из одной строки.</p>
99
int dayOfWeekNum = switch (dayOfWeek) { case "Понедельник" -> 1; case "Вторник" -> 2; case "Среда" -> { System.out.println(""); yield 3; } case "Четверг" -> 4; case "Пятница" -> 5; case "Суббота" -> 6; case "Воскресенье" -> 7; default -> -1; };<p>1. Фигурные скобки после if или else разрешено не ставить, если тело блока состоит всего из одной строки.</p>
100
<p>Однако всё же советую ставить скобки, так вы научитесь быть последовательными и облегчите рефакторинг кода.</p>
100
<p>Однако всё же советую ставить скобки, так вы научитесь быть последовательными и облегчите рефакторинг кода.</p>
101
<p>2. Вот так писать не следует (внимание на условие в if):</p>
101
<p>2. Вот так писать не следует (внимание на условие в if):</p>
102
public boolean isMoreFive(int a) { return a > 5; } if (isMoreFive(3) == true) { //код }<p>Код будет работать, но сравнение boolean с boolean в условии - это лишняя операция.</p>
102
public boolean isMoreFive(int a) { return a > 5; } if (isMoreFive(3) == true) { //код }<p>Код будет работать, но сравнение boolean с boolean в условии - это лишняя операция.</p>
103
<p>Поскольку метод isMoreFive сам возвращает булево значение - напишите вот так:</p>
103
<p>Поскольку метод isMoreFive сам возвращает булево значение - напишите вот так:</p>
104
if (isMoreFive(3)) { //код }<p>Здесь снова ненужное сравнение:</p>
104
if (isMoreFive(3)) { //код }<p>Здесь снова ненужное сравнение:</p>
105
if (isMoreFive(3) == false) { //код }<p>Чтобы не было лишней операции - пишите вот так:</p>
105
if (isMoreFive(3) == false) { //код }<p>Чтобы не было лишней операции - пишите вот так:</p>
106
if (!isMoreFive(3)) { //код }<p>Условие по-прежнему выполняется, когда isMoreFive возвращает false, однако от бессмысленного сравнения мы избавились.</p>
106
if (!isMoreFive(3)) { //код }<p>Условие по-прежнему выполняется, когда isMoreFive возвращает false, однако от бессмысленного сравнения мы избавились.</p>
107
<p>Тернарный оператор - это лаконичная замена if-else. Он возвращает вместо себя одно из выражений в зависимости от истинности условия (логического высказывания).</p>
107
<p>Тернарный оператор - это лаконичная замена if-else. Он возвращает вместо себя одно из выражений в зависимости от истинности условия (логического высказывания).</p>
108
<p>Синтаксис тернарного оператора:</p>
108
<p>Синтаксис тернарного оператора:</p>
109
<p>условие ? выражение1 : выражение2</p>
109
<p>условие ? выражение1 : выражение2</p>
110
<p>Если условие выполняется, то оператор возвращает выражение1, иначе - выражение2. Значения возвращаемых выражений могут быть любого типа.</p>
110
<p>Если условие выполняется, то оператор возвращает выражение1, иначе - выражение2. Значения возвращаемых выражений могут быть любого типа.</p>
111
<p>Примеры:</p>
111
<p>Примеры:</p>
112
String str = 3 > 2 ? "Условие выполняется" : "Условие не выполняется"; System.out.println(str); --OUTPUT> Условие выполняется<p>Как записать то же самое с if:</p>
112
String str = 3 > 2 ? "Условие выполняется" : "Условие не выполняется"; System.out.println(str); --OUTPUT> Условие выполняется<p>Как записать то же самое с if:</p>
113
String str; if (3 > 2) { str = "Условие выполняется"; } else { str = "Условие не выполняется"; } System.out.println(str); --OUTPUT> Условие выполняется<p>Как видно, вариант с тернарным оператором намного короче.</p>
113
String str; if (3 > 2) { str = "Условие выполняется"; } else { str = "Условие не выполняется"; } System.out.println(str); --OUTPUT> Условие выполняется<p>Как видно, вариант с тернарным оператором намного короче.</p>
114
<p>Тернарные операторы допустимо вкладывать друг в друга:</p>
114
<p>Тернарные операторы допустимо вкладывать друг в друга:</p>
115
String str = 3 > 2 ? (5 < 4 ? "Оба условия выполняются" : "Второе условие не выполняется") : "Первое условие не выполняется"; System.out.println(str); --OUTPUT> Второе условие не выполняется<p>И то же самое с помощью if:</p>
115
String str = 3 > 2 ? (5 < 4 ? "Оба условия выполняются" : "Второе условие не выполняется") : "Первое условие не выполняется"; System.out.println(str); --OUTPUT> Второе условие не выполняется<p>И то же самое с помощью if:</p>
116
String str; if (3 > 2) { if (5 < 4) { str = "Оба условия выполняются"; } else { str = "Второе условие не выполняется"; } } else { str = "Первое условие не выполняется"; } System.out.println(str); --OUTPUT> Второе условие не выполняется<p>Конечно, так длиннее - но и читабельнее.</p>
116
String str; if (3 > 2) { if (5 < 4) { str = "Оба условия выполняются"; } else { str = "Второе условие не выполняется"; } } else { str = "Первое условие не выполняется"; } System.out.println(str); --OUTPUT> Второе условие не выполняется<p>Конечно, так длиннее - но и читабельнее.</p>
117
<p>Есть ещё один оператор, который возвращает булево значение, - это instanceof.</p>
117
<p>Есть ещё один оператор, который возвращает булево значение, - это instanceof.</p>
118
<p>Он проверяет принадлежность переменной к какому-то классу.</p>
118
<p>Он проверяет принадлежность переменной к какому-то классу.</p>
119
<p>Если классы объектов нужно узнать во время выполнения программы.</p>
119
<p>Если классы объектов нужно узнать во время выполнения программы.</p>
120
<p>Допустим, есть два потока исполнения. В первом создаются объекты разных классов, а в другом они используются. С instanceof легко выяснять класс каждого объекта, который получает второй поток.</p>
120
<p>Допустим, есть два потока исполнения. В первом создаются объекты разных классов, а в другом они используются. С instanceof легко выяснять класс каждого объекта, который получает второй поток.</p>
121
<p>Класс объекта важно знать и для приведения типов. Хотя большинство подобных проблем выявляет компилятор, но приведение типов при иерархии классов чревато ошибками, которые всплывают только во время работы.</p>
121
<p>Класс объекта важно знать и для приведения типов. Хотя большинство подобных проблем выявляет компилятор, но приведение типов при иерархии классов чревато ошибками, которые всплывают только во время работы.</p>
122
<p>Вообще, instanceof используется редко, потому что обычно типы объектов известны сразу. Применять этот оператор считается дурным тоном, это признак плохой программной архитектуры. Но его используют в обобщённых процедурах, которые оперируют объектами из сложной иерархии классов.</p>
122
<p>Вообще, instanceof используется редко, потому что обычно типы объектов известны сразу. Применять этот оператор считается дурным тоном, это признак плохой программной архитектуры. Но его используют в обобщённых процедурах, которые оперируют объектами из сложной иерархии классов.</p>
123
<p>Рассмотрим на примере:</p>
123
<p>Рассмотрим на примере:</p>
124
class A {} class B extends A {} class C {} A a = new A(); //объект относится только к классу A B ba = new B(); //объект относится к классам A и B C c = new C(); //объект относится только к классу C System.out.println(a instanceof A); System.out.println(bа instanceof A); System.out.println(ba instanceof B); System.out.println(a instanceof B); System.out.println((Object) c instanceof A); System.out.println(c instanceof C); --OUTPUT> true --OUTPUT> true --OUTPUT> true --OUTPUT> false --OUTPUT> false --OUTPUT> true<p>Объект c принадлежит только к классу C. Нам пришлось привести его к классу Object, чтобы можно было проверить на соответствие классу A.</p>
124
class A {} class B extends A {} class C {} A a = new A(); //объект относится только к классу A B ba = new B(); //объект относится к классам A и B C c = new C(); //объект относится только к классу C System.out.println(a instanceof A); System.out.println(bа instanceof A); System.out.println(ba instanceof B); System.out.println(a instanceof B); System.out.println((Object) c instanceof A); System.out.println(c instanceof C); --OUTPUT> true --OUTPUT> true --OUTPUT> true --OUTPUT> false --OUTPUT> false --OUTPUT> true<p>Объект c принадлежит только к классу C. Нам пришлось привести его к классу Object, чтобы можно было проверить на соответствие классу A.</p>
125
<p>Иначе компилятор сразу бы увидел, что объект класса C не принадлежит к классу A, - и не дал бы запустить программу с ошибкой несовместимости типов:</p>
125
<p>Иначе компилятор сразу бы увидел, что объект класса C не принадлежит к классу A, - и не дал бы запустить программу с ошибкой несовместимости типов:</p>
126
class A {} class C {} A a = new A(); //объект принадлежит только классу A C c = new C(); //объект принадлежит только классу C System.out.println(c instanceof A); --OUTPUT> <...> error: incompatible types: C cannot be converted to A <...><p>Раньше был допустим только такой синтаксис:</p>
126
class A {} class C {} A a = new A(); //объект принадлежит только классу A C c = new C(); //объект принадлежит только классу C System.out.println(c instanceof A); --OUTPUT> <...> error: incompatible types: C cannot be converted to A <...><p>Раньше был допустим только такой синтаксис:</p>
127
if (object instanceof Type) { Type t = (Type) object; //код }<p>То есть мы сначала проверяем, что object может быть приведён к какому-то типу Type, - это и делает оператор instanceof, а внутри условия приводим объект к этому типу и записываем результат в новую переменную.</p>
127
if (object instanceof Type) { Type t = (Type) object; //код }<p>То есть мы сначала проверяем, что object может быть приведён к какому-то типу Type, - это и делает оператор instanceof, а внутри условия приводим объект к этому типу и записываем результат в новую переменную.</p>
128
<p>В Java 15 появилась конструкция упрощённого приведения:</p>
128
<p>В Java 15 появилась конструкция упрощённого приведения:</p>
129
if (object instanceof Type t) { //код }<p>Мы проверили, что object можно привести к Type, и сразу в условии привели его к этому типу, а результат записали в переменную t. Эту переменную можно использовать внутри блока if.</p>
129
if (object instanceof Type t) { //код }<p>Мы проверили, что object можно привести к Type, и сразу в условии привели его к этому типу, а результат записали в переменную t. Эту переменную можно использовать внутри блока if.</p>
130
<p>Сперва подытожим:</p>
130
<p>Сперва подытожим:</p>
131
<ul><li>мы познакомились с типом Boolean;</li>
131
<ul><li>мы познакомились с типом Boolean;</li>
132
<li>рассмотрели операторы сравнения <, >, <=, >=, ==, !=, а также instanceof;</li>
132
<li>рассмотрели операторы сравнения <, >, <=, >=, ==, !=, а также instanceof;</li>
133
<li>изучили операторы ветвления if, switch и тернарный оператор.</li>
133
<li>изучили операторы ветвления if, switch и тернарный оператор.</li>
134
</ul><p><a>Пора рассмотреть</a>условные выражения, включающие не только операторы сравнения, но и <strong>логические операторы</strong>.</p>
134
</ul><p><a>Пора рассмотреть</a>условные выражения, включающие не только операторы сравнения, но и <strong>логические операторы</strong>.</p>
135
<a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>
135
<a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>