Використання ключового слова static. Статичні члени даних класу. Статичні методи класу

Використання ключового слова static. Статичні члени даних класу. Статичні методи класу


Зміст



1. Для чого у класах використовуються статичні члени даних? Особливості використання статичних членів даних

Статичні члени класу – це є особливі члени даних класу. Вони близькі до глобальних змінних. Статичні члени даних використовуються у класах у випадках, коли потрібно використовувати деякі дані незалежно від будь-якого об’єкту цього класу.

Для оголошеного класу можна оголошувати будь-яку кількість об’єктів цього класу. Статичний член класу є спільним (одним) членом даних для усіх об’єктів цього класу. Статичний член класу є доступний незалежно від того, чи на даний момент створено об’єкт цього класу чи ні.

Якщо у класі член даних оголошено як статичний, то він є доступний до моменту створення будь-яких об’єктів цього класу а також є доступний без використання посилання на будь-який об’єкт.

Фактично, оголошення класу є єдиним у всій програмі. Об’єктів (екземплярів) класу може бути декілька. Статичний член класу, як і оголошення класу є тільки один, спільний для усіх об’єктів.

 

2. Як оголосити статичний член даних? Ключове слово static

Статичний член даних оголошується з допомогою ключового слова static. В загальному, оголошення статичного члена даних у класі має вигляд:

class StaticClass
{
    ...

    static type data_member;

    ...

}

 

3. Приклад, що демонструє спільний доступ до статичного члена з різних об’єктів класу а також використання статичного методу у класі

У прикладі оголошується клас з іменем DemoStatic. У класі оголошується дві змінні-екземпляри класу або члени даних класу:

  • статична змінна (статичний член даних) класу з іменем sd;
  • внутрішня змінна класу з іменем d.

Також у класі оголошуються методи:

  • конструктор класу, що ініціалізує значення внутрішніх змінних класу;
  • методи доступу до статичного члена даних GetSd(), SetSD();
  • методи доступу до нестатичного члена даних GetD(), SetD();
  • статичний метод DemoMethod(), що демонструє використання статичного члена даних sd;
  • статичний метод main(), що є точкою входу в програму.

Лістинг класу наступний:

// Використання класу, що містить статичний член даних
public class DemoStatic
{
    static int sd; // статичний член даних - спільний для усіх об'єктів класу
    int d; // нестатичний член даних

    // конструктор
    DemoStatic()
    {
        sd = 0;
        d = 0;
    }

    // методи доступу
    int GetSd()
    {
        return sd;
    }

    int GetD()
    {
        return d;
    }

    void SetSd(int nsd)
    {
        sd = nsd;
    }

    void SedD(int nd)
    {
        d = nd;
    }

    // статичний метод, що демонструє використання статичного члена даних
    static void DemoMethod()
    {
        // оголошення об'єктів класу
        DemoStatic d1 = new DemoStatic();
        DemoStatic d2 = new DemoStatic();
        DemoStatic d3 = new DemoStatic();
        int t; // додаткова змінна

        t = d1.GetD(); // t = 0
        t = d1.GetSd(); // t = 0

        // зміна статичного члену даних
        d1.SetSd(5);
        t = d2.GetSd(); // t = 5 - статичний член даних є спільним для об'єктів d1, d2, d3
        t = d3.GetSd(); // t = 5 - так само

        // зміна нестатичного члену даних
        d1.SedD(8);
        t = d2.GetD(); // t = 0

        System.out.println(t);
    }

    public static void main(String[] args)
    {
        DemoMethod();
    }
}

 

4. Яка загальна форма оголошення статичного методу в класі?

Так само як і статичний член даних класу, статичний метод в класі оголошується з допомогою ключового слова static.

У найпростішому випадку оголошення класу зі статичним методом має такий загальний вигляд:

class StaticClass
{

    // ...

    static type StaticMethod(parameters)
    {
        // ...
    }

    // ...

}

де

  • StaticClass – ім’я класу, в якому оголошується статичний метод;
  • StaticMethod() – статичний метод.

 

5. Які обмеження накладаються на статичні методи?

На статичні методи, що оголошені в деякому класі, накладаються наступні вимоги:

  • статичні методи можуть викликати тільки інші статичні методи;
  • статичні методи мають доступ тільки до статичних змінних. До нестатичних змінних класу статичні методи доступу не мають;
  • статичні методи не можуть посилатись на посилання this класу;
  • статичні методи не можуть використовувати посилання типу super.

 

6. Чи можна використовувати об’єкт класу у нестатичному методі класу, якщо у класі цього об’єкта оголошується статичний член даних?

Ні. Якщо клас оголошує статичний член даних, то оголосити об’єкт цього класу у нестатичному методі класу не можна. У цьому випадку компілятор видасть помилку

Cannot make a static reference to the non-static method DemoMethod() from the type DemoStatic

де

  • DemoMethod() – нестатичний метод;
  • DemoStatic – статичний клас.

Така реакція компілятора є логічною, оскільки, нестатичний метод класу і статичний член даних належать до різних класів пам’яті. Використовувати об’єкт класу зі статичним членом даних можна тільки у статичному методі.

 

7. Чи можуть статичні змінні оголошуватись як приховані з ключовим словом private?

Так, можуть. У прикладі в п. 3 статичний член класу можна оголошувати так:

private static int sd; // статичний член даних, оголошений як private

 

8. Що таке статичний блок класу? Для чого використовується статичний блок класу?

Статичний блок класу має такий загальний вигляд:

static
{
    // тіло блоку
    // ...
}

Статичний блок класу використовується для ініціалізації

 

9. Приклад класу, в якому здійснюється ініціалізація статичної змінної різними способами

Спосіб 1. З допомогою оператора присвоєння ‘=’.

// ініціалізація статичного члену даних класу - спосіб 1
public class InitStatic
{
    static double sd=2.85; // ініціалізація статичного члена

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        InitStatic s1 = new InitStatic(); // викликається конструктор
        double x;

        x = s1.sd; // x = 2.85
        x = sd; // x = 2.85

        System.out.println(x);
    }
}

Спосіб 2. З допомогою конструктора.

// ініціалізація статичного члену даних класу - спосіб 2
public class InitStatic
{
    static double sd;

    // ініціалізація з допомогою конструктора
    InitStatic()
    {
        sd = -8.893;
    }

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        InitStatic s1 = new InitStatic(); // викликається конструктор
        double x;

        x = s1.sd; // x = -8.893
        x = sd; // x = -8.893

        System.out.println(x);
    }
}

 Спосіб 3. Ініціалізація з допомогою статичного блоку.

// ініціалізація статичного члену даних класу - спосіб 3
public class InitStatic
{
    static double sd; // ініціалізація статичного члена

    // ініціалізація з допомогою статичного блоку
    static
    {
        sd = -100.0;
    }

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        InitStatic s1 = new InitStatic(); // викликається конструктор
        double x;

        x = s1.sd; // x = -100.0
        x = sd; // x = -100.0

        System.out.println(x);
    }
}

 

10. Як доступитись до статичного методу (змінної) за межами його класу? Як викликати статичний метод (змінну) використовуючи ім’я класу, в якому він реалізований. Приклад

Щоб викликати статичний метод за межами класу, в якому він оголошений, використовується наступна форма:

ClassName.StaticMethod()

де

  • ClassName – ім’я класу, в якому оголошений статичний метод;
  • StaticMethod() – ім’я статичного методу.

Щоб викликати статичну змінну за межами класу, в якому вона оголошена використовується така сама форма:

ClassName.StaticVariable

де

  • ClassName – ім’я класу, в якому оголошена статична змінна;
  • StaticVariable – ім’я статичної змінної.

Приклад. У нижченаведеному прикладі оголошується 2 класи з іменами A та B. У класі A реалізована статична змінна та статичний метод. Демонструється виклик статичних змінної та методу класу B з класу A.

Реалізація класу B:

public class B
{
    static int b; // статична змінна

    // статичний блок ініціалізації змінної b
    static
    {
        b = 13;
    }

    // статичний метод
    static int GetB()
    {
        return b;
    }
}

Реалізація класу A:

public class A
{
    // статична змінна
    static int a;

    // конструктор класу
    A()
    {
        a = 5;
    }

    // статичний метод
    static int GetA()
    {
        return a;
    }

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        // доступ до статичної змінної за іменем класу A
        A.a = 8;

        int t;

        // доступ до статичного методу класу A
        t = A.GetA(); // t = 8

        // доступ до статичної змінної класу B
        t = B.b; // t = 13 - змінна ініціалізована з допомогою статичного блоку класу B
        B.b = 33;
        t = B.b; // t = 33

        // доступ до статичного методу класу B
        t = B.GetB(); // t = 33

        System.out.println(t);
    }
}

 


Зв’язані теми