Java Object Oriented Design — Java static Inner Classes
![]()
A member class defined within the body of another class may be declared static.
Example
The following code declares a top-level class A and a static member class B:
A static member class is not an inner class. It is considered a top-level class.
A static member class is also called a nested top-level class.
An instance of class A and an instance of class B can exist independently because both are top-level classes.
A static member class can be declared public, protected, package-level, or private to restrict its accessibility outside its enclosing class.
There are two advantages of using a static member class:
- A static member class can access the static members of its enclosing class including the private static members.
- A package acts like a container for top-level classes by providing a namespace. Top-level classes having static member classes provide an additional layer of namespaces.
A static member class is the direct member of its enclosing top-level class, not a member of the package.
An object of a static member class is created the same way as you create an object of a top-level class using the new operator. To create an object of class B, you write
Since the simple name of class B is in the scope inside class A, we can use its simple name to create its object inside class A as
We can also use the simple name B outside class A by importing the com.java2s.innerclasses.A.B class.
Example 2
The following code shows how to use static inner class.
The code above generates the following result.
A static Member Class Is Not an Inner Class
A member class defined within the body of another class may be declared static.
Example
The following code declares a top-level class A and a static member class B:
A static member class is not an inner class. It is considered a top-level class.
A static member class is also called a nested top-level class.
An instance of class A and an instance of class B can exist independently because both are top-level classes.
A static member class can be declared public, protected, package-level, or private to restrict its accessibility outside its enclosing class.
There are two advantages of using a static member class:
- A static member class can access the static members of its enclosing class including the private static members.
- A package acts like a container for top-level classes by providing a namespace. Top-level classes having static member classes provide an additional layer of namespaces.
A static member class is the direct member of its enclosing top-level class, not a member of the package.
An object of a static member class is created the same way as you create an object of a top-level class using the new operator. To create an object of class B, you write
Since the simple name of class B is in the scope inside class A, we can use its simple name to create its object inside class A as
Зачем нужен static class?
Статические переменные нужны для доступа к ним, без создания экземпляра класса. А вот зачем нужен static класс?
![]()
Статическим классом в java может быть только вложенный класс. Если класс отмечен как static, то он ведет себя, как обычный класс.
например, есть класс А, вложенный статический класс B и вложенный (нестатический) класс С:
и мы хотим создать экземпляры этих классов во «внешнем» коде
или внутри статических методов класса А
На мой взгляд использование статического класса может быть уместно, как небольшой класс, который по смыслу тесно связан с «основным» внешним классом.
В этой ситуации так же можно вынести вложенный класс в обычный и переместить оба класса в отдельный package.
Единственным отличием вложенного статического класса от обычного, которое мне видится, — это более снисходительное отношение к видимости методов и полей между вложенным классом и его внешним классом.
Java что такое статический класс
Java allows a class to be defined within another class. These are called Nested Classes. Classes can be static which most developers are aware of, henceforth some classes can be made static in Java. Java supports Static Instance Variables, Static Methods, Static Block, and Static Classes. The class in which the nested class is defined is known as the Outer Class. Unlike top-level classes, Inner classes can be Static. Non-static nested classes are also known as Inner classes.
An instance of an inner class cannot be created without an instance of the outer class. Therefore, an inner class instance can access all of the members of its outer class, without using a reference to the outer class instance. For this reason, inner classes can help make programs simple and concise.
Remember: In static class, we can easily create objects.
Differences between Static and Non-static Nested Classes
The following are major differences between static nested classes and inner classes.
Статические классы

Недавно вы узнали, что бывают статические переменные и статические методы, но, оказывается, бывают еще и статические классы. Но начнем немного издалека.
В языке Java вполне можно объявлять классы внутри классов. И даже классы внутри классов, которые внутри классов внутри классов. Выглядит это все очень просто:
Просто объявляем один класс внутри другого — и все.
Внутренние классы бывают статические и нестатические. Статические классы еще называют вложенными ( static nested class ), нестатические просто называют внутренними классами ( inner class ).
2. Статические классы
Статические вложенные классы можно использовать вне своего родительского класса. Если у такого класса стоит модификатор доступа public, его можно использовать в любом месте программы. Такие классы фактически ничем не отличаются от любого обычного класса. Хотя есть пара отличий.
Имя класса
Если вы хотите обратиться к статическому вложенному классу не из его класса-родителя, а из другого места в программе, вам нужно будет указать имя класса: оно состоит из имени класса родителя и имени вложенного класса. Общий вид этого имени такой:
| Класс родитель | Вложенный класс | Полное имя вложенного класса |
|---|
Если вложенный класс имеет свой вложенный класс, их имена просто склеиваются через точку.
Типичный пример вложенного класса в JDK — это класс Entry внутри класса Map. Если вы хотите получить множество пар элементов из объекта HashMap , то метод entrySet() вернет вам множество пар типа Set< Map . Entry > .
Вот запись Map . Entry — это и есть внешний и внутренний классы.
Создание объекта
Создать объект вложенного статического класса очень легко. Выглядит это так:
Все, как и с обычными классами, только имя двойное.
Обращение к статическим методам
Если у статического класса есть статические методы, обращаться к ним можно точно так же, как к статическим методам обычных классов (только имя класса теперь двойное).
Обращение к статическим переменным
Обращаться к публичным статическим переменным вложенного класса тоже легко:
3. Особенности статических классов
Статические внутренние классы меньше всего стоило бы называть статическими. Они ведут себя точно так же, как обычные классы. Никаких ограничений на обращение к ним из нестатических методов нет.
Если вы работаете с внутренним статическим классом внутри его класса-родителя, вообще не заметите никакой разницы с тем, если бы этот внутренний класс был бы самым обычным классом (не вложенным и не статическим).
| Внутренний статический класс Point | Обычный класс Point |
|---|
Если вы возьмете какой-то вложенный статический класс и вынесете его из его класса родителя, все, что изменится, так это то, что новый класс потеряет способность обращаться к private static переменным и методам бывшего класса-родителя.
| Внутренний статический класс Point | Обычный класс Point |
|---|
Метод main в обычном классе Point не может обращаться к private static переменной points класса Solution !
Это, собственно, и есть главное отличие вложенного статического класса от обычного класса. Методы вложенного статического класса имеют доступ ко всем статическим переменным и методам своего класса родителя, даже если те объявлены private .
Ну а если разобраться, что тут удивительного? Модификатор private прямо говорит, что к переменным и методам, обозначенным этим модификатором, можно обращаться только изнутри их класса. Внутренний статический класс находится внутри класса-родителя? Да, тогда никаких проблем: обращайтесь сколько хотите.