Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

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

#java #дизайн_языка


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


Ответы

Ответ 1



Статическим классом в 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

Ответ 2



В основном для того, чтобы можно было создавать вложенные классы, объекты которых можно создавать, не создавая инстанса класса в котором он лежит.

Ответ 3



"Статическим классом в java может быть только вложенный класс" - есть вложенные(static) и внутрение, разница как и в обычном плане, static имеет доступ только к статичным полям

Комментариев нет:

Отправить комментарий