0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Оговорка:</strong>14</p>
1
<p><strong>Оговорка:</strong>14</p>
2
<p>static level method field.</p>
2
<p>static level method field.</p>
3
<p>Перед просмотром лекции желательно освежить в памяти знания про методы: что такое методы, как их создавать и как их вызывать, и про пакеты.</p>
3
<p>Перед просмотром лекции желательно освежить в памяти знания про методы: что такое методы, как их создавать и как их вызывать, и про пакеты.</p>
4
<p><em><strong>инстанс (instance)</strong></em>- один экземпляр (объект), созданный на основе класса.</p>
4
<p><em><strong>инстанс (instance)</strong></em>- один экземпляр (объект), созданный на основе класса.</p>
5
<p><em><strong>instantiation (создание объекта)</strong></em>- процесс создания объекта на основе класса. Пример: new Object(); - где-то в памяти создан один экземпляр класса Object.</p>
5
<p><em><strong>instantiation (создание объекта)</strong></em>- процесс создания объекта на основе класса. Пример: new Object(); - где-то в памяти создан один экземпляр класса Object.</p>
6
<h2>Уровни методов</h2>
6
<h2>Уровни методов</h2>
7
<p>Методы бывают двух уровней -<em>уровня инстанс (не static)</em>и<em>уровня класса (static)</em>. Метод уровня инстанс - без ключевого слова static, если же слово static присутствует - метод уровня класса.</p>
7
<p>Методы бывают двух уровней -<em>уровня инстанс (не static)</em>и<em>уровня класса (static)</em>. Метод уровня инстанс - без ключевого слова static, если же слово static присутствует - метод уровня класса.</p>
8
<blockquote><p><em>Поля, как и методы, тоже имеют уровень класса и объекта. Поля с модификатором static видны всем объектам (инстансам) класса, а без этого модификатора - видны только внутри отдельно взятого инстанса.</em></p>
8
<blockquote><p><em>Поля, как и методы, тоже имеют уровень класса и объекта. Поля с модификатором static видны всем объектам (инстансам) класса, а без этого модификатора - видны только внутри отдельно взятого инстанса.</em></p>
9
</blockquote><p><em><strong>Пример instance level methods:</strong></em></p>
9
</blockquote><p><em><strong>Пример instance level methods:</strong></em></p>
10
<ul><li>Первый метод printGameName() - выводит на экран название игры.</li>
10
<ul><li>Первый метод printGameName() - выводит на экран название игры.</li>
11
<li>Второй метод printLevelCount() - выводит на экран количество уровней.</li>
11
<li>Второй метод printLevelCount() - выводит на экран количество уровней.</li>
12
</ul><p>Ссылка this не обязательна перед полем levels, поскольку метод нестатический и он привязан к конкретному экземпляру класса. Компилятор сам подставит туда this.</p>
12
</ul><p>Ссылка this не обязательна перед полем levels, поскольку метод нестатический и он привязан к конкретному экземпляру класса. Компилятор сам подставит туда this.</p>
13
<p>Эту ссылку, this, каждый нестатический метод, хранит в своем фрейме (помним, что фреймы методов находятся в стеке).</p>
13
<p>Эту ссылку, this, каждый нестатический метод, хранит в своем фрейме (помним, что фреймы методов находятся в стеке).</p>
14
<p>Чтобы вызывать нестатические методы - нужен конкретный инстанс. Сначала создаем инстанс класса, и после этого только вызываем.</p>
14
<p>Чтобы вызывать нестатические методы - нужен конкретный инстанс. Сначала создаем инстанс класса, и после этого только вызываем.</p>
15
<p>Нужен ли this при вызове этого метода? (Указатель на текущий инстанс в оперативной памяти).</p>
15
<p>Нужен ли this при вызове этого метода? (Указатель на текущий инстанс в оперативной памяти).</p>
16
<p>В методе printGameName() не нужен, поскольку он привязан к своему объекту.</p>
16
<p>В методе printGameName() не нужен, поскольку он привязан к своему объекту.</p>
17
<p><em><strong>Добавим статический метод и поле:</strong></em></p>
17
<p><em><strong>Добавим статический метод и поле:</strong></em></p>
18
<p>При создании фрейма в стеке, для метода уровня класса, в фрейме не будет ссылки this. Такие методы не имеют доступа к полям инстанса. Для вызова такого метода не нужен инстанс, так как он не использует поля инстанса. Вызвать такой метод можно из под имени класса.</p>
18
<p>При создании фрейма в стеке, для метода уровня класса, в фрейме не будет ссылки this. Такие методы не имеют доступа к полям инстанса. Для вызова такого метода не нужен инстанс, так как он не использует поля инстанса. Вызвать такой метод можно из под имени класса.</p>
19
<p>Вот так:</p>
19
<p>Вот так:</p>
20
<p>Но что делать, если нам нужен один статический метод, который сможет делать изменения в экземплярах своего класса или получать доступ к нестатическим полям этих экземпляров? - Нужно передать ему экземпляр, с которым должен провзаимодействовать этот статический метод.</p>
20
<p>Но что делать, если нам нужен один статический метод, который сможет делать изменения в экземплярах своего класса или получать доступ к нестатическим полям этих экземпляров? - Нужно передать ему экземпляр, с которым должен провзаимодействовать этот статический метод.</p>
21
<p>Переделаем наш Game так:</p>
21
<p>Переделаем наш Game так:</p>
22
<p>Использовать это можно так:</p>
22
<p>Использовать это можно так:</p>
23
<h2>Статическое импортирование (дополнение к "Модуль 2. Урок 4. Пакеты в Java.")</h2>
23
<h2>Статическое импортирование (дополнение к "Модуль 2. Урок 4. Пакеты в Java.")</h2>
24
<p>Статический импорт позволяет использовать статические методы и поля импортируемых классов без имен этих классов.</p>
24
<p>Статический импорт позволяет использовать статические методы и поля импортируемых классов без имен этих классов.</p>
25
<p>Разберем пример:</p>
25
<p>Разберем пример:</p>
26
<p>Этот класс использует статический метод и поле: sqrt и out (у статического поля out мы просто вызвали метод println). Если проследить их пакетную иерархию - обнаружится, что Math и System находятся в java.lang, то есть они импортированы автоматически.</p>
26
<p>Этот класс использует статический метод и поле: sqrt и out (у статического поля out мы просто вызвали метод println). Если проследить их пакетную иерархию - обнаружится, что Math и System находятся в java.lang, то есть они импортированы автоматически.</p>
27
<p>Но мы можем использовать эти статические методы и поля прямо, без указания имени их классов.</p>
27
<p>Но мы можем использовать эти статические методы и поля прямо, без указания имени их классов.</p>
28
<p>Для статического импорта, сюрприз-сюрприз, используется ключевое слово static перед адресом и звездочки .* после имени класса.</p>
28
<p>Для статического импорта, сюрприз-сюрприз, используется ключевое слово static перед адресом и звездочки .* после имени класса.</p>
29
<p>Пример:</p>
29
<p>Пример:</p>
30
<p>Не смотря на то, что java.lang и так импортируется автоматически, для статического импорта - все равно пришлось прописать импорты необходимых классов.</p>
30
<p>Не смотря на то, что java.lang и так импортируется автоматически, для статического импорта - все равно пришлось прописать импорты необходимых классов.</p>
31
<p>Обратите внимание, что при импортировании классов - точки в конце не нужно ставить!</p>
31
<p>Обратите внимание, что при импортировании классов - точки в конце не нужно ставить!</p>
32
<p>Дальше создание классов на реальном проекте "Крестики-нолики".</p>
32
<p>Дальше создание классов на реальном проекте "Крестики-нолики".</p>
33
<h2>Полезные ссылки</h2>
33
<h2>Полезные ссылки</h2>
34
<ul><li><a>Static методы / static переменные</a></li>
34
<ul><li><a>Static методы / static переменные</a></li>
35
<li><a>Использование ключевого слова this</a></li>
35
<li><a>Использование ключевого слова this</a></li>
36
</ul>
36
</ul>