Зачем нужен static class?

1,00
р.
Статические переменные нужны для доступа к ним, без создания экземпляра класса. А вот зачем нужен static класс?

Ответ
Статическим классом в java может быть только вложенный класс. Если класс отмечен как static, то он ведет себя, как обычный класс.
например, есть класс А, вложенный статический класс B и вложенный (нестатический) класс С:
public class A{
... static public class B{ }
public class C{ } }
и мы хотим создать экземпляры этих классов во "внешнем" коде
public class Test{ public static void main(String[] args) { A a = new A() // обычный класс A.B b = new A.B() // статический вложенный класс
A.C c = a.new C() // вложенный класс, связан с экземпляром А // A.C c = new A.C() // синтаксическая ошибка (не скомпилится) } }
или внутри статических методов класса А
public class A{
... static public class B{ }
public class C{ }
public static void main(String[] args) { A a = new A() // обычный класс A.B b = new A.B() // статический вложенный класс
A.C c = a.new C() // вложенный класс, связан с экземпляром А // A.C c = new A.C() // синтаксическая ошибка (не скомпилится) }
public static void test() { A a = new A() // обычный класс A.B b = new A.B() // статический вложенный класс
A.C c = a.new C() // вложенный класс, связан с экземпляром А // A.C c = new A.C() // синтаксическая ошибка (не скомпилится) } }
На мой взгляд использование статического класса может быть уместно, как небольшой класс, который по смыслу тесно связан с "основным" внешним классом.
Например:
public class Tree{ static public class Node{ } }
В этой ситуации так же можно вынести вложенный класс в обычный и переместить оба класса в отдельный package.
Единственным отличием вложенного статического класса от обычного, которое мне видится, - это более снисходительное отношение к видимости методов и полей между вложенным классом и его внешним классом.
Например:
public class A {
private void privateMethod(){ B b = new B() b.privateMethod() // есть доступ к приватным методам/полям }
static public class B { private void privateMethod(){ A a = new A() a.privateMethod() // есть доступ к приватным методам/полям } } }
Ссылка на документацию: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html