> 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-2.-kak-rabotaet-kompyuter-dannye-pamyat-i-komandy.md).

# Глава 2. Как работает компьютер: данные, память и команды

### 2.1. Почему программисту нужно понимать компьютер

Можно писать простые программы, не думая о том, что происходит внутри компьютера. Но как только появляются переменные, массивы, объекты и ошибки вроде `NullPointerException`, без понимания памяти становится тяжело.

Программисту не обязательно знать устройство процессора на уровне инженера. Но важно понимать базовые идеи:

* данные где-то хранятся;
* команды выполняются последовательно;
* у переменной есть значение;
* объект создаётся в памяти;
* ссылка указывает на объект;
* неправильная работа с памятью приводит к ошибкам.

Если не понимать это, Java превращается в ритуал: написал `new`, поставил точку, надеешься, что сработает. Примерно так шаманы работали с дождём, только у них хотя бы костюмы были эффектнее.

***

### 2.2. Что такое данные

Данные — это информация, с которой работает программа.

Примеры данных:

```
18
"Anna"
true
99.99
'A'
```

В программе данные могут означать:

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

Java хранит данные в переменных.

```java
int age = 18;
String name = "Anna";
boolean active = true;
```

***

### 2.3. Что такое память

Память компьютера можно представить как большое хранилище ячеек. В этих ячейках программа хранит данные во время работы.

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

На начальном уровне важно понимать:

```
переменная → хранит значение или ссылку
объект → создаётся в памяти
массив → хранит набор значений
```

***

### 2.4. Переменная как именованное место для данных

Когда мы пишем:

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

мы создаём переменную `age`, в которой хранится число `18`.

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

```
age → 18
```

Если изменить значение:

```java
age = 19;
```

теперь:

```
age → 19
```

Переменная не является навсегда привязанной к первому значению. Её можно изменять, если она не объявлена как `final`.

***

### 2.5. Примитивы и объекты

В Java есть примитивные типы и ссылочные типы.

#### Примитивы

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

Примеры:

```java
int age = 18;
double price = 99.99;
boolean active = true;
char letter = 'A';
```

Здесь переменная хранит само значение.

Упрощённо:

```
age → 18
active → true
```

#### Ссылочные типы

Ссылочные типы хранят ссылку на объект.

Пример:

```java
String name = "Anna";
```

`String` — объект.

Позже вы будете создавать свои объекты:

```java
Student student = new Student("Anna", 18);
```

Здесь `student` хранит не сам объект, а ссылку на него.

Упрощённо:

```
student → объект Student
```

***

### 2.6. Что такое ссылка

Ссылка — это указание на объект в памяти.

Пример:

```java
Student s1 = new Student("Anna", 18);
Student s2 = s1;
```

Здесь создан один объект. Но на него указывают две переменные:

```
s1 ─┐
    ├── объект Student
s2 ─┘
```

Если изменить объект через `s2`:

```java
s2.name = "Max";
```

то при обращении через `s1` тоже будет видно новое имя:

```java
System.out.println(s1.name);
```

Результат:

```
Max
```

Потому что объект один.

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

***

### 2.7. Что такое null

`null` означает, что переменная не указывает ни на какой объект.

```java
Student student = null;
```

Если попытаться обратиться к полю или методу:

```java
System.out.println(student.name);
```

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

```
NullPointerException
```

Смысл ошибки:

```
Вы пытаетесь использовать объект, которого нет.
```

В Android такие ошибки тоже встречаются. Например, если элемент интерфейса не был найден через `findViewById`, а вы пытаетесь вызвать у него метод.

***

### 2.8. Команды и порядок выполнения

Компьютер выполняет команды сверху вниз.

```java
int x = 5;
x = x + 1;
System.out.println(x);
```

Разбор:

1. `x` получает значение `5`.
2. `x` увеличивается на `1`.
3. выводится `6`.

Если поменять порядок:

```java
int x = 5;
System.out.println(x);
x = x + 1;
```

выведется:

```
5
```

Порядок важен. Компьютер не пересматривает команды и не думает: “Наверное, эту строку надо было выполнить после увеличения”.

***

### 2.9. Что такое состояние программы

Состояние программы — это текущие значения всех переменных и объектов в конкретный момент.

Пример:

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

После этих строк состояние:

```
count = 2
```

В Android состояние особенно важно. Например, у счётчика есть значение:

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

При каждом нажатии кнопки оно меняется:

```java
count++;
```

И интерфейс обновляется:

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

То есть мобильное приложение — это не просто экран. Это экран плюс состояние.

***

### 2.10. Стек и куча: очень упрощённо

В Java часто говорят о стеке и куче. Для начального уровня достаточно простой картины.

#### Stack

Стек хранит локальные переменные и информацию о вызовах методов.

Пример:

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

Переменная `x` живёт внутри метода `main`.

#### Heap

Куча хранит объекты.

```java
Student student = new Student("Anna", 18);
```

Объект `Student` создаётся в куче, а переменная `student` хранит ссылку на него.

Упрощённо:

```
Stack: student → ссылка
Heap: объект Student
```

Не нужно пока знать все детали управления памятью. Но важно понимать разницу:

```
переменная-ссылка не равна объекту
```

***

### 2.11. Почему это важно для массивов

Массив — это объект.

```java
int[] numbers = new int[5];
```

Переменная `numbers` хранит ссылку на массив.

Если написать:

```java
int[] a = {1, 2, 3};
int[] b = a;

b[0] = 100;

System.out.println(a[0]);
```

Результат:

```
100
```

Потому что `a` и `b` указывают на один массив.

***

### 2.12. Почему это важно для Android

В Android вы постоянно работаете со ссылками на объекты интерфейса:

```java
Button button = findViewById(R.id.myButton);
TextView text = findViewById(R.id.myText);
```

`button` и `text` — это ссылки на объекты интерфейса.

Если объект не найден, может быть `null`.

Если вы вызываете метод у `null`, приложение падает.

Поэтому понимание ссылок и `null` напрямую связано с мобильной разработкой.

***

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

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

```java
Student student;
System.out.println(student.name);
```

Объект не создан.

Правильно:

```java
Student student = new Student("Anna", 18);
System.out.println(student.name);
```

#### Ошибка 2. Думать, что две ссылки — это два объекта

```java
Student s1 = new Student("Anna", 18);
Student s2 = s1;
```

Это один объект и две ссылки.

#### Ошибка 3. Не понимать, почему изменился массив

```java
int[] a = {1, 2, 3};
int[] b = a;

b[0] = 99;

System.out.println(a[0]);
```

Результат:

```
99
```

Потому что массив один.

***

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

#### Вопрос

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

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

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

#### Вопрос

Что такое ссылка?

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

> Ссылка — это значение, которое указывает на объект в памяти. Например, переменная типа `Student` хранит не сам объект, а ссылку на объект `Student`.

#### Вопрос

Что такое `null`?

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

> `null` означает, что переменная ссылочного типа не указывает ни на какой объект. Если вызвать метод или поле у `null`, возникнет `NullPointerException`.

***

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

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

Что выведет код?

```java
int x = 5;
x = x + 2;
System.out.println(x);
```

Объясните по шагам.

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

Что выведет код?

```java
int[] a = {1, 2, 3};
int[] b = a;
b[1] = 100;
System.out.println(a[1]);
```

Объясните, почему.

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

Опишите своими словами, чем примитив отличается от объекта.

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

Объясните, почему в Android может возникнуть `NullPointerException`.

***

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

1. Что такое данные?
2. Что такое память?
3. Что хранит переменная примитивного типа?
4. Что хранит переменная ссылочного типа?
5. Что такое объект?
6. Что такое ссылка?
7. Что означает `null`?
8. Почему две переменные могут указывать на один объект?
9. Почему массив является объектом?
10. Почему понимание ссылок важно для Android?
