JavaRush /Курсы /Java Multithreading /Внутренние статические классы

Внутренние статические классы

Java Multithreading
3 уровень , 5 лекция
Открыта
Внутренние статические классы - 1

— Итак, тема номер два – вложенные классы.

Перед объявлением внутреннего класса мы можем поставить ключевое слово – static и тогда внутренний класс станет вложенным.

Давай разберемся, что же значит слово static рядом с объявлением вложенного класса. Как ты думаешь?

— Если переменная объявлена статической, то она существует в единственном экземпляре, а если вложенный класс – статический, то можно создать всего один объект такого класса?

— Пусть слово static тут не вводит тебя в заблуждение. Если переменная объявлена статической – то она существуют в единственно экземпляре – это верно. Но статический вложенный класс больше похож на статический метод в этом плане. Слово static перед объявлением класса указывает, что этот класс не хранит в себе ссылок на объекты внешнего класса, внутри которого объявлен.

— Ага. Обычные методы втихаря хранят ссылку на объект, а статические – нет. То же и со статическими классами, я прав, Элли?

— Абсолютно. Твоя догадливость очень похвальна. Вложенные статические классы не имеют скрытых ссылок на объекты внешнего класса, в котором они объявлены.

class Zoo {
    private static int count = 7;
    private int mouseCount = 1;

    public static int getAnimalCount() {
        return count;
    }

    public int getMouseCount() {
        return mouseCount;
    }

    public static class Mouse {
        public Mouse() {}
        public int getTotalCount() {
            return count + mouseCount; // Compilation error. } }
        }

Давай посмотрим внимательно на этот пример.

К каким переменным может обращаться статический метод getAnimalCount?

— Только к статическим. Это же статический метод.

К каким переменным может обращаться метод getMouseCount?

— И к статическим, и к нестатическим. Он скрытно хранит ссылку(this) на объект типа Zoo.

— Верно. Так вот, статический вложенный класс Mouse, как и статический метод, может обращаться к статическим переменным класса Zoo, но не может обращаться к нестатическим.

Мы можем спокойно создавать объекты класса Mouse, даже когда нет ни одного созданного объекта класса Zoo. Вот как можно это сделать:

class Home
{
 public static void main(String[] args)
 {
  Zoo.Mouse mouse = new Zoo.Mouse();
 }
}

Фактически класс Mouse – это самый обычный класс. Из-за того, что он объявлен внутри класса Zoo, у него есть две особенности.

1) При создании объектов вложенного класса (как класс Mouse) вне внешнего класса-родителя, надо еще указывать через точку и имя внешнего класса.

Например так: Zoo.Mouse.

2) Класс Zoo.Mouse и его объекты имеют доступ к private static переменным и методам класса Zoo ( класс Mouse ведь тоже объявлен внутри класса Zoo).

На этом на сегодня все.

— Т.е. просто дополнительное имя и все?

Да.

— Это еще проще, чем казалось на первый взгляд.

Комментарии (88)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Private Joker Уровень 36
2 июля 2024
Понимание стало лучше, чем было в Синтаксе, а вот задачи стали еще сложнее и непонятные.
Dr.Alexcemen9 Уровень 51
2 сентября 2024
так над было просто решать задачи, а не скипать их🤡
Long_byte Уровень 57
15 мая 2024
статический внутренний класс не содержит в себе ссылку this на объект внешнего класса связи с этим не имеет доступа к не статическим методам и полям но имеет доступ к статическим методам и полям включая с модификатором доступа прайвейт и может существовать объект данного класса вне внешнего класса без существования объекта внешнего класса а не статический внутренний класс хранит в себе ссылку на объект внешнего класса имеет доступ как к нестатическим и статическим полям и методам так как объект внутреннего класса вложен в объект внешнего класса вне внешнего класса не может существовать без создания объекта внешнего класса ?
Anemon Уровень 13 Expert
26 ноября 2024
Кроме этого ещё читал статейки на эту тему. Вроде бы ты во всём прав.
Дед мороз! Уровень 39
4 августа 2023
Nice
PHANTOM Уровень 42 Expert
27 июля 2023
Внутренний класс (inner class) - это не статический класс, которой создан внутри класса Вложенный класс(nested) - это класс помеченный модификатором static, который создан внутри класса.
Fl1s Уровень 51
29 июля 2023
Захлебнулся и потерял смысл слова "класс"💀
Lo Уровень 35 Expert
25 ноября 2023
Добавьте этот коммент в лекцию! Коротко и ясно кто есть кто. А то я читала-читала, дошла до конца и так ничего не поняла, исходя из последних двух лекций почему то сложилось впечатление,что вложенный и внутренний - это одно и то же, просто говорят разными словами.
Dimir11 Уровень 38
27 ноября 2023
nested - это вложенный в общем смысле, любой класс, объявленный внутри другого класса, - это nested class. Имеет подвиды inner (вложенный), static nested (статический), lockal inner (локальный) и подвид локального - anonymous inner (анонимный).
Anemon Уровень 13 Expert
26 ноября 2024
Соответственно, все их можно назвать inner и nested, если добавить пару объясняющих слов. Как сказал Димир. Но объяснение Фантома всё равно правильнее, чем в лекции (а может это и есть официальное объяснение, но я тоже видел разнообразные объяснения, где именно доп. слова придавали конечный смысл).
Anonymous #3179712 Уровень 2
24 ноября 2022
И я внесу свои 5 копеек. Коротко понятно -> https://youtu.be/BwkmIXjWWJc
Gans Electro Уровень 4
24 мая 2023
Grock Уровень 44
28 июля 2023
Спасибо! Полезно и лаконично)
9 февраля 2026
А на понятном языке нет подобного видео?
Gans Electro Уровень 4
9 февраля 2026
Скачайте Яндекс браузер и там можно за минуту перевести и посмотреть на русском. Да и что мешает просто погуглить? Вот за 10 секунд нашел Тык Или вот внизу в комментах тык
Майкл Мэдсен Уровень 51
28 июня 2022
кто до сих пор как я плохо понимал слово static есть великолепное видео) https://www.youtube.com/watch?v=GZzVfeY7yEM
comrade_b Уровень 39
19 июня 2022
Мне кажется, то, что статические переменные существуют в одном экземпляре - это не причина, а больше следствие. Ведь суть всего статического это: - все статические переменные, методы, классы - всегда публичны - к ним всегда есть доступ за пределами класса без ссылки на класс, в котором объявлены статические перменные/методы/классы
Lexman (Алексей) Уровень 40
2 августа 2022
не совсем верно. Попробуйте зайти в реализацию HashMap и тому-подобные коллекции. Тогда вы увидите сколько там статических переменных которые вам не доступны и предназначены для внутренней реализации
Виктор Уровень 1
8 августа 2022
Вовсе нет., не всегда они публичны. Модификатор доступа и статичность вообще не связаны и выполняют совершенно разные функции. Модификатор доступа - права доступа к пременной. Статичность - связь с экземпляром класса или с самим классом. package com;

public class Main {
    private static int countPrivate = 0;
    public static int countPublic = 0;

    public static int getCountPrivate() {        return countPrivate;     }

    public static int getCountPublic() {        return countPublic;    }

    public static void main(String[] args) {
	// write your code here
        countPrivate++;
        countPublic++;
    }

    public class Slave {
        void printCount(){
            System.out.println(countPrivate);
            System.out.println(countPublic);
        }
    }
}

package com;

public class OtherClass {
    void printCount() {
        System.out.println(Main.getCountPrivate()); // Обращение только по геттеру
        System.out.println(Main.getCountPublic()); // Обращение по геттеру
        System.out.println(Main.countPublic);       // Обращение напрямую
    }
}

Как видим, в пределах класса поведение у private и public одинаковое, а вот за пределами класса - разное. Мы не можем обратиться к приватной переменной за пределами класса.
hidden #2595317 Уровень 45
21 сентября 2021
Вложенные классы Java Multithreading Уровень 3, Лекция 3 Если один класс объявить внутри другого, то такой класс называется ВНУТРЕННИМ. Внутренние статические классы Java Multithreading Уровень 3, Лекция 5 — Итак, тема номер два – ВЛОЖЕННЫЕ классы. Что-то произходит не то, как мне кажется.
15 февраля 2022
15.02.2022 - ничего не изменилось
hidden #2595317 Уровень 45
15 февраля 2022
Да и не изменится. Это же самый лучший сайт, тут менять нельзя ничего.))))
апецт Уровень 44
22 июня 2022

Перед объявлением внутреннего класса мы можем поставить ключевое слово – static и тогда внутренний класс станет вложенным.
14 сентября 2021
Вложенные классы делятся на две категории: статические и нестатические. Вложенные классы, объявленные статическими, называются статическими вложенными классами (static nested class) - не имеют доступа к нестатическим полям внешнего класса и не хранят ссылки на внешний класс. Нестатические вложенные классы (non-static nested class) называются внутренними классами (inner class), то есть non-static nested class == inner class. Я всё верно поняла?
Andrey Уровень 37
30 сентября 2021
Да, верно
Макс Дудин Уровень 41
1 июня 2021
ещё один кирпичик в понимание static