HTML Diff
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>