static (Справочник по C#)
На этой странице приводятся сведения о ключевом слове модификатора static . Ключевое слово static также является частью директивы using static .
Модификатор static используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту. Модификатор static можно использовать для объявления классов static . В классах, интерфейсах и структурах вы можете добавить модификатор static к полям, методам, свойствам, операторам, событиям и конструкторам. Модификатор static запрещено использовать с индексаторами или методами завершения. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Начиная с C# 8.0 можно добавить модификатор static в static . Статическая локальная функция не может сохранять локальные переменные или состояние экземпляра.
Начиная с C# 9.0 можно добавить модификатор static в static или анонимный метод. Статическое лямбда-выражение или анонимный метод не могут сохранять локальные переменные или состояние экземпляра.
Пример: статический класс
Следующий класс объявляется как static и содержит только методы static :
Объявление константы или типа неявно является членом static . На член static невозможно ссылаться через экземпляр, а можно только через имя типа. Например, рассмотрим следующий класс.
Чтобы обратиться к члену static x , воспользуйтесь полным именем — MyBaseC.MyStruct.x (если только член не доступен из той же области действия).
Так как экземпляр класса содержит отдельную копию всех полей экземпляра класса, каждому полю static соответствует только одна копия.
Невозможно использовать this для ссылки на методы static или методы доступа к свойствам.
Если к классу применяется ключевое слово static , все члены этого класса должны быть static .
Классы, интерфейсы и классы static могут иметь конструкторы static . Конструктор static вызывается на определенном этапе между запуском программы и созданием экземпляра класса.
Ключевое слово static имеет более ограниченное применение по сравнению с C++. Сведения о сравнении с ключевым словом С++ см. в статье Классы хранения (C++).
В качестве демонстрации членов static рассмотрим класс, представляющий сотрудника компании. Предположим, что этот класс содержит метод для подсчета сотрудников и поле для хранения их числа. И метод, и поле не принадлежат никакому экземпляру сотрудника. Они принадлежат всему классу сотрудников. В связи с этим они должны объявляться как члены static класса.
Пример: статическое поле и метод
В этом примере выполняется чтение имени и идентификатора нового сотрудника, увеличение счетчика сотрудников на единицу, а также отображение сведений о новом сотруднике и новом числе сотрудников. Эта программа считывает текущее число сотрудников с клавиатуры.
Пример: статическая инициализация
В этом примере показано, как можно инициализировать поле static , используя другое поле static , которое еще не объявлено. Результаты будут неопределенными до тех пор, пока вы явно не присвоите значение полю static .
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Статика в C#
Волею судьбы в последние годы у меня появилось ещё одно очень увлекательное хобби – учить. Я занимаюсь обучением людей, которые хотят стать программистами C#. Люди приходят разные: технари, гуманитарии, кто-то по своей воле, кого-то направляют от организаций. Не смотря на различные уровни, мне нужно их обучать. Поэтому я стараюсь постоянно обновлять и улучшать свои обучающие материалы. В связи с чем, пришёл к выводу: «А не плохо было бы оформить материалы в текстовом виде, чтобы ими было удобно пользоваться». Под катом я выложил как пример одну из недавно оформленных лекций.
Общая концепция
- полям
- свойствам
- методам
- операторам
- событиям
- конструктору
- классам
Статика подразумевает, что вам не нужно создавать экземпляр класса. Все приведённые выше составляющие класса, доступны посредством указания его имени.
Следует отметить, что необязательно делать весь класс статическим. Иногда достаточно применить статику для отдельных его членов.
- Нельзя создавать экземпляр класса, используя ключевое слово new.
- Не разрешается использовать не статические члены этого же класса.
- Он не поддерживает наследование.
- Невозможно перегрузить методы.
- Не разрешается использовать не статические члены этого же класса из статических. Конечно же, вам никто не мешает создать экземпляр класса в статическом методе.
- Наследование и полиморфизм для статических членов не поддерживаются.
Больше деталей
Выше мы не рассматривали такую конструкцию, как статический конструктор. Один из достаточно интересных вопросов, на мой взгляд, когда происходит вызов статического конструктор у классов?
Я думаю вы уже обратили внимание, что для статического конструктора не используется спецификатор доступа. Всё очень очевидно, создание статики вы не контролируете. Если попробовать выполнить приведённый ниже код, то можно убедиться в верности следующего утверждения: статический конструктор вызывается перед доступом к любому члену класса.
Можно поиграться, закомментировав любую из строк в которых происходит обращение к классу Box. Теперь немного изменим код, и подправим наше утверждение
В данном случае вызов статического конструктора не происходит. Итак: статический конструктор вызывается перед доступом к любому члену класса, за исключением констант. Я не зря использовал слово класс в данном определении. Со структурами очень много “приколов”. Вы должно быть знаете, что в C# нельзя переопределить конструктор по-умолчанию, но можно определить статический конструктор без параметров. Однако он будет вызываться не всегда, так например не произойдёт его вызов, если вы, например, попытаетесь создать массив структур.
Общие рассуждения об использовании статики
Существует относительно много мнений, когда использовать статические классы и когда не стоит так поступать. Исходя из своего опыта, отмечу, статические классы — любимое оружие начинающих разработчиков. Попользовал и забыл — хорошая концепция.
Чтобы разобраться в хитросплетениях о применяемости статики, следует вернуться к понятиям ООП. Представьте что у вас есть велосипед, но велосипед есть так же и у вашего соседа, и у соседа соседа, и т.д. В данном случае статика неприемлема. Т.к. велосипеды могут быть разного цвета, веса, обладать разным количеством колёс. То-бишь различные экземпляры одного и того же вида. Статика же применима для каких-то глобальных объектов\действий, когда не подразумевается создание экземпляров класса(часто для каких-то служебных методов: вывод на консоль — Console.WriteLine(), сортировка массива Array.Sort). Зачастую классы могут предоставлять как статическую, так и не статическую функциональность. Когда же у вас возникают сомнения, остановитесь и подумайте, понадобится ли вам экземпляр “этого”. Если же вы так хотите контролировать создание экземпляров класса или же вообще иметь только один, то для этих целей замечательно пригодится паттерн Singleton. В рамках ООП статика обладает рядом недостатков. Чем же она так плоха?
Полиморфизм
Как упоминалось выше, статические классы не поддерживают наследование, т.е. вы не можете наследоваться от интерфейса или другого класса и таким образом расширить функциональность.
Тестирование
При использование статики тестирование достаточно затруднено. Нельзя оперативно подменять код, основываясь на интерфейсах. Если нужно менять, то серьёзно, переписывая значительные куски кода.
Ключевое слово static в Java
Static в Java используется как ключевое слово используется для управления памятью. Его можно применять с переменными, методами, блоками и внутренними классами. В объявлении static относится к классу, а не экземпляру класса.
Статической может быть :
- переменная ( переменная класса );
- метод ( метод класса );
- блок;
- внутренний класс.
Статические переменные Java
- Статическая переменная может использоваться для обозначения общего свойства всех объектов ( которое не является уникальным для каждого объекта ), например название компании, колледжа и т. д.
- Статическая переменная задействует память только один раз во время загрузки класса.
Статические переменные в Java — преимущества
Java static переменная не загружает память.
Пример, в котором не используется статическая переменная
Предположим, что в колледже 500 студентов. Класс Student будут задействовать память каждый раз при создании объекта. У всех студентов есть уникальное rollno и name . А college — это общее свойство для всех объектов. Если сделать его статическим, то поле будет задействовать память только один раз.
Статическое свойство Java является общим для всех объектов.
Пример статической переменной

Программа подсчета без статической переменной
В этом примере мы создаем Java static переменную count , которая увеличивается в конструкторе. Поскольку переменная экземпляра задействует память только во время создания объекта, то каждый объект ее копию. Поэтому при увеличении переменной он не будет влиять на другие объекты. Каждый объект получит значение 1 в переменной count .
Программа подсчета со статической переменной
Java static переменная задействует память только один раз. Если какой-либо объект изменяет значение статической переменной, она сохраняет свое значение.
Статические методы Java
Если ключевое слово static применяется в объявлении метода, то это static method Java .