Статические классы, методы, переменные. Статические конструкторы

1. Какие элементы языка программирования C# можно объявлять статическими?

В языке программирования C# статическими могут быть:

  • классы;
  • методы;
  • переменные.

Чтобы класс (метод, переменная) был статическим, перед его объявлением ставится ключевое слово static .

2. Понятие статического класса. Какие особенности использования статических классов в программах на C#? Ключевое слово static

С точки зрения синтаксиса C# статический класс – это класс, который объявляется с ключевым словом static.

Общая форма объявления статического класса:

static class ClassName { // поля и методы класса // ... }

где ClassName – имя статического класса.

3. Свойства статического класса

Реализация программного кода статического класса ничем не отличается от программного кода обычного класса за исключением двух основных свойств. В сравнении с нестатическим классом, статический класс имеет следующие свойства (отличия):

  • нельзя создавать объекты статического класса;
  • статический класс должен содержать только статические члены.

4. Примеры, которые демонстрируют свойства статического класса

Пример 1. Пусть задан статический класс MyStaticClass . В этом классе объявляется один статический член с именем d .

// статический класс static class MyStaticClass { public static int d = 0; }

Если попробовать создать объект статического класса

// попытка создать объект статического класса MyStaticClass ms; // ошибка - нельзя создавать объект статического класса

то возникнет ошибка компиляции с сообщением:

Cannot declare a variable of static type

что означает:

Невозможно объявить переменную статического типа

Пример 2. Данный пример демонстрирует правило, что статический класс должен содержать только статические члены. Пусть задан статический класс MyStaticClass . Если в статическом классе MyStaticClass попробовать объявить нестатический член d целого типа

// статический класс static class MyStaticClass { // нестатический член, без ключевого слова static public int d = 0; // ошибка - нельзя объявлять нестатический экземпляр в статическом классе }

то во время компиляции компилятор выдаст следующую ошибку:

Cannot declare instance members in a static class

что значит

Нельзя объявлять члены-экземпляры в статическом классе

5. Примеры статических классов

Пример 1 . В данном примере демонстрируется использование статической переменной в статическом классе. Объявляется статический класс с именем Count , в котором помещается одна статическая переменная count . Эта статическая переменная есть счетчиком, который совместно используется в нестатических методах Add1() , Add2() другого класса Methods .

Программный код классов Count и Methods следующий:

// статический класс Count static class Count { public static int count; } // нестатический класс class Methods { // методы нестатического класса имеют доступ // к статической переменной count статического класса Count public void Add1() // нестатический метод { // изменение значения статической переменной Count .count++; } public static void Add2() // статический метод { Count .count = Count .count + 2; } }

В нижеследующем коде продемонстрированы обращения к переменной count класса Count и изменение значения этой переменной из методов Add1() , Add2() .

Methods M = new Methods (); // создать объект класса Methods // проверить значения статического члена int n = Count .count; // n = 0 // вызвать нестатический метод Add1() класса Methods M.Add1(); // увеличение Count.count на 1 n = Count .count; // n = 1

Как видно из примера, статический член данных Count.count есть общим для методов Add1() , Add2() класса Methods . Если бы в программе были реализованы другие классы с некоторыми методами, то к этому члену данных можно было бы обращаться из этих методов.

Если в данном примере класс Count объявить как нестатический (без ключевого слова static )

// класс Count - нестатический class Count { // статическая переменная count в классе Count - общий ресурс public static int count; } ...

то результат работы программы не изменится. Статическую переменную Count.count можно использовать как общий ресурс.

Пример 2 . Пример демонстрирует использование статического метода в нестатическом классе. Статический метод выступает общим ресурсом, который выполняет некоторую общую работу.

В примере объявляется статический метод AbsComplex() , находящий модуль комплексного числа. Метод объявляется в классе ComplexLibrary . Также объявляются 2 класса, которые содержат методы, использующие метод AbsComplex() в своих вычислениях.

// нестатический класс, содержащий статический метод class ComplexLibrary { // статический метод, вычисляет модуль комплексного числа // получает значение действительной (а) и мнимой (b) части комплексного числа public static double AbsComplex(double a, double b) { return Math .Sqrt(a * a + b * b); } } // класс, который содержит нестатический метод, использующий статический метод AbsComplex class CalcComplex1 { // нестатический метод // определяет, равны ли модули 2 комплексных чисел // данный метод использует статический метод ComplexLibrary.AbsComplex() для вычислений public bool EqualComplex(double a1, double b1, double a2, double b2) { double value1, value2; // использование статического метода AbsComplex() value1 = ComplexLibrary .AbsComplex(a1, b1); value2 = ComplexLibrary .AbsComplex(a2, b2); return value1 == value2; } } // еще один класс, который использует метод AbsComplex() из класса ComplexLibrary class CalcComplex2 { // метод, который определяет, равна ли длина комплексного числа значению 0 public bool ZeroComplex(double a, double b) { double value = ComplexLibrary .AbsComplex(a, b); return value == 0.0; } }

Использование методов классов CalcComplex1 , CalcComplex2 может быть следующим:

CalcComplex1 c1 = new CalcComplex1 (); // создать экземпляр (объект) класса CalcComplex2 c2 = new CalcComplex2 (); bool f; f = c1.EqualComplex(3, 4, 2, 5); // f = False f = c1.EqualComplex(1, 2, 2, 1); // f = True f = c1.EqualComplex(-1, 2, -2, 1); // f = True f = c2.ZeroComplex(0, 0); // f = True f = c2.ZeroComplex(1, -5); // f = False

6. Какие преимущества применения статических классов, методов и переменных в программах на C#?

Статические классы, методы и переменные эффективны в следующих случаях:

  • если нужно создать так называемые методы расширения. Методы расширения используются для расширения функций класса. Эти методы являются статическими;
  • если в программе есть некоторый общий ресурс, к которому могут иметь обращение методы разных классов что обрабатывают данный ресурс (читают или изменяют его значение). Этот общий ресурс объявляется как статическая переменная. Например, таким ресурсом может быть некоторый счетчик вызовов, метод что реализует уникальную обработку, уникальная файловая переменная (ресурс) и т.п.;
  • статические классы являются эффективными, когда нужно объединить между собой группы статических методов;
  • если нужно использовать общие скрытые (private ) данные класса и организовывать доступ к этим данным из статических и нестатических методов.

7. Чем отличается вызов статического метода от нестатического?

В любом нестатическом классе могут быть объявлены как статические методы, так и нестатические. Отличие между вызовом статического и нестатического метода класса состоит в следующем:

  • чтобы вызвать нестатический метод класса, нужно создать экземпляр (объект) этого класса. Статический метод вызывается без создания объекта класса – перед именем метода указывается имя класса, в котором этот статический метод объявлен.

Например. Задан нестатический класс Sqr , содержащий следующие два метода, которые возвращают квадрат целочисленного значения:

  • GetSqr() – нестатический метод;
  • GetSqrStatic() – статический метод.
class Sqr { // нестатический метод public int GetSqr(int x) { return x * x; } // статический метод public static int GetSqrStatic(int x) { return x * x; } }

Ниже демонстрируется вызов и использование этих методов:

// Демонстрация вызова статического и нестатического методов класса int t; // 1. Вызов нестатического метода класса Sqr // Нужно создать объект класса Sqr sc = new Sqr(); t = sc.GetSqr(7); // t = 49 // 2. Вызов статического метода класса Sqr t = Sqr .GetSqrStatic(7); // t = 49

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

8. Можно ли объявить скрытый (private ) статический член в некотором классе?

Да можно. В этом случае этот статический член класса будет доступным только в границах этого класса, то есть из методов этого класса. Доступ из методов других классов будет невозможен.

9. Можно ли объявлять статический член класса с модификатором доступа protected ?

Да можно. В этом случае, доступ к статического члену класса будут иметь методы класса, которые унаследованы от данного класса.

Например. Задан класс A , содержащий один статический член a , который объявлен как protected . Также задан класс B , который наследует (расширяет) класс A . Из метода SomeMethod() класса B осуществляется доступ к protected -переменной класса A .

// нестатический класс, который содержит нестатический и статический методы class A { protected static int a; } // класс B наследует (расширяет) класс A class B : A { void SomeMethod() { a = 10; // доступ к protected-переменной класса A } }

10. Может ли нестатический класс содержать статические переменные и статические методы?

Да может. Примеры использования статических методов в нестатическом классе приведены в пунктах 5 и 7.

11. Можно ли объединять статические и нестатические методы в одном классе?

Да, можно. Но только в нестатическом классе. Если класс объявлен как статический, то все методы и переменные класса должны быть также статическими (см. п. 4 — Пример 2).

Например. Пример демонстрирует объединение статического и нестатического методов класса для доступа к скрытой статической переменной t в классе. Объявляется нестатический класс CMyClass , содержащий статическую переменную, статический и нестатический методы доступа к ней.

// нестатический класс class CMyClass { // статическая переменная, объявленная как private private static int t; // статический метод, который изменяет значение статической переменной t public static void Set(int _t) { t = _t; } // нестатический метод, который читает значение статической переменной t public int Get() { return t; } }

В нижеследующем коде продемонстрирован доступ к скрытой статической переменной t класса CMyClass

// демонстрация объединения статических и нестатических членов класса int x; // 1. Доступ к скрытой (private) статической переменной через статический метод Set CMyClass .Set(777); // статическая переменная t = 777 // 2. Прочитать значение скрытой (private) статической переменной t // 2.1. Создать объект класса CMyClass mc = new CMyClass (); // 2.2. Вызвать нестатический метод Get() через экземпляр класса x = mc.Get(); // x = 777 - текущее значение статической переменной

Данный пример хорошо демонстрирует, как можно организовать работу с общими, скрытыми данными класса.

12. Можно ли в статическом методе статического класса создать объект нестатического класса?

Да, можно. Классический пример этому, функция Main() для консольных приложений. Эта функция объявлена как static . Однако, создавать экземпляры любых нестатических классов в этой функции можно.

13. Что такое статические конструкторы? Пример

Статические конструкторы позволяют инициализировать статические переменные класса.

Пример. Демонстрируется объявление статического конструктора в классе.

// класс, который содержит статический конструктор class CCount { private static int count; static CCount() { count = 7; // инициализация статической переменной count } // доступ к внутренней статической переменной count public static int Get() { return count; } }

Демонстрация работы класса CCount в некотором методе

int x; x = CCount .Get(); // x = 7

14. Какие правила (особенности) использования статических конструкторов?

При использовании статических конструкторов нужно обратить внимание на следующие правила:

  • перед статическим конструктором может указываться ключевое слово static ;
  • статические конструкторы вызываются автоматически, если класс загружается первый раз;
  • у статических конструкторов не может быть модификаторов доступа (public , private ). То есть, статические конструкторы пользуются доступом по умолчанию. Это связано с тем, что статические конструкторы вызываются в классе первыми – перед созданием первого экземпляра класса в программе;
  • статический конструктор не может иметь параметров. Если попробовать создать параметризированный статический конструктор в классе, то возникнет ошибка компиляции.

15. Можно ли из статических конструкторов инициализировать нестатические переменные класса?

Нет, нельзя. Из статических конструкторов можно инициализировать только статические переменные этого же класса. Если в этом классе также объявляются нестатические переменные, то доступа к ним из статических конструкторов нету.

Например.

class CFileName { private static string fname; // скрытая статическая переменная private string folder; // скрытая нестатическая переменная // статический конструктор static CFileName(string _fname) { fname = _fname; // доступ только к статическим переменным класса // folder = ""; // ошибка, folder - нестатическая переменная } }

Связанные темы

  • Понятие класса. Общая форма объявления класса. Объект Следующая запись Позднее связывание (late binding). Вызов метода. Пример. Класс System.Activator. Метод Invoke()

То мы можем получить к ним доступ напрямую через имя класса и оператор разрешения области видимости. Но что, если статические переменные-члены являются закрытыми? Рассмотрим следующий код:

В этом случае мы не можем напрямую получить доступ к Anything::s_value из main(), так как этот член является private. Обычно доступ к закрытым членам класса осуществляется через методы public. Хотя мы могли бы создать обычный метод для получения доступа к s_value, но нам тогда бы пришлось создавать объект этого класса для использования метода! Есть вариант получше – мы можем сделать метод статическим.

Подобно статическим переменным-членам, статические методы не привязаны к какому-либо одному объекту класса. Вот пример выше, но уже со статическим методом:

class Anything { private: static int s_value; public: static int getValue() { return s_value; } // статический метод }; int Anything::s_value = 3; // определение статической переменной-члена класса int main() { std::cout << Anything::getValue() << "\n"; }

Поскольку статические методы не привязаны к определенному объекту, то их можно вызывать напрямую через имя класса и оператор разрешения области видимости, их также можно вызвать и через объекты класса (но это не рекомендуется).

Статические методы не имеют указателя this *

У статических методов есть две интересные особенности. Во-первых, поскольку статические методы не привязаны к объекту, то они не имеют ! Здесь есть смысл, так как указатель this всегда указывает на объект, с которым работает метод. Статические методы могут не работать через объект, поэтому и указатель this не нужен.

Во-вторых, статические методы могут напрямую обращаться к другим статическим членам (переменным или функциям), но не могут к нестатическим членам. Это связано с тем, что нестатические члены принадлежат объекту класса, а статические методы — нет!

Еще пример

Статические методы можно определять вне тела класса. Это работает так же, как и с обычными методами. Например:

class IDGenerator { private: static int s_nextID; // объявление статической переменной-члена public: static int getNextID(); // объявление статического метода }; // Определение статической переменной-члена находится вне тела класса. Обратите внимание, мы не используем здесь ключевое слово static // Начинаем генерировать ID с 1 int IDGenerator::s_nextID = 1; // Определение статического метода находится вне тела класса. Обратите внимание, мы не используем здесь ключевое слово static int IDGenerator::getNextID() { return s_nextID++; } int main() { for (int count=0; count < 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

class IDGenerator

private :

static int s_nextID ; // объявление статической переменной-члена

public :

static int getNextID () ; // объявление статического метода

// Начинаем генерировать ID с 1

int IDGenerator :: s_nextID = 1 ;

int IDGenerator :: getNextID () { return s_nextID ++ ; }

int main ()

for (int count = 0 ; count < 4 ; ++ count )

std :: cout << "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

return 0 ;

Результат:

The next ID is: 1
The next ID is: 2
The next ID is: 3
The next ID is: 4

Обратите внимание, поскольку все переменные и функции этого класса являются статическими, то нам не нужно создавать объект этого класса для работы с ним! Статическая переменная-член используется для хранения значения следующего идентификатора, который должен быть ей присвоен, а статический метод — для возврата идентификатора и его увеличения.

Предупреждение о классах со всеми статическими членами

Будьте осторожны при написании классов со всеми статическими членами. Хотя такие «чисто статические классы» могут быть полезны, но они также имеют свои недостатки.

Во-первых, поскольку все статические члены создаются только один раз, то несколько копий «чисто статического класса» быть не может (без клонирования класса и его дальнейшего переименования). Например, если нам нужны два независимых объекта IDGenerator, то это будет невозможно через «чисто статический» класс.

Во-вторых, из урока о мы знаем, что глобальные переменные опасны, поскольку любая часть кода может изменить их значения и в конечном итоге изменит другие фрагменты, казалось бы, не связанного кода (детальнее ). То же самое справедливо и для «чисто статических» классов. Поскольку все члены принадлежат классу (а не его объектам), а классы имеют глобальную область видимости, то в «чисто статическом классе» мы объявляем глобальные функции и переменные со всеми минусами, которые они имеют.

C++ не поддерживает статические конструкторы

Если вы можете инициализировать обычную переменную-член через , то по логике вещей вы должны иметь возможность инициализировать статические переменные-члены через статический конструктор. И хотя некоторые современные языки действительно поддерживают статические конструкторы именно для этой цели, C++, к сожалению, не является одним из них.

Если ваша статическая переменная может быть инициализирована напрямую, то конструктор не нужен: вы можете определить статическую переменную-член, даже если она является private. Мы делаем это в примере выше с s_nextID. Вот еще один пример:

class Something { public: static std::vector s_mychars; }; std::vector Something::s_mychars = { "o", "a", "u", "i", "e" }; // определяем статическую переменную-член

class Something

public :

static std :: vector < char > s_mychars ;

std :: vector < char > Something :: s_mychars = { "o" , "a" , "u" , "i" , "e" } ; // определяем статическую переменную-член

Если для инициализации вашей статической переменной-члена требуется выполнить код (например, цикл), то есть несколько разных способов это сделать. Следующий способ является лучшим из них. Хотя это может быть немного сложно (сейчас), и, вероятно, вам это никогда не понадобится, то вы можете спокойно пропустить оставшуюся часть этого урока, если хотите.

#include #include class Something { private: static std::vector s_mychars; public: class _nested // определяем вложенный класс с именем _nested { public: _nested() // конструктор _nested инициализирует нашу статическую переменную-член { s_mychars.push_back("o"); s_mychars.push_back("a"); s_mychars.push_back("u"); s_mychars.push_back("i"); s_mychars.push_back("e"); } }; // статический метод для вывода s_mychars static void getSomething() { for (auto const &element: s_mychars) std::cout << element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vector Something::s_mychars; // определяем нашу статическую переменную-член Something::_nested Something::s_initializer; // определяем наш статический s_initializer, который вызовет конструктор _nested для инициализации s_mychars int main() { Something::getSomething(); return 0; }

#include

#include

class Something

private :

static std :: vector < char > s_mychars ;

public :

class _nested // определяем вложенный класс с именем _nested

public :

Nested () // конструктор _nested инициализирует нашу статическую переменную-член

s_mychars . push_back ("o" ) ;

s_mychars . push_back ("a" ) ;

s_mychars . push_back ("u" ) ;

s_mychars . push_back ("i" ) ;

s_mychars . push_back ("e" ) ;

Вы можете объявить некоторые методы класса статическими методами. Для этого вы должны воспользоваться ключевым словом static. Статические методы не принимают параметр this. На использование статических методов накладывается ряд ограничений.

    Статические методы могут непосредственно обращаться только к статическим членам класса.

    Статический метод не может быть объявлен как виртуальный метод.

    Вы не можете определить нестатический метод с тем же именем и тем же набором параметров, что и статический метод класса.

Статические методы имеют одну интересную особенность - вы можете вызывать их даже без создания объектов класса. Чтобы вызвать из программы статический метод, вы должны указать его полное имя, включая имя класса.

Ниже представлен класс Circle, в котором определена статический метод GetPi. Он используется для получения значения статического элемента класса fPi.

static void GetPi()

static float fPi;

float Circle::fPi = 3.1415;

Вы можете вызвать метод GetPi следующим образом:

fNumber = Circle::GetPi();

Обратите внимание, что объект класса Circle не создается.

Общие члены объектов класса

Иногда удобно, чтобы все объекты данного класса имели общие элементы данных, которые используются совместно. За счет этого можно существенно сократить количество глобальных переменных, улучшая структуру программы.

Общие элементы данных класса следует объявить с ключевым словом static. Все общие элементы класса надо определить в тексте программы, зарезервировав за ними место в оперативной памяти:

{ public: int xLeftTop, xRightBottom; int yLeftTop, yRightBottom; static char title; void SetTitle(char*); };char Cwindow::title = “заголовок окна”;

Каждый объект класса Cwindow будет иметь уникальные координаты, определяемые элементами данных xLeftTop, xRightBottom, yLeftTop, yRightBottom и одинаковый заголовок, хранимый элементом данных title.

Общие элементы данных находятся в области действия своего класса. Методы класса могут обращаться к общим элементам точно так же, как к остальным данным из класса:

void SetTitle(char* sSource)

{ strcpy(title, sSource); }

Чтобы получить доступ к общим элементам из программы, надо объявить их как public. Для обращения к такой переменной перед ее именем надо указать имя класса и оператор::.

printf(Cwindow::title);

Дружественные функции и дружественные классы

Доступ к элементам класса из программы и других классов ограничен. Вы можете непосредственно обращаться только к элементам класса, определенным или описанным после ключевого слова public. Однако, в некоторых случаях, требуется определить функцию вне класса или другой класс, методы которого могут обращаться непосредственно ко всем элементам класса, включая элементы объявленные как private и protect.

Дружественные функции

В Си++ вы можете определить для класса так называемую дружественную функцию, воспользовавшись ключевым словом friend. В классе содержится только объявление дружественной функции. Ее определение расположено вне класса. Вы можете объявить дружественную функцию в любой секции класса -public, private или protect.

Дружественная функция не является элементом класса, но может обращаться ко всем его элементам, включая private и protect. Одна и та же функция может быть дружественной для двух или более классов.

В следующем примере определена функция Clear, дружественная для классаpoint. Дружественная функция Clearиспользуется для изменения значения элементов данныхm_xиm_y, объявленных как private:

// Класс point

// Функция Clear объявляется дружественной классу point

friend void point::Clear(point*);

// Интерфейс класса...

//==========================================================

// Функция Clear

void Clear(point* ptrPoint)

// Обращаемся к элементам класса, объявленным как private

ptrPoint->m_x = 0;

ptrPoint->m_y = 0;

//==========================================================

// Главная функция

point pointTestPoint;

// Вызываем дружественную функцию

Clear(&pointTestPoint);

С помощью ключевого слова friend вы можете объявить некоторые методы одного класса дружественными для другого класса. Такие методы могут обращаться ко всем элементам класса, даже объявленным как private и protect, несмотря на то, что сами они входят в другой класс.

В следующем примере мы определяем два класса - line и point. В классе point определяем метод Set и объявляем его в классе line как дружественный. Дружественный метод Set может обращаться ко всем элементам класса line:

// Предварительное объявление класса line

//==========================================================

// Класс point

// Метод Set класса point

void Set(line*);

//==========================================================

// Класс line

// Метод Set класса point объявляется дружественной

// классу point

friend void point::Set(line*);

int begin_x, begin_y;

int end_x, end_y;

//==========================================================

// Функция Clear

void point::Set(line* ptrLine)

// Обращаемся к элементам класса line, объявленным как

ptrLine->begin_x = 0;

ptrLine->begin_y = 0;

//==========================================================

// Главная функция

point pointTestPoint;

line lineTestPoint;

// Вызываем дружественный метод

pointTestPoint.Set(&lineTestPoint);

The static can be:

Let"s look at static variables and static methods first.

What is Static Variable in Java?

Static variable in Java is variable which belongs to the class and initialized only once at the start of the execution.

  • It is a variable which belongs to the class and not to object(instance)
  • Static variables are initialized only once, at the start of the execution. These variables will be initialized first, before the initialization of any instance variables
  • A single copy to be shared by all instances of the class
  • A static variable can be accessed directly by the class name and doesn’t need any object

<class-name>.

What is Static Method in Java?

Static method in Java is a method which belongs to the class and not to the object. A static method can access only static data.

  • It is a method which belongs to the class and not to the object(instance)
  • A static method can access only static data. It can not access non-static data (instance variables)
  • A static method can call only other static methods and can not call a non-static method from it.
  • A static method can be accessed directly by the class name and doesn’t need any object
  • A static method cannot refer to "this" or "super" keywords in anyway

<class-name>.

Note: main method is static, since it must be accessible for an application to run, before any instantiation takes place.

Lets learn the nuances of the static keywords by doing some excercises!

Example: How to call static variables & methods

Step 1) Copy the following code into a editor

Public class Demo{ public static void main(String args){ Student s1 = new Student(); s1.showData(); Student s2 = new Student(); s2.showData(); //Student.b++; //s1.showData(); } } class Student { int a; //initialized to zero static int b; //initialized to zero only when class is loaded not for each object created. Student(){ //Constructor incrementing static variable b b++; } public void showData(){ System.out.println("Value of a = "+a); System.out.println("Value of b = "+b); } //public static void increment(){ //a++; //} }

Step 2) Save & Compile the code. Run the code as, java Demo .

Step 3) Expected output show below

Following diagram shows, how reference variables & objects are created and static variables are accessed by the different instances.


Step 4) It is possible to access a static variable from outside the class using the syntax ClassName.Variable_Name . Uncomment line # 7 & 8 . Save , Compile & Run . Observe the output.

Value of a = 0 Value of b = 1 Value of a = 0 Value of b = 2 Value of a = 0 Value of b = 3 Step 5) Uncomment line 25,26 & 27 . Save , Compile & Run.
error: non-static variable a cannot be referenced from a static context a++;

Step 6) Error = ? This is because it is not possible to access instance variable "a " from java static class method "increment ".

Java Static Block

The static block is a block of statement inside a Java class that will be executed when a class is first loaded into the JVM

Class Test{ static { //Code goes here } }

A static block helps to initialize the static data members , just like constructors help to initialize instance members

Статьи по теме: