> For the complete documentation index, see [llms.txt](https://letas-organization.gitbook.io/letaats-lessons-online/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://letas-organization.gitbook.io/letaats-lessons-online/kolledzh-top/razdel-1/glava-5.-peremennye-znacheniya-i-oblast-vidimosti.md).

# Глава 5. Переменные, значения и область видимости

### 5.1. Зачем нужны переменные

Программа почти всегда работает с данными.

Например, приложение может хранить:

* имя пользователя;
* возраст;
* цену товара;
* количество попыток;
* результат вычисления;
* текст сообщения;
* состояние кнопки;
* количество очков в игре.

Если не использовать переменные, программе будет негде хранить промежуточные значения.

Представьте приложение “Проверка возраста”. Пользователь вводит возраст, а программа должна понять, можно ли ему пройти дальше.

Для этого возраст нужно где-то сохранить:

```java
int age = 18;
```

Переменная `age` хранит число `18`.

***

### 5.2. Что такое переменная

Переменная — это именованное место для хранения данных.

Пример:

```java
int age = 18;
```

Разберём строку:

| Часть | Значение              |
| ----- | --------------------- |
| `int` | тип данных            |
| `age` | имя переменной        |
| `=`   | оператор присваивания |
| `18`  | значение              |
| `;`   | конец команды         |

Можно представить так:

```
age → 18
```

То есть переменная `age` сейчас хранит значение `18`.

***

### 5.3. Объявление и инициализация

Есть два действия:

```
объявление переменной
инициализация переменной
```

### Объявление

Объявление сообщает Java, что такая переменная существует.

```java
int age;
```

Здесь переменная создана, но значение ещё не записано.

### Инициализация

Инициализация — первое присваивание значения.

```java
age = 18;
```

Можно сделать всё сразу:

```java
int age = 18;
```

***

### 5.4. Почему локальную переменную нельзя использовать без значения

Пример:

```java
public class Main {
    public static void main(String[] args) {
        int age;
        System.out.println(age);
    }
}
```

Такой код не скомпилируется.

Причина: локальная переменная `age` не получила значение.

Java не будет угадывать, что туда поставить. Она не думает: “Ну, наверное, 0”. Она просто сообщает об ошибке.

Правильно:

```java
int age = 0;
System.out.println(age);
```

***

### 5.5. Изменение значения переменной

Значение переменной можно менять.

```java
int count = 0;

count = 1;
count = 2;

System.out.println(count);
```

Результат:

```
2
```

Переменная хранит последнее присвоенное значение.

***

### 5.6. Присваивание не равно математическому равенству

В математике запись:

```
x = x + 1
```

выглядела бы странно.

В программировании:

```java
x = x + 1;
```

это нормальная операция.

Она означает:

1. Взять текущее значение `x`.
2. Прибавить 1.
3. Записать результат обратно в `x`.

Пример:

```java
int x = 5;
x = x + 1;

System.out.println(x);
```

Результат:

```
6
```

***

### 5.7. Сокращённые операции

Java позволяет писать короче.

```java
x = x + 1;
```

Можно заменить на:

```java
x += 1;
```

Или ещё короче:

```java
x++;
```

Примеры:

```java
int x = 10;

x += 5;  // x = x + 5
x -= 2;  // x = x - 2
x *= 3;  // x = x * 3
x /= 4;  // x = x / 4
```

***

### 5.8. Инкремент и декремент

Инкремент увеличивает значение на 1:

```java
x++;
```

Декремент уменьшает значение на 1:

```java
x--;
```

Пример:

```java
int count = 0;

count++;
count++;

System.out.println(count);
```

Результат:

```
2
```

***

### 5.9. Имена переменных

Имя переменной должно быть понятным.

Плохо:

```java
int a = 18;
String b = "Anna";
double c = 99.99;
```

Непонятно, что означают `a`, `b`, `c`.

Лучше:

```java
int age = 18;
String name = "Anna";
double price = 99.99;
```

Код читается легче.

***

### 5.10. Правила именования

Можно:

```java
int age;
int studentAge;
int count2;
```

Нельзя:

```java
int 2count;
int student age;
int class;
```

Почему нельзя:

* имя не может начинаться с цифры;
* пробелы в имени запрещены;
* нельзя использовать ключевые слова Java.

***

### 5.11. Стиль camelCase

В Java переменные обычно называют в стиле `camelCase`.

Пример:

```java
int studentAge;
double productPrice;
String userName;
```

Первое слово пишется с маленькой буквы, следующие слова начинаются с большой.

***

### 5.12. Константы

Если значение не должно меняться, используют `final`.

```java
final double PI = 3.14;
```

Теперь нельзя написать:

```java
PI = 3.15; // ошибка
```

Константы часто пишут большими буквами:

```java
final int MAX_ATTEMPTS = 3;
```

***

### 5.13. Область видимости переменной

Область видимости — часть программы, где переменная доступна.

Пример:

```java
public class Main {
    public static void main(String[] args) {
        int x = 10;

        if (x > 5) {
            int y = 20;
            System.out.println(y);
        }

        System.out.println(x);
    }
}
```

Переменная `x` доступна внутри всего метода `main`.

Переменная `y` доступна только внутри блока `if`.

Ошибка:

```java
if (x > 5) {
    int y = 20;
}

System.out.println(y); // ошибка
```

`y` существует только внутри фигурных скобок `if`.

***

### 5.14. Блок кода

Блок кода ограничивается фигурными скобками:

```java
{
    // код
}
```

Переменные, созданные внутри блока, обычно доступны только внутри этого блока.

Это важно для:

* `if`;
* `for`;
* `while`;
* методов;
* классов.

***

### 5.15. Переменные в цикле

```java
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
```

Переменная `i` существует только внутри цикла.

Такой код будет ошибкой:

```java
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}

System.out.println(i); // ошибка
```

***

### 5.16. Поля класса и локальные переменные

Локальная переменная создаётся внутри метода.

```java
public static void main(String[] args) {
    int age = 18;
}
```

Поле класса создаётся внутри класса, но вне методов.

```java
class Student {
    String name;
    int age;
}
```

Поля принадлежат объекту. Локальные переменные принадлежат методу или блоку.

***

### 5.17. Связь с Android

В Android переменные используются постоянно.

Например, счётчик:

```java
int count = 0;
```

При нажатии кнопки:

```java
count++;
countText.setText("Счёт: " + count);
```

Переменная хранит состояние экрана.

Ещё пример:

```java
EditText nameInput;
TextView resultText;
Button button;
```

Это переменные, которые хранят ссылки на элементы интерфейса.

***

### 5.18. Типичные ошибки новичков

#### Ошибка 1. Использовать переменную до присваивания

```java
int x;
System.out.println(x);
```

Правильно:

```java
int x = 0;
System.out.println(x);
```

***

#### Ошибка 2. Путать `=` и `==`

```java
int x = 5;
```

`=` — присваивание.

```java
if (x == 5)
```

`==` — сравнение.

***

#### Ошибка 3. Давать непонятные имена

Плохо:

```java
int a;
int b;
int c;
```

Лучше:

```java
int age;
int score;
int attempts;
```

***

#### Ошибка 4. Обращаться к переменной вне области видимости

```java
if (true) {
    int number = 10;
}

System.out.println(number); // ошибка
```

***

### 5.19. Как могут спросить на экзамене

#### Вопрос

Что такое переменная?

#### Хороший ответ

> Переменная — это именованная область памяти, в которой хранится значение или ссылка на объект. У переменной есть тип, имя и значение.

***

#### Вопрос

Что такое область видимости?

#### Хороший ответ

> Область видимости — это часть программы, где переменная доступна. Например, переменная, созданная внутри блока `if`, недоступна за его пределами.

***

#### Вопрос

Чем отличается `=` от `==`?

#### Хороший ответ

> `=` используется для присваивания значения переменной, а `==` используется для сравнения значений.

***

### 5.20. Практические задания

#### Задание 1

Создайте переменные:

* имя;
* возраст;
* группа;
* средний балл.

Выведите их в консоль.

***

#### Задание 2

Создайте переменную `count` со значением `0`. Увеличьте её на 1 тремя способами:

```java
count = count + 1;
count += 1;
count++;
```

Выведите результат.

***

#### Задание 3

Создайте константу `MAX_SCORE = 100`. Попробуйте изменить её значение. Посмотрите, какую ошибку покажет Java.

***

#### Задание 4

Создайте переменную внутри блока `if` и попробуйте вывести её за пределами блока. Объясните ошибку.

***

### 5.21. Вопросы для самопроверки

1. Что такое переменная?
2. Что такое объявление переменной?
3. Что такое инициализация?
4. Можно ли использовать локальную переменную без значения?
5. Что делает оператор `=`?
6. Что делает `x++`?
7. Что такое `final`?
8. Что такое область видимости?
9. Чем поле класса отличается от локальной переменной?
10. Где переменные используются в Android?
