HTML Diff
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 &gt; b.</p>
11 <p>В каждой операции сравнения участвуют два операнда. А выглядит она как обычное неравенство в математике. Например: a &gt; 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. Для этого используем оператор &gt;, который возвращает булево значение (true или false).</p>
15 </ul><p>Например, мы хотим сравнить в Java значения переменных a и b. Для этого используем оператор &gt;, который возвращает булево значение (true или false).</p>
16 <p>a &gt; b равно true, когда значение переменной a больше значения переменной b (операнд слева от &gt; больше правого), а иначе - false.</p>
16 <p>a &gt; b равно true, когда значение переменной a больше значения переменной b (операнд слева от &gt; больше правого), а иначе - false.</p>
17 <p>Пример:</p>
17 <p>Пример:</p>
18 int a = 4; int b = 3; boolean c = a &gt; b; System.out.println(c); --OUTPUT&gt; true<p>Оператор &gt; сравнил операнд слева с операндом справа. Результат сравнения мы присвоили булевой переменной c.</p>
18 int a = 4; int b = 3; boolean c = a &gt; b; System.out.println(c); --OUTPUT&gt; true<p>Оператор &gt; сравнил операнд слева с операндом справа. Результат сравнения мы присвоили булевой переменной c.</p>
19 <p>Так как 4 &gt; 3 (высказывание правдиво), значение переменной c после выполнения кода станет равным true.</p>
19 <p>Так как 4 &gt; 3 (высказывание правдиво), значение переменной c после выполнения кода станет равным true.</p>
20 <p>Один оператор сравнения мы рассмотрели выше, а всего в Java их шесть:</p>
20 <p>Один оператор сравнения мы рассмотрели выше, а всего в Java их шесть:</p>
21 <strong>Оператор сравнения</strong><strong>Обозначение в Java</strong><strong>Пример операции</strong><strong>Результат операции</strong>Меньше&lt;a &lt; btrue, если операнд слева меньше правого, иначе falseБольше&gt;a &gt; btrue, если операнд слева больше правого, иначе falseМеньше или равно&lt;=a &lt;= btrue, если операнд слева<em>меньше</em>правого или они<em>равны</em>, иначе falseБольше или равно&gt;=a &gt;= 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>Меньше&lt;a &lt; btrue, если операнд слева меньше правого, иначе falseБольше&gt;a &gt; btrue, если операнд слева больше правого, иначе falseМеньше или равно&lt;=a &lt;= btrue, если операнд слева<em>меньше</em>правого или они<em>равны</em>, иначе falseБольше или равно&gt;=a &gt;= 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 &lt; b; System.out.println(c); --OUTPUT&gt; true int a = 6; int b = 7; boolean c = a &gt;= b; System.out.println(c); --OUTPUT&gt; false<p>Булевы значения и условные выражения часто используются в условиях операторов ветвления, тернарного оператора и циклов.</p>
22 int a = 6; int b = 7; boolean c = a &lt; b; System.out.println(c); --OUTPUT&gt; true int a = 6; int b = 7; boolean c = a &gt;= b; System.out.println(c); --OUTPUT&gt; 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 &gt; 2) { System.out.println("Высказывание в скобках правдивое."); } --OUTPUT&gt; Высказывание в скобках правдивое.<p>Проверяем условие в круглых скобках:</p>
34 if (3 &gt; 2) { System.out.println("Высказывание в скобках правдивое."); } --OUTPUT&gt; Высказывание в скобках правдивое.<p>Проверяем условие в круглых скобках:</p>
35 <p>3 &gt; 2?</p>
35 <p>3 &gt; 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 &lt; 2) { System.out.println("Высказывание в скобках правдивое."); } else { System.out.println("Высказывание в скобках ложное."); } --OUTPUT&gt; Высказывание в скобках ложное.<p>Печатаем "Высказывание в скобках правдивое", если результат вычислений в круглых скобках = true. В ином случае выводим: "Высказывание в скобках ложное".</p>
38 if (3 &lt; 2) { System.out.println("Высказывание в скобках правдивое."); } else { System.out.println("Высказывание в скобках ложное."); } --OUTPUT&gt; Высказывание в скобках ложное.<p>Печатаем "Высказывание в скобках правдивое", если результат вычислений в круглых скобках = true. В ином случае выводим: "Высказывание в скобках ложное".</p>
39 <p>Так как выражение (3 &lt; 2) возвращает false, то и в консоли видим: "Высказывание в скобках ложное".</p>
39 <p>Так как выражение (3 &lt; 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>&lt;…&gt;</p>
49 <p>&lt;…&gt;</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 &lt; 2; boolean expression2 = 5 &gt; 4; if (expression1) { System.out.println("Первое выражение правдивое."); } else { if (expression2) { System.out.println("Первое выражение ложное, а второе - правдивое."); } else { System.out.println("Оба выражения ложные."); } } --OUTPUT&gt; Первое выражение ложное, а второе - правдивое.<p><strong>2. Конструкция</strong><strong>else if</strong></p>
54 boolean expression1 = 3 &lt; 2; boolean expression2 = 5 &gt; 4; if (expression1) { System.out.println("Первое выражение правдивое."); } else { if (expression2) { System.out.println("Первое выражение ложное, а второе - правдивое."); } else { System.out.println("Оба выражения ложные."); } } --OUTPUT&gt; Первое выражение ложное, а второе - правдивое.<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>&lt;…&gt;</p>
66 <p>&lt;…&gt;</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 &lt; 2; boolean statement2 = 5 &gt; 4; if (statement1) { System.out.println("Первое высказывание правдивое."); } else if (statement2) { System.out.println("Первое высказывание ложное, а второе - правдивое."); } else { System.out.println("Оба высказывания ложные."); } --OUTPUT&gt; Первое высказывание ложное, а второе - правдивое.<p>Каждое следующее условие проверяется только в том случае, если предыдущее не выполнилось. Как только найдётся одно правдивое условие (или мы достигнем последнего else), выполнится код в фигурных скобках после этого условия, а оставшаяся цепочка условий будет пропущена.</p>
71 boolean statement1 = 3 &lt; 2; boolean statement2 = 5 &gt; 4; if (statement1) { System.out.println("Первое высказывание правдивое."); } else if (statement2) { System.out.println("Первое высказывание ложное, а второе - правдивое."); } else { System.out.println("Оба высказывания ложные."); } --OUTPUT&gt; Первое высказывание ложное, а второе - правдивое.<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&gt; Пятница<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&gt; Пятница<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&gt; Пятница<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&gt; Пятница<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&gt; Суббота --OUTPUT&gt; Воскресенье<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&gt; Суббота --OUTPUT&gt; Воскресенье<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&gt; 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&gt; 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&gt; Такого по счёту дня в неделе нет.<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&gt; Такого по счёту дня в неделе нет.<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 -&gt; { //код } case val2 -&gt; { //код } default -&gt; { //код } }<p>Теперь нам не нужно писать break, а двоеточие заменено на стрелочку и фигурные скобки. Блок default по-прежнему не обязателен.</p>
92 switch (value) { case val1 -&gt; { //код } case val2 -&gt; { //код } default -&gt; { //код } }<p>Теперь нам не нужно писать break, а двоеточие заменено на стрелочку и фигурные скобки. Блок default по-прежнему не обязателен.</p>
93 <p>Если код блока case состоит всего из одной строки, то фигурные скобки можно не использовать:</p>
93 <p>Если код блока case состоит всего из одной строки, то фигурные скобки можно не использовать:</p>
94 switch (value) { case val1 -&gt; //код; case val2 -&gt; //код; default -&gt; //код; }<p>В операторе switch прошлой версии мы задавали одно действие для нескольких значений case, располагая пустые case над case c кодом:</p>
94 switch (value) { case val1 -&gt; //код; case val2 -&gt; //код; default -&gt; //код; }<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 "Понедельник", "Вторник", "Четверг" -&gt; System.out.println("Работа."); case "Среда" -&gt; { System.out.println("Зенит рабочей недели."); System.out.println("Очень много работы."); } case "Пятница" -&gt; System.out.println("Последний рабочий день перед выходными."); case "Суббота" -&gt; System.out.println("Ура, первый выходной! Можно и поспать."); case "Воскресенье" -&gt; { System.out.println("Остался последний выходной, пора готовиться к работе."); System.out.println("Но можно и поспать :)"); } default -&gt; System.out.println("Не знаю такого дня, но я бы поспал!"); } --OUTPUT&gt; Ура, первый выходной! Можно и поспать.<p>Теперь switch - уже не просто оператор ветвления, он может вернуть значение. Это делается с помощью вспомогательного оператора yield.</p>
96 string dayOfWeek = "Суббота"; switch (dayOfWeek) { case "Понедельник", "Вторник", "Четверг" -&gt; System.out.println("Работа."); case "Среда" -&gt; { System.out.println("Зенит рабочей недели."); System.out.println("Очень много работы."); } case "Пятница" -&gt; System.out.println("Последний рабочий день перед выходными."); case "Суббота" -&gt; System.out.println("Ура, первый выходной! Можно и поспать."); case "Воскресенье" -&gt; { System.out.println("Остался последний выходной, пора готовиться к работе."); System.out.println("Но можно и поспать :)"); } default -&gt; System.out.println("Не знаю такого дня, но я бы поспал!"); } --OUTPUT&gt; Ура, первый выходной! Можно и поспать.<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&gt; Очень сложный день --OUTPUT&gt; 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&gt; Очень сложный день --OUTPUT&gt; 3<p>В новой версии switch, когда нам нужно лишь вернуть значение из соответствующего case (он должен быть без кода), - можно обойтись и без слова yield:</p>
99 int dayOfWeekNum = switch (dayOfWeek) { case "Понедельник" -&gt; 1; case "Вторник" -&gt; 2; case "Среда" -&gt; { System.out.println(""); yield 3; } case "Четверг" -&gt; 4; case "Пятница" -&gt; 5; case "Суббота" -&gt; 6; case "Воскресенье" -&gt; 7; default -&gt; -1; };<p>1. Фигурные скобки после if или else разрешено не ставить, если тело блока состоит всего из одной строки.</p>
99 int dayOfWeekNum = switch (dayOfWeek) { case "Понедельник" -&gt; 1; case "Вторник" -&gt; 2; case "Среда" -&gt; { System.out.println(""); yield 3; } case "Четверг" -&gt; 4; case "Пятница" -&gt; 5; case "Суббота" -&gt; 6; case "Воскресенье" -&gt; 7; default -&gt; -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 &gt; 5; } if (isMoreFive(3) == true) { //код }<p>Код будет работать, но сравнение boolean с boolean в условии - это лишняя операция.</p>
102 public boolean isMoreFive(int a) { return a &gt; 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 &gt; 2 ? "Условие выполняется" : "Условие не выполняется"; System.out.println(str); --OUTPUT&gt; Условие выполняется<p>Как записать то же самое с if:</p>
112 String str = 3 &gt; 2 ? "Условие выполняется" : "Условие не выполняется"; System.out.println(str); --OUTPUT&gt; Условие выполняется<p>Как записать то же самое с if:</p>
113 String str; if (3 &gt; 2) { str = "Условие выполняется"; } else { str = "Условие не выполняется"; } System.out.println(str); --OUTPUT&gt; Условие выполняется<p>Как видно, вариант с тернарным оператором намного короче.</p>
113 String str; if (3 &gt; 2) { str = "Условие выполняется"; } else { str = "Условие не выполняется"; } System.out.println(str); --OUTPUT&gt; Условие выполняется<p>Как видно, вариант с тернарным оператором намного короче.</p>
114 <p>Тернарные операторы допустимо вкладывать друг в друга:</p>
114 <p>Тернарные операторы допустимо вкладывать друг в друга:</p>
115 String str = 3 &gt; 2 ? (5 &lt; 4 ? "Оба условия выполняются" : "Второе условие не выполняется") : "Первое условие не выполняется"; System.out.println(str); --OUTPUT&gt; Второе условие не выполняется<p>И то же самое с помощью if:</p>
115 String str = 3 &gt; 2 ? (5 &lt; 4 ? "Оба условия выполняются" : "Второе условие не выполняется") : "Первое условие не выполняется"; System.out.println(str); --OUTPUT&gt; Второе условие не выполняется<p>И то же самое с помощью if:</p>
116 String str; if (3 &gt; 2) { if (5 &lt; 4) { str = "Оба условия выполняются"; } else { str = "Второе условие не выполняется"; } } else { str = "Первое условие не выполняется"; } System.out.println(str); --OUTPUT&gt; Второе условие не выполняется<p>Конечно, так длиннее - но и читабельнее.</p>
116 String str; if (3 &gt; 2) { if (5 &lt; 4) { str = "Оба условия выполняются"; } else { str = "Второе условие не выполняется"; } } else { str = "Первое условие не выполняется"; } System.out.println(str); --OUTPUT&gt; Второе условие не выполняется<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&gt; true --OUTPUT&gt; true --OUTPUT&gt; true --OUTPUT&gt; false --OUTPUT&gt; false --OUTPUT&gt; 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&gt; true --OUTPUT&gt; true --OUTPUT&gt; true --OUTPUT&gt; false --OUTPUT&gt; false --OUTPUT&gt; 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&gt; &lt;...&gt; error: incompatible types: C cannot be converted to A &lt;...&gt;<p>Раньше был допустим только такой синтаксис:</p>
126 class A {} class C {} A a = new A(); //объект принадлежит только классу A C c = new C(); //объект принадлежит только классу C System.out.println(c instanceof A); --OUTPUT&gt; &lt;...&gt; error: incompatible types: C cannot be converted to A &lt;...&gt;<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>рассмотрели операторы сравнения &lt;, &gt;, &lt;=, &gt;=, ==, !=, а также instanceof;</li>
132 <li>рассмотрели операторы сравнения &lt;, &gt;, &lt;=, &gt;=, ==, !=, а также 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>