<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 17:19:43 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="7hFem_QOMQCE5ESyLE3Z7aA_7vLGQSScL8oPOnuXCCsBwJWsBnCcYDKnYCogQimaYDbDWM522j6SKpVuKZDvRQ";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Модуль 8. Урок 1. Nested (static) классы в Java. | Введение в Java</title>
<meta name="description" content="Модуль 8. Урок 1. Nested (static) классы в Java. / Введение в Java: Получить теоретические знания о том, что такое вложенные (nested) классы в Java и закрепить полученные навыки на практике.">
<link rel="canonical" href="https://ru.hexlet.io/courses/java_101/lessons/nested/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Модуль 8. Урок 1. Nested (static) классы в Java.">
<meta property="og:title" content="Введение в Java">
<meta property="og:description" content="Модуль 8. Урок 1. Nested (static) классы в Java. / Введение в Java: Получить теоретические знания о том, что такое вложенные (nested) классы в Java и закрепить полученные навыки на практике.">
<meta property="og:url" content="https://ru.hexlet.io/courses/java_101/lessons/nested/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="asieW3k8J3bef4fAwxxqLWOzvLxgmRvdlJdmUDh7OTeFGVVsi0KKFmg8o1jPE5pao7qRFmiu5X8pd_wEanzeWQ" />
<script src="/vite/assets/inertia-INZxX8jp.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-6pOtQ3OW.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T17:19:43.480Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"Z-vY0dz6yefPJR1w3CHB1OvelICqOhp6qY9RYGtofCyIOhPmLoRkh3lmOejQLjGjK9e5KqIN5NgUb8s0OW-bQg","topics":[{"id":4702,"title":"```\n public static class Builder {\n \n public Player player1;\n\n public Player player2;\n\t\n public Field field;\n\n public String name;\n \n public Player getPlayer1() {\n \treturn this.player1;\n }\n \n public Player getPlayer2() {\n \treturn this.player2;\n }\n \n public Field getField() {\n \t return this.field;\n }\n \n public String getName() {\n \treturn this.name;\n }\n \n public Builder player1(final Player palyer1) {\n this.player1 = player1;\n return this;\n }\n \n public Builder player2(final Player palyer2) {\n this.player2 = player2;\n return this;\n }\n \n public Builder field(final Field field) {\n this.field = field;\n return this;\n }\n \n public Builder name(final String name) {\n this.name = name;\n return this;\n }\n \n public Game build() {\n return new Game(this);\n }\n }\n```\n\nОшибка \n\n> make: Entering directory `/usr/src/app'\n> mkdir -p out\n> find . | grep java > sources.txt\n> javac @sources.txt -sourcepath src -d out -cp out\n> java -cp ./out Main\n> Exception in thread \"main\" java.lang.NullPointerException\n> \tat Main.main(Main.java:24)\n> make: *** [test] Error 1\n> make: Leaving directory `/usr/src/app'\n> Run failed! Check and fix errors above!\n\nВроде все правильно сделал. Подскажите что тут не так)","plain_title":" public static class Builder { public Player player1; public Player player2; public Field field; public String name; public Player getPlayer1() { return this.player1; } public Player getPlayer2() { return this.player2; } public Field getField() { return this.field; } public String getName() { return this.name; } public Builder player1(final Player palyer1) { this.player1 = player1; return this; } public Builder player2(final Player palyer2) { this.player2 = player2; return this; } public Builder field(final Field field) { this.field = field; return this; } public Builder name(final String name) { this.name = name; return this; } public Game build() { return new Game(this); } } Ошибка make: Entering directory /usr/src/app' mkdir -p out find . | grep java > sources.txt javac @sources.txt -sourcepath src -d out -cp out java -cp ./out Main Exception in thread \"main\" java.lang.NullPointerException at Main.main(Main.java:24) make: *** [test] Error 1 make: Leaving directory/usr/src/app' Run failed! Check and fix errors above! Вроде все правильно сделал. Подскажите что тут не так) ","creator":{"public_name":"Алексей Синдюков","id":102309,"is_tutor":false},"comments":[{"creator":{"public_name":"Алексей Синдюков","id":102309,"is_tutor":false},"id":8172,"body":"Уже разобрался, была опечатка. Написал palyer1 вместо player1)","topic_id":4702},{"creator":{"public_name":"Роман Лахтадыр","id":103858,"is_tutor":false},"id":8170,"body":"Вы видите где именно возникла ошибка? \n\n`at Main.main(Main.java:24)`\n\n`NullPointerException` означает что Вы пытаетесь обратиться к полю или вызвать метод у `null`.","topic_id":4702}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":41244,"title":"Не хватает больше реальных кейсов применения такого типа классов.\n\nМожно сказать, что в целом вложенные классы используются, как вспомогательные (типа билдера), для разбиения кода на логические блоки, и частично для инкапсуляции? Другими словами, это больше для удобности чтения и понимания кода и применения принципов ООП? ","plain_title":"Не хватает больше реальных кейсов применения такого типа классов. Можно сказать, что в целом вложенные классы используются, как вспомогательные (типа билдера), для разбиения кода на логические блоки, и частично для инкапсуляции? Другими словами, это больше для удобности чтения и понимания кода и применения принципов ООП? ","creator":{"public_name":"","id":208622,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":89915,"body":"Можно и так сказать. Каждый видит в них свои преимущества.","topic_id":41244}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":41345,"title":"Не удается разобраться с этим вопросом теста, перепробовал множество комбинаций - не принимает. \n\n1.Вложенный (Static Nested) класс не имеет доступ к закрытым не статическим членам своего внешнего класса\n>> Что здесь имеется ввиду под \"закрытыми членами внешнего класса\"? Любые private поля внешнего класса? Если так, то этот вариант я не отмечаю, так как доступ можно получить через инстанс внешнего класса. Так?\n\n\n2.Вложенный (Static Nested) класс нельзя наследовать\n>> Покопался в документации и на обучающих сайтах - есть примеры наследования, этот вариант не отмечаю. \n\n3.Вложенный (Static Nested) класс имеет доступ к закрытым static полям своего внешнего класса\n>> В заметках под лекцией сказано \"Вложенный класс (Static Nested) имеет доступ к членам своего внешнего класса, в том числе и к закрытым членам.\"\nВ то же время в документации Java вижу следующее \"Static nested classes do not have access to other members of the enclosing class.\" \nМне кажется, или утверждения противоречат друг другу? \n\n\n4.Вложенный (Static Nested) класс не имеет доступа к не статическим членам своего внешнего класса напрямую\n>> Отмечаю этот вариант, по той же причине что не отмечаю 1. \n\n\n5.Вложенный (Nested) класс можно наследовать\n>> Покопался в документации и на обучающих сайтах - есть примеры наследования, этот вариант отмечаю. \n\n\n6.Вложенный (Static Nested) класс имеет доступ к static членам своего внешнего класса\n>> Не смог найти явного ответа в документации, пробовал и отмечать и не отмечать, не принимает. \n\nМожете дать ссылку на исчерпывающее описание этой темы с примерами? \n","plain_title":"Не удается разобраться с этим вопросом теста, перепробовал множество комбинаций - не принимает. 1.Вложенный (Static Nested) класс не имеет доступ к закрытым не статическим членам своего внешнего класса Что здесь имеется ввиду под \"закрытыми членами внешнего класса\"? Любые private поля внешнего класса? Если так, то этот вариант я не отмечаю, так как доступ можно получить через инстанс внешнего класса. Так? 2.Вложенный (Static Nested) класс нельзя наследовать Покопался в документации и на обучающих сайтах - есть примеры наследования, этот вариант не отмечаю. 3.Вложенный (Static Nested) класс имеет доступ к закрытым static полям своего внешнего класса В заметках под лекцией сказано \"Вложенный класс (Static Nested) имеет доступ к членам своего внешнего класса, в том числе и к закрытым членам.\" В то же время в документации Java вижу следующее \"Static nested classes do not have access to other members of the enclosing class.\" Мне кажется, или утверждения противоречат друг другу? 4.Вложенный (Static Nested) класс не имеет доступа к не статическим членам своего внешнего класса напрямую Отмечаю этот вариант, по той же причине что не отмечаю 1. 5.Вложенный (Nested) класс можно наследовать Покопался в документации и на обучающих сайтах - есть примеры наследования, этот вариант отмечаю. 6.Вложенный (Static Nested) класс имеет доступ к static членам своего внешнего класса Не смог найти явного ответа в документации, пробовал и отмечать и не отмечать, не принимает. Можете дать ссылку на исчерпывающее описание этой темы с примерами? ","creator":{"public_name":"Konstantin Valeev","id":103577,"is_tutor":false},"comments":[{"creator":{"public_name":"Ильнар Шафигуллин","id":210551,"is_tutor":false},"id":90127,"body":"Добрый день!\n\nЗдесь есть некоторая неточность в первом утверждении.\n\nВы правы, что static nested class имеет доступ к нестатическим `private` полям внешнего класса через его экземпляр. Но с точки зрения данного теста, этот вариант необходимо пометить как верный.\n\nВ качестве примера можно накрутить вот такую конструкцию:\n```\npublic class Univer {\n private String univerName;\n\n private Univer(String uName) {\n this.univerName = uName;\n }\n\n static class Student{\n private String studentName;\n\n public static void showUniverName(){\n System.out.println(new Univer(\"MIT\").univerName);\n }\n\n public Student(){\n\n }\n\n public Student(String studentName) {\n this.studentName = studentName;\n }\n }\n}\n```\n\nДанное утверждение в тесте необходимо перефразировать.","topic_id":41345},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":90205,"body":"Здравствуйте.\n\nСпасибо за внимательность. :)\n\nБлагодаря вашим замечаниям я дополнил урок и подправил ответы в тестах.","topic_id":41345}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":1035,"title":"В какой части листинга кода тора рекомендует располагать вложенные классы?","plain_title":"В какой части листинга кода тора рекомендует располагать вложенные классы? ","creator":{"public_name":"Базыль Яськевіч","id":58623,"is_tutor":false},"comments":[{"creator":{"public_name":"Глеб Бочкарёв","id":50147,"is_tutor":false},"id":1986,"body":"Не понятно, что такое тора, но рекомендуется располагать вложенные классы в конце - сначала поля, потом методы, потом вложенные классы.","topic_id":1035}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":43539,"title":"А тест точно правильно работает?\n\n```\n(++) Static Nested класс НЕ имеет доступ к закрытым не-static членам внешнего класса, без его экземпляра.\n\n(++) Static Nested класс нельзя наследовать.\n\n(++) Static Nested класс имеет доступ к static членам внешнего класса, без его экземпляра.\n\n(--) Static Nested класс имеет доступ к закрытым (private) полям своего внешнего класса.\n\n(--) Static Nested класс может обращаться, к членам внешнего класса, независимо от уровня доступа (static/instance).\n\n(++) Вложенный (Nested) класс можно наследовать\n\n(++) Static Nested класс не имеет доступа к НЕстатическим членам внешнего класса без его экземпляра.\n\n```\n\nЯ каждое утверждение перепроверил в iDE, я не понимаю почему тест не проходит. ","plain_title":"А тест точно правильно работает? (++) Static Nested класс НЕ имеет доступ к закрытым не-static членам внешнего класса, без его экземпляра. (++) Static Nested класс нельзя наследовать. (++) Static Nested класс имеет доступ к static членам внешнего класса, без его экземпляра. (--) Static Nested класс имеет доступ к закрытым (private) полям своего внешнего класса. (--) Static Nested класс может обращаться, к членам внешнего класса, независимо от уровня доступа (static/instance). (++) Вложенный (Nested) класс можно наследовать (++) Static Nested класс не имеет доступа к НЕстатическим членам внешнего класса без его экземпляра. Я каждое утверждение перепроверил в iDE, я не понимаю почему тест не проходит. ","creator":{"public_name":"Igor Linder","id":261935,"is_tutor":false},"comments":[{"creator":{"public_name":"Igor Linder","id":261935,"is_tutor":false},"id":94749,"body":"**Сергей Алексеенко**, тогда мне кажется стоит сделать уточнение. к какому полю? static или non-static ? а то получается что можно трактовать и так и так. и фактически угадывать что имел ввиду автор теста.","topic_id":43539},{"creator":{"public_name":"Igor Linder","id":261935,"is_tutor":false},"id":94669,"body":"**Сергей Алексеенко**, Я вчера видимо под устал и не совсем внимательно читал, но сегодня детально разобрался. но все равно тест не проходит.","topic_id":43539},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":94619,"body":"Давайте код — будем разбираться.\n\nКстати, Вы выбрали два противоречащих утверждения, про наследование, как верные.","topic_id":43539},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":94620,"body":"Или вот пощупайте вот этот код:\n\n```java\npublic class External1 {\n\tprivate static int instanceCounter;\n\tprivate int a;\n\tprivate int b;\n\t\n\tpublic External1(int a, int b) {\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tinstanceCounter++;\n\t}\n\t\n\t//\tprivate // Смело экспериментируйте!\n\tstatic void messenger(String incomeMessage) {\n\t\tString someMessage = \"No massage!\";\n\t\tif (incomeMessage != null && !incomeMessage.isEmpty()) {\n\t\t\tsomeMessage = incomeMessage;\n\t\t}\n\t\tSystem.out.printf(\"The static method of the outer class. Message: %s\\n\", someMessage);\n\t}\n\t// Все, что нам нужно от объектов External.\n\tvoid sum() {\n\t\tint result = a + b;\n\t\tSystem.out.printf(\"The non-static method of the outer class. %d + %d = %d\\n\", a, b, result);\n\t}\n\t\n\tstatic class NestedFoo {\n\t\tstatic int getInstanceCounter() {\n\t\t\tSystem.out.println(\"getInstanceCounter() method in inner class.\");\n\t\t\t// Свободный доступ к статическому полю внешнего класса:\n\t\t\treturn instanceCounter;\n\t\t}\n\t\tvoid methodFoExperiments() {\n\t\t\tSystem.out.println(\"methodFoExperiments() method in inner class.\");\n\n//\t\t\ta = 5; // Ошибка!\n//\t\t\tb = 5; // Ошибка!\n\t\t\t// Свободный доступ к методу внешнего класса:\n\t\t\tmessenger(\"1 вызов из methodFoExperiments()\"); // даже без упоминания его имени.\n\t\t\tExternal1.messenger(\"2 вызов из methodFoExperiments()\"); // Или с упоминанием его имени.\n\t\t\t\n\t\t\tExternal1 instanceInInner = new External1(10, 10);\n\t\t\tinstanceInInner.a = 5; // Доступ к private полю через объект.\n\t\t\tinstanceInInner.b = 5; // Доступ к default (package visible) полю через объект.\n\t\t\t\n\t\t\tinstanceInInner.sum();\n\t\t\t\n\t\t\tmessenger(\"After second instantiation in inner class. Counter = \"\n\t\t\t\t\t+ External1.NestedFoo.getInstanceCounter());\n\t\t}\n\t}\n}\n\n// Где-то в этом же пакете класс:\nclass SomeMainClass {\n\tpublic static void main(String[] args) {\n\t\tExternal1.messenger(\"Before instantiation. Counter = \"\n\t\t\t\t+ External1.NestedFoo.getInstanceCounter());\n\t\t\n\t\tExternal1 instance = new External1(2, 2);\n\t\tinstance.sum();\n\t\tExternal1.messenger(\"After first instantiation. Counter = \"\n\t\t\t\t+ External1.NestedFoo.getInstanceCounter());\n\n//\t\tExternal.NestedFoo.methodFoExperiments(); // Ошибка!\n\t\t\n\t\tExternal1.NestedFoo nestedInstance = new External1.NestedFoo();\n\t\t\n\t\tnestedInstance.methodFoExperiments();\n\t}\n}\n```","topic_id":43539},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":94764,"body":"> к какому полю? static или non-static ?\n\nК обоим. В том то и дело. К обоим имеет доступ. Но вот механизм разный.","topic_id":43539},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":94718,"body":"Уделите внимание вот этой строчке: \"Вложенный (Static Nested) класс имеет доступ к закрытым (private) полям своего внешнего класса.\" И полю `smth2` в вашем коде.\n> (Прямой нет, только через экземпляр)\n\nНе совсем так. Все зависит от модификатора `static`. Будьте внимательны.\n\nВ остальном все верно.\n","topic_id":43539},{"creator":{"public_name":"Igor Linder","id":261935,"is_tutor":false},"id":94668,"body":"**Сергей Алексеенко**, \n\n```\n/**\n [x] Вложенный (Static Nested) класс нельзя наследовать.\n (нет, можно)\n\n [x] Вложенный (Static Nested) класс имеет доступ к закрытым (private) полям своего внешнего класса.\n (Прямой нет, только через экземпляр)\n\n [v] Вложенный (Static Nested) класс имеет доступ к static членам своего внешнего класса, без его экземпляра.\n (да, не имеет. только через экземпляр)\n\n [v] Вложенный (Static Nested) класс НЕ имеет доступ к закрытым НЕстатическим членам своего внешнего класса, без его экземпляра.\n (да, через экзепляр)\n\n [v] Вложенный (Static Nested) класс не имеет доступа к НЕстатическим членам своего внешнего класса без его экземпляра.\n (да, через экзепляр и к закрытим и не кзакрытым)\n\n [v] Вложенный (Nested) класс можно наследовать\n (да, И inner, и Nested можно)\n\n [x] Вложенный (Static Nested) класс может обращаться, к членам внешнего класса, независимо от уровня доступа (static/instance).\n (Нет, что имеется ввиду? непосредвенно нет. к static да, к non-static через экземпляр)\n */\n\n\npublic class External {\n\n protected int a; // instanse lvl\n private int b; // instanse lvl\n public int c; // instanse lvl\n int d; // instanse lvl\n\n protected static int smth1; // class lvl\n private static int smth2; // class lvl\n public static int smth3; // class lvl\n static int smth4; // class lvl\n \n\n External(){}\n External(int a) {\n this.a = a;\n }\n\n static class Nested {\n\n static public void dosmth () {\n\n External ex = new External(); // nested --> non-static только через обьект\n // [x] Вложенный (Static Nested) класс имеет доступ к закрытым (private) полям своего внешнего класса\n ex.a = 10; // только через экземпляр\n ex.b = 20; // [v] Вложенный (Static Nested) класс НЕ имеет доступ к закрытым НЕстатическим членам своего внешнего класса, без его экземпляра.\n ex.c = 30; // (да, не имеет)\n ex.d = 40;\n \n System.out.println(\"hey nested\" + ex.a + ex.b + ex.c + ex.d );\n }\n\n static public void doStaic () { // доступ к stаtic \n // [v] Вложенный (Static Nested) класс имеет доступ к static членам своего внешнего класса, без его экземпляра.\n smth1 = 100;\n smth2 = 200;\n smth3 = 300;\n smth4 = 400;\n\n System.out.println(\"hey static \" + smth1 + smth2 + smth3 + smth4);\n }\n }\n\n class Inner {\n\n public void dosmth () { // Полный доступ ко всему\n \n External.this.a = 1;\n External.this.b = 2;\n c = 3;\n d = 4;\n\n System.out.println(\"hey inner\" + a + b + c + d );\n }\n }\n\n public class Inherit extends Nested { // наследуемся от static\n public int getA(){ // [x] Вложенный (Static Nested) класс нельзя наследовать.\n return a;\n } \n }\n\n public class Inherit2 extends Inner { // наследуемся от non-static\n public int getD(){ // [v] Вложенный (Nested) класс можно наследовать\n return d; // (да.)\n } \n }\n}\n\n\n```\n\n```\n new External().new Inner().dosmth(); // hey inner1234\n\n External.Nested.dosmth(); // hey nested10203040\n External.Nested.doStaic(); // hey static 100200300400\n\n External ex = new External(1000);\n External.Inherit in = ex.new Inherit();\n System.out.println(in.getA()); // 1000\n\n External ex2 = new External(2000);\n External.Inherit2 in2 = ex2.new Inherit2();\n\n in2.dosmth();\n\n System.out.println(in2.getD()); // 4\n```","topic_id":43539}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":1036,"title":"`Чем отличаются вложенный (Nested) класс от других классов?`\nОтвет \"Его тело вложено в тело другого класса\" нельзя рассматривать как отличительную особенность Nested класса от других, т.к. (по информации уважаемого товарища Ковалевского) существуют не-Nested классы, вложенные в тело другого класса.","plain_title":"Чем отличаются вложенный (Nested) класс от других классов? Ответ \"Его тело вложено в тело другого класса\" нельзя рассматривать как отличительную особенность Nested класса от других, т.к. (по информации уважаемого товарища Ковалевского) существуют не-Nested классы, вложенные в тело другого класса. ","creator":{"public_name":"Базыль Яськевіч","id":58623,"is_tutor":false},"comments":[{"creator":{"public_name":"Базыль Яськевіч","id":58623,"is_tutor":false},"id":1866,"body":"Да и сам вопрос сформулирован коряво. \"Чем отличаются ... класс...?\"","topic_id":1036}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":2955,"title":"Здравствуйте.\nВ тексте практики есть ошибка.\n\nДумаю, что теперь Вы знаете как решить эту проблему элегантно, чтобы игру можно было **создать более следующим** образом:\n\nВ тексте тестов опечатка\n\n**Имеем** ли вложенный (Nested) класс доступ к нестатическим членам и методам внешнего класса?","plain_title":"Здравствуйте. В тексте практики есть ошибка. Думаю, что теперь Вы знаете как решить эту проблему элегантно, чтобы игру можно было создать более следующим образом: В тексте тестов опечатка Имеем ли вложенный (Nested) класс доступ к нестатическим членам и методам внешнего класса? ","creator":{"public_name":"Вася Пупкин","id":27815,"is_tutor":false},"comments":[{"creator":{"public_name":"Глеб Бочкарёв","id":50147,"is_tutor":false},"id":4812,"body":"Спасибо!","topic_id":2955},{"creator":{"public_name":"Вячеслав Ковалевский","id":5,"is_tutor":false},"id":4814,"body":"Спасибо, поправили.","topic_id":2955}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":27915,"title":"Добрый день! Не совсем понятна в где ошибка\n\n Exception in thread \"main\" java.lang.RuntimeException: Game.getPlayer1 returns io.hexlet.xo.model.Player@15db9742 instead of io.hexlet.xo.model.Player@6d06d69c\n at Main.main(Main.java:24)\n\nсам код \n\n`// removed`","plain_title":"Добрый день! Не совсем понятна в где ошибка Exception in thread \"main\" java.lang.RuntimeException: Game.getPlayer1 returns io.hexlet.xo.model.Player@15db9742 instead of io.hexlet.xo.model.Player@6d06d69c at Main.main(Main.java:24) сам код // removed ","creator":{"public_name":"Юрий Аверьянов","id":170462,"is_tutor":false},"comments":[{"creator":{"public_name":"Юрий Аверьянов","id":170462,"is_tutor":false},"id":59943,"body":"Как я понимаю выбрасывается исключение. Я думаю что при таком варианте кода создаться должен сам класс Builder, т.e. Game.Builder name = new Game.Builder()? или я ошибаюсь?","topic_id":27915},{"creator":{"public_name":"Юрий Аверьянов","id":170462,"is_tutor":false},"id":59948,"body":"ахах)) спасибо, сразу все увидел!","topic_id":27915},{"creator":{"public_name":"Dmitriy Bataev","id":106130,"is_tutor":false},"id":59946,"body":"Здраствуйте. Ошибка вполне конкретно говорит, что getPlayer1 вернул не того игрока. Проверьте что вы возвращаете и те места, где вы задаете значение игрока.","topic_id":27915}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":52082,"title":"Здравствуйте, подскажите пожалуйста, что не так в моих ответах на эту \"вермишель из формулировок\"?\n\n\n- (+) Вложенный (Static Nested) класс не имеет доступа к НЕстатическим членам своего внешнего класса без его экземпляра.\n- (+) Вложенный (Static Nested) класс НЕ имеет доступ к закрытым НЕстатическим членам своего внешнего класса, без его экземпляра.\n- (+) Вложенный (Nested) класс можно наследовать.\n- (-) Вложенный (Static Nested) класс нельзя наследовать.\n- (-) Вложенный (Static Nested) класс имеет доступ к закрытым (private) полям своего внешнего класса.\n- (+) Вложенный (Static Nested) класс имеет доступ к static членам своего внешнего класса, без его экземпляра.\n- (-) Вложенный (Static Nested) класс может обращаться к членам внешнего класса, независимо от уровня доступа (static/instance).","plain_title":"Здравствуйте, подскажите пожалуйста, что не так в моих ответах на эту \"вермишель из формулировок\"? (+) Вложенный (Static Nested) класс не имеет доступа к НЕстатическим членам своего внешнего класса без его экземпляра. (+) Вложенный (Static Nested) класс НЕ имеет доступ к закрытым НЕстатическим членам своего внешнего класса, без его экземпляра. (+) Вложенный (Nested) класс можно наследовать. (-) Вложенный (Static Nested) класс нельзя наследовать. (-) Вложенный (Static Nested) класс имеет доступ к закрытым (private) полям своего внешнего класса. (+) Вложенный (Static Nested) класс имеет доступ к static членам своего внешнего класса, без его экземпляра. (-) Вложенный (Static Nested) класс может обращаться к членам внешнего класса, независимо от уровня доступа (static/instance). ","creator":{"public_name":"Anton L","id":242830,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":111162,"body":"Здравствуйте.\n\nВ этом тесте лишь два утверждения ошибочны.\n\nПоэкспериментируйте с доступом к полям внешнего класса.\n\n","topic_id":52082}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}},{"id":18236,"title":"(+) Вложенный (Nested) класс имеет доступ к static членам своего внешнего класса\n\n(-) Вложенный (Nested) класс не имеет доступ к закрытым не статическим членам своего внешнего класса\n\n(+) Вложенный (Nested) класс имеет доступ к закрытым static полям своего внешнего класса\n\n(+) Вложенный (Nested) класс можно наследовать\n\n(+) Вложенный (Nested) класс не имеет доступа к не статическим членам своего внешнего класса напрямую\n\n(-) Вложенный (Nested) класс нельзя наследовать\n\nПодскажите, пожалуйста, где у меня ошибка\n","plain_title":"(+) Вложенный (Nested) класс имеет доступ к static членам своего внешнего класса (-) Вложенный (Nested) класс не имеет доступ к закрытым не статическим членам своего внешнего класса (+) Вложенный (Nested) класс имеет доступ к закрытым static полям своего внешнего класса (+) Вложенный (Nested) класс можно наследовать (+) Вложенный (Nested) класс не имеет доступа к не статическим членам своего внешнего класса напрямую (-) Вложенный (Nested) класс нельзя наследовать Подскажите, пожалуйста, где у меня ошибка ","creator":{"public_name":"Михаил Иванющенков","id":141955,"is_tutor":false},"comments":[{"creator":{"public_name":"Михаил Иванющенков","id":141955,"is_tutor":false},"id":38555,"body":"Спасибо! Не внимательно прочитал один из вариантов)","topic_id":18236},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":38424,"body":"Здравствуйте.\n\nОшибка одна. Обратите внимание к чему имеет доступ вложенный класс.\n\nРекомендую еще раз изучить урок, в том числе и текст под видео.\n\nЕсли у Вас будут еще вопросы - задавайте, описывая то как Вы пришли к тому или иному выводу. :)","topic_id":18236}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 8. Урок 1. Nested (static) классы в Java.","entity_url":null,"active":true}}],"lesson":{"exercise":null,"units":[{"id":536,"name":"theory","url":"/courses/java_101/lessons/nested/theory_unit"},{"id":538,"name":"quiz","url":"/courses/java_101/lessons/nested/quiz_unit"}],"links":[],"ordered_units":[{"id":536,"name":"theory","url":"/courses/java_101/lessons/nested/theory_unit"},{"id":538,"name":"quiz","url":"/courses/java_101/lessons/nested/quiz_unit"}],"id":337,"slug":"nested","state":"approved","name":"Модуль 8. Урок 1. Nested (static) классы в Java.","course_order":30,"goal":"Получить теоретические знания о том, что такое вложенные (nested) классы в Java и закрепить полученные навыки на практике.","self_study":null,"theory_video_provider":"vimeo","theory_video_uid":"144600364","theory":"Вложенным классом называют класс, который является членом другого класса (находится в его теле). Существует четыре базовых типа вложенных классов в Java:\n- Static Nested classes(статические вложенные классы)\n- Nested Inner classes (вложенные внутренние классы)\n- Method Local Inner classes (внутренние классы в локальном методе)\n- Anonymous Inner classes (анонимные классы)\n\n\n\n## Для чего они нужны?\n\nВложенными классами описывают типы, которые будут использоваться только в одном классе или вообще будут использованы только один раз (анонимные классы). С помощью этих классов реализовывается необходимость разделить данные и методы их обработки в разные типы (сущности). Сохранив, при этом, инкапсуляцию.\n____\n\nВ данном уроке будут рассмотрены только Static Nested classes (статические вложенные классы).\n\nStatic Nested classes используются для описания типа, который не должен зависеть от конкретного экземпляра внешнего класса, в который он вложен. Например, билдер — собирает очередной экземпляр внешнего класса и никак с ним больше не взаимодействует.\n\n## Как его обозначить в коде?\n\nStatic Nested class объявляется как и любой класс, НО внутри тела класса с ключевым словом **static**. Имена вложенных классов не имеют особых правил.\n\nStatic Nested class не имеет привязки к объекту внешнего класса (не хранит в себе ссылку на конкретный экземпляр внешнего класса).\n\nВложенный класс (Static Nested) имеет доступ к статическим членам своего внешнего класса, в том числе и _к закрытым (private)_, даже без упоминания имени класса. \n\nК НЕстатическим членам внешнего класса Nested(static) класс не имеет прямого доступа. Но такой доступ возможен через объект (экземпляр) внешнего класса, в том числе к закрытым (private) членам внешнего класса.\n\nВот код-пример:\n\n```java\n/** Перед запуском этого кода — изучите логику кода.\n * И не стесняйтесь экспериментировать с кодом!\n */\n\npublic class External {\n private static int instanceCounter;\n private int a;\n int b;\n\n public External(int a, int b) {\n this.a = a;\n this.b = b;\n instanceCounter++;\n }\n\n // private // Смело экспериментируйте!\n static void messenger(String incomeMessage) {\n String someMessage = \"No message!\";\n if (incomeMessage != null && !incomeMessage.isEmpty()) {\n someMessage = incomeMessage;\n }\n System.out.printf(\"The static method 'messenger()' of the outer class. Message: \"\n + \"\\\"%s\\\"\\n\\n\",\n someMessage);\n }\n\n // Все, что нам нужно от объектов External.\n String sum() {\n int result = a + b;\n return String.format(\"The non-static method 'sum()' of the outer class. %d + %d = %d\",\n a,\n b,\n result);\n }\n\n static class NestedFoo {\n\n static String getInstanceCounter() {\n // Свободный доступ к статическому полю внешнего класса:\n return instanceCounter\n + \" (the information is provided by a static method 'getInstanceCounter()' \"\n + \"from an inner class.)\";\n }\n\n void methodFoExperiments() {\n System.out.println(\"'methodFoExperiments()' method in inner class.\");\n\n // a = 5; // Ошибка! Ответьте себе почему?!\n // b = 5; // Ошибка! Т.к. \"а\" не статическое поле.\n\n // Свободный доступ к статическому методу внешнего класса,\n // даже без упоминания имени внешнего класса или его объектов:\n messenger(\"ПРЯМОЙ вызов 'messenger()' из 'methodFoExperiments()'\");\n // Или с упоминанием его имени:\n External.messenger(\"ЧЕРЕЗ ИМЯ КЛАССА вызов 'messenger()' из \"\n + \"'methodFoExperiments()'\");\n\n // Создадим объект внешнего класса с псевдослучайными значениями полей:\n External instanceInInner = new External(10, 10);\n // теперь пощупаем эти поля через имя объекта:\n instanceInInner.a = 5; // Доступ к private полю через объект.\n instanceInInner.b = 5; // Доступ к default (package visible) полю через объект.\n\n System.out.println(instanceInInner.sum());\n\n messenger(\"After second instantiation in inner class. Counter = \"\n + External.NestedFoo.getInstanceCounter());\n }\n }\n}\n\n// Где-то в этом же пакете класс:\nclass SomeMainClass {\n public static void main(String[] args) {\n // Потрогаем статический метод внешнего класса и статический метод статического внутреннего\n // класса:\n External.messenger(\"Before instantiation. instanceCounter = \"\n + External.NestedFoo.getInstanceCounter());\n\n // Создадим экземпляр внешнего класса с псевдослучайными значениями полей:\n External instance = new External(2, 2);\n // Вызовем у объекта НЕстатический метод с уровнем доступа default:\n System.out.println(\"After first instance creation: \" + instance.sum());\n\n // Снова выведем на экран число инстансов внешнего класса:\n External.messenger(\"After first instantiation. instanceCounter = \"\n + External.NestedFoo.getInstanceCounter());\n\n // External.NestedFoo.methodFoExperiments(); // Ошибка! Ответьте себе почему?!\n\n External.NestedFoo nestedInstance = new External.NestedFoo();\n // Вот теперь можно получить доступ к нестатическому члену статического класса:\n nestedInstance.methodFoExperiments();\n }\n}\n```\n\nВ свою очередь Nested(static) класс — не совсем прозрачен для внешнего класса. Внешний класс не видит члены Nested(static) класса, без упоминания его имени или объекта. В коде внешнего класса нельзя прямо обратиться к члену вложенного класса. \n\nСоответственно, для обращения к статическим членам вложенного статического класса нужно использовать его имя, а для обращения к НЕстатическим членам вложенного статического класса — нужно использовать имя его экземпляра. При этом, модификаторы доступа не влияют на видимость членов Nested(static) класса, для внешнего класса (private, default (package visible), protected, public).\n\nКод-пример:\n\n```java\npublic class External {\n\t\n\tpublic static void main(String[] args) {\n\t\tNestedFoo first = new NestedFoo(); // Две равнозначные строки.\n\t\tExternal.NestedFoo second = new External.NestedFoo(); // Только имена ссылок разные.\n\t\t\n\t\tfirst.name = \"first\";\n\t\tfirst.number = 42;\n\t\t\n\t\tsecond.name = \"second\";\n\t\tsecond.number = Double.POSITIVE_INFINITY;\n\t\t\n\t\tfirst.internalNonStatic();\n\t\tsecond.internalNonStatic();\n\t\t\n\t\tNestedFoo.testInstance = null;\n\t\tNestedFoo.internalStatic();\n\t}\n\t\n\tstatic class NestedFoo {\n\t\tprivate\tString name;\n\t\tdouble number;\n\t\tstatic External testInstance = new External();\n\t\t\n\t\tprivate void internalNonStatic() {\n\t\t\tSystem.out.printf(\"Internal non-static method. Instance name: %s, instance number: %f\\n\", name, number);\n\t\t}\n\t\t\n\t\tprivate static void internalStatic() {\n\t\t\tSystem.out.println(\"Internal static method.\\n\");\n\t\t}\n\t}\n}\n```\n\nДоступ к вложенному классу и его членам, из других классов, ограничивается модификаторами доступа и уровня.\n\n\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":4,"name":"theory","url":"/courses/java_101/lessons/intro_to_java/theory_unit"}],"links":[],"ordered_units":[{"id":4,"name":"theory","url":"/courses/java_101/lessons/intro_to_java/theory_unit"}],"id":3,"slug":"intro_to_java","state":"approved","name":"Модуль 1. Урок 1. Введение в Java.","course_order":1,"goal":"Рассмотреть темы уроков сета Java 101: изучение Java с нуля, переход на Java SE8 и практическая разработка своего ПО.","self_study":null,"theory_video_provider":"youtube","theory_video_uid":"T13TlpHyxPU","theory":"## Цели курса\n\n* научиться основам программирования на Java\n* получить достаточно знаний, чтобы пройти сертификации первого уровня + основы функционального программирования из Java 8\n* получить практические навыки использования языка - написать реальный проект в процессе обучения\n\n## Условия для старта\n\n* добросовестно подходить к изучению\n* минимальное знание английского\n* необязательный опыт программирования\n* огромное желание учиться\n* внимательность!\n\nВ случае ядерной войны доступны контакты преподавателя курса (_в приоритете подписчики_):\n\n* skype: b0noii\n* e-mail: viacheslav@b0noi.com\n* twitter: [@b0noi](https://twitter.com/b0noi)\n\n## Структура курса\n\n* 10 больших модулей программы от oracle\n* на каждый модуль по 4+ урока\n* после курса будет большой тест.\n* почти каждый урок будет состоять из:\n\t- видео и текстового материала,\n\t- теста на основе теории и дополнительных материалов,\n\n## Дополнительные материалы\n\n- С первых дней обучения, уделяйте внимание [java code-style](https://www.lar.ru/java-codestyle/).\n- С тех же первых дней, у вас будет много вопросов и ошибок. Не стесняйтесь задавать вопросы! Но задавайте вопросы как можно точнее, чтобы получить точный ответ. Вот хорошая статья о том [как задавать вопросы](https://ru.hexlet.io/blog/posts/question-rules). Этот подход пригодится вам не только в обучении но и в работе!\n"},"id":31,"slug":"java_101","challenges_count":0,"name":"Введение в Java","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"free","description":"Практический курс по Java «с нуля» от инженера с опытом работы в крупнейших ИТ-компаниях мира.\n\nКурс посвящен изучению основ Java, популярного объектно-ориентированного языка программирования, разработанного компанией Oracle. Программы на Java транслируются в байт-код, который выполняет виртуальная машина Java (JVM). JVM — это программа, обрабатывающая байтовый код и передающая инструкции оборудованию как интерпретатор. Это позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина, независимо от операционной системы и оборудования.\n\nКурс рассчитан как на людей, не сталкивавшихся с программированием, так и на начинающих программистов.\nРекомендуемое продолжение — курс [Java Generics](https://ru.hexlet.io/courses/java_generics).","kind":"sandbox","updated_at":"2026-01-20T11:54:32.501Z","language":"java","duration_cache":45120,"skills":["Создавать несложные программы, используя основные конструкции языка (условия, циклы, методы и другие)","Разделять код на методы для повторного использования","Правильно анализировать ошибки в коде и пользоваться отладочной печатью при их поиске"],"keywords":["основы Java","JVM","логика","типы данных","алгоритмы"],"lessons_count":38,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6ODk5NCwicHVyIjoiYmxvYl9pZCJ9fQ==--50ee157ee29e5c50f50aa2191806e9d83fca25e6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--6067466c2912ca31a17eddee04b8cf2a38c6ad17/image.png"},"recommendedLandings":[],"lessonMemberUnit":null,"accessToLearnUnitExists":true,"accessToCourseExists":true},"url":"/courses/java_101/lessons/nested/theory_unit","version":"0b0c6d4ebbd40fd58630a0dd89cc25544ccdf24e","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Введение в Java</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Модуль 8. Урок 1. Nested (static) классы в Java.</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Модуль 8. Урок 1. Nested (static) классы в Java.","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"Введение в Java"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div style="margin-bottom:var(--mantine-spacing-xl)" class=""><div class="ratio ratio-16x9"><iframe width="100%" height="auto" src="//player.vimeo.com/video/144600364" loading="lazy" allowFullScreen="" title="video"></iframe></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><p>Вложенным классом называют класс, который является членом другого класса (находится в его теле). Существует четыре базовых типа вложенных классов в Java:</p>
<ul>
<li>Static Nested classes(статические вложенные классы)</li>
<li>Nested Inner classes (вложенные внутренние классы)</li>
<li>Method Local Inner classes (внутренние классы в локальном методе)</li>
<li>Anonymous Inner classes (анонимные классы)</li>
</ul>
<p><img style="--image-object-fit:contain;width:auto" class="m_9e117634 mantine-Image-root" src="https://www.tutorialspoint.com/java/images/inner_classes.jpg" alt="Классификация Nested классов" loading="lazy"/></p>
<h2 id="heading-2-1">Для чего они нужны?</h2>
<p>Вложенными классами описывают типы, которые будут использоваться только в одном классе или вообще будут использованы только один раз (анонимные классы). С помощью этих классов реализовывается необходимость разделить данные и методы их обработки в разные типы (сущности). Сохранив, при этом, инкапсуляцию.</p>
<hr/>
<p>В данном уроке будут рассмотрены только Static Nested classes (статические вложенные классы).</p>
<p>Static Nested classes используются для описания типа, который не должен зависеть от конкретного экземпляра внешнего класса, в который он вложен. Например, билдер — собирает очередной экземпляр внешнего класса и никак с ним больше не взаимодействует.</p>
<h2 id="heading-2-2">Как его обозначить в коде?</h2>
<p>Static Nested class объявляется как и любой класс, НО внутри тела класса с ключевым словом <strong>static</strong>. Имена вложенных классов не имеют особых правил.</p>
<p>Static Nested class не имеет привязки к объекту внешнего класса (не хранит в себе ссылку на конкретный экземпляр внешнего класса).</p>
<p>Вложенный класс (Static Nested) имеет доступ к статическим членам своего внешнего класса, в том числе и <em>к закрытым (private)</em>, даже без упоминания имени класса.</p>
<p>К НЕстатическим членам внешнего класса Nested(static) класс не имеет прямого доступа. Но такой доступ возможен через объект (экземпляр) внешнего класса, в том числе к закрытым (private) членам внешнего класса.</p>
<p>Вот код-пример:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">/** Перед запуском этого кода — изучите логику кода.
* И не стесняйтесь экспериментировать с кодом!
*/
public class External {
private static int instanceCounter;
private int a;
int b;
public External(int a, int b) {
this.a = a;
this.b = b;
instanceCounter++;
}
// private // Смело экспериментируйте!
static void messenger(String incomeMessage) {
String someMessage = "No message!";
if (incomeMessage != null && !incomeMessage.isEmpty()) {
someMessage = incomeMessage;
}
System.out.printf("The static method 'messenger()' of the outer class. Message: "
+ "\"%s\"\n\n",
someMessage);
}
// Все, что нам нужно от объектов External.
String sum() {
int result = a + b;
return String.format("The non-static method 'sum()' of the outer class. %d + %d = %d",
a,
b,
result);
}
static class NestedFoo {
static String getInstanceCounter() {
// Свободный доступ к статическому полю внешнего класса:
return instanceCounter
+ " (the information is provided by a static method 'getInstanceCounter()' "
+ "from an inner class.)";
}
void methodFoExperiments() {
System.out.println("'methodFoExperiments()' method in inner class.");
// a = 5; // Ошибка! Ответьте себе почему?!
// b = 5; // Ошибка! Т.к. "а" не статическое поле.
// Свободный доступ к статическому методу внешнего класса,
// даже без упоминания имени внешнего класса или его объектов:
messenger("ПРЯМОЙ вызов 'messenger()' из 'methodFoExperiments()'");
// Или с упоминанием его имени:
External.messenger("ЧЕРЕЗ ИМЯ КЛАССА вызов 'messenger()' из "
+ "'methodFoExperiments()'");
// Создадим объект внешнего класса с псевдослучайными значениями полей:
External instanceInInner = new External(10, 10);
// теперь пощупаем эти поля через имя объекта:
instanceInInner.a = 5; // Доступ к private полю через объект.
instanceInInner.b = 5; // Доступ к default (package visible) полю через объект.
System.out.println(instanceInInner.sum());
messenger("After second instantiation in inner class. Counter = "
+ External.NestedFoo.getInstanceCounter());
}
}
}
// Где-то в этом же пакете класс:
class SomeMainClass {
public static void main(String[] args) {
// Потрогаем статический метод внешнего класса и статический метод статического внутреннего
// класса:
External.messenger("Before instantiation. instanceCounter = "
+ External.NestedFoo.getInstanceCounter());
// Создадим экземпляр внешнего класса с псевдослучайными значениями полей:
External instance = new External(2, 2);
// Вызовем у объекта НЕстатический метод с уровнем доступа default:
System.out.println("After first instance creation: " + instance.sum());
// Снова выведем на экран число инстансов внешнего класса:
External.messenger("After first instantiation. instanceCounter = "
+ External.NestedFoo.getInstanceCounter());
// External.NestedFoo.methodFoExperiments(); // Ошибка! Ответьте себе почему?!
External.NestedFoo nestedInstance = new External.NestedFoo();
// Вот теперь можно получить доступ к нестатическому члену статического класса:
nestedInstance.methodFoExperiments();
}
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>В свою очередь Nested(static) класс — не совсем прозрачен для внешнего класса. Внешний класс не видит члены Nested(static) класса, без упоминания его имени или объекта. В коде внешнего класса нельзя прямо обратиться к члену вложенного класса.</p>
<p>Соответственно, для обращения к статическим членам вложенного статического класса нужно использовать его имя, а для обращения к НЕстатическим членам вложенного статического класса — нужно использовать имя его экземпляра. При этом, модификаторы доступа не влияют на видимость членов Nested(static) класса, для внешнего класса (private, default (package visible), protected, public).</p>
<p>Код-пример:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">public class External {
public static void main(String[] args) {
NestedFoo first = new NestedFoo(); // Две равнозначные строки.
External.NestedFoo second = new External.NestedFoo(); // Только имена ссылок разные.
first.name = "first";
first.number = 42;
second.name = "second";
second.number = Double.POSITIVE_INFINITY;
first.internalNonStatic();
second.internalNonStatic();
NestedFoo.testInstance = null;
NestedFoo.internalStatic();
}
static class NestedFoo {
private String name;
double number;
static External testInstance = new External();
private void internalNonStatic() {
System.out.printf("Internal non-static method. Instance name: %s, instance number: %f\n", name, number);
}
private static void internalStatic() {
System.out.println("Internal static method.\n");
}
}
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Доступ к вложенному классу и его членам, из других классов, ограничивается модификаторами доступа и уровня.</p></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/java_101/lessons/nested/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 38</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/java_101/lessons/nested/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-CdBlNCiQ.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>