Лекция 3. Управляющие конструкции языка Java
Переменные в Java
В отличие от Python у каждой переменной Java указывается тип, и переменная может хранить значения толького этого типа. Например, переменная типа int
может хранить значения только типа int
:
int x = 42; // хорошо
x = "abc"; // ошибка компиляции, программа даже не запустится.
int x = "abc"; //тоже ошибка
При заведении переменной сначала указывается ее тип, потом имя:
int x;
String s;
boolean b;
int p, q, r; // можно сразу несколько
int pp = 0, qq = 0, r = 0;
Можно сразу инициализировать значение переменной, указав начальное значение:
int x = 42; //инициализатор
String s = "abc";
Пока вы не присвоите переменной значение, из нее нельзя читать значение. Это тоже ошибка компиляции:
String s;
System.out.println(s); //распечатать значение — ошибка
//variable s might not have been initialized
int x;
if (....)
x = 10;
System.out.println(x); //ошибка, могло не быть инициализировано
Область видимости переменной
Переменная в Java доступна с момента определения до конца блока, в котором она определена. Блок — это часть программы между фигурными скобками:
public static void main(String[] args) {
int x = 1; // z недоступна, она будет определена позже
if (x < 10) {
int y = 20;
System.out.println(x + y); //доступны x и y
}
int z = 2;
System.out.println(x, z); //y недоступна
}
Условный оператор if
Если есть логическое выражение УСЛОВИЕ
(выражение типа boolean
и только его), его можно вставить в оператор if:
if (УСЛОВИЕ) { // фигурная скобка через пробел после )
//операторы с отступом в 4 пробела
} else { //без отступа относительно if
//операторы с отступом в 4 пробела
} //без отступа относительно if
if (УСЛОВИЕ) {
} // else не обязательный
В отличие от python, расстановка отступов не влияет на работу программы, отступы ставятся для читаемости текста, они важны, ставьте их, пожалуйста, правильно.
Если в блоке операторов внутри if ровно один оператор, можно не ставить фигурные скобки (я рекомендую не ставить в этой ситуации):
if (x < 10)
System.out.println("меньше 10");
else { //2 действия, скобки нужны
x = x + 1;
System.out.println("больше 10");
}
В Java нет elif
. Как поступить без него?
if (x < 0)
sout("отрицательный"); //sout = System.out.println()
else {
if (x == 0)
sout("ноль");
else {
if (x > 1_000_000)
sout("очень большой");
else
sout("положительный");
}
}
запишем это же короче.
if (x < 0)
sout("отрицательный"); //sout = System.out.println()
else if (x == 0)
sout("ноль");
else if (x > 1_000_000)
sout("очень большой");
else
sout("положительный");
Получается, что else if
это как бы и есть elif
из Python.
Оператор switch
(Кстати!!!! Вышла 17 Java. Обновитесь!!! 17 — релиз с длительной поддержкой)
Этот оператор позволяет выбрать один вариант действий в зависимости от значения выражения. Посмотрим только на новую версию switch, старую версию switch (выражение) {case VAR: break}
с двоеточием поле case посмотрите сами.
См. пример. SwitchExamples.java.
Функции в Java
Пример программы с функциями
public class Task {
public static void main(String[] args) {
// главная функция, с нее начинается программа
// давайте договоримся делать функцию main первой
sout(sum(2, 3)); //5
int z = sum(2, 3);
//sum(2, "abc"); //ошибка, аргументы указаны как тип int
sout(hello("Ilya")); //"Hello, Ilya"
printHello("Ilya")); //ok
//sout(printHello("Ilya")); //нечего печатать, ошибка
//void x = printHello("Ilya"); //ошибка, ничего не вернется
}
private static ТИП-РЕЗУЛЬТАТА ИМЯ-ФУНКЦИИ(АРГУМЕНТЫ С ТИПАМИ) {
тело функции
}
private static int sum(int x, int y) {
return x + y; // оператор return аналогичен python
//возвращаемое выражение должно иметь тип, указанный в
//заголовке функции
}
private static String hello(String name) {
return "Hello, " + name + "!";
}
private static void printHello(String name) { //void — ничего
sout("Hello, " + name + "!");
}
}
Отступление, как форматировать строки в Java
Нужен аналог f-строк в Python. f"Hello, {name}!"
String name = "Ilya";
String.format("Hello, %s!", name); //это получается тип String
sout(String.format("Hello, %s!", name));
String hello = String.format("Hello, %s!", name);
String.format("x = %f", 4.2);
String.format("x = %.2f", 4.2); //.2 два знака после запятой
//%s - подставь строку
//%f - подставь вещественно число
Подробности про %s
и другие проценты по ссылке https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html