Урок 8

Ключевое слово static


Ключевое слово static используется для объявления статических членов класса.

Обращение к обычному члену класса должно осуществляться только в сочетании с объектом его класса. Когда член класса объявлен как static (статический), он доступен до создания любых объектов его класса и без ссылки на какой-нибудь объект.

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

1. Статические переменные

Пример 1. Использование статических переменных

public class StaticVars {
    int a;
    static int b;

    public static void main(String[] args) {
        StaticVars staticVars = new StaticVars();
        System.out.println(staticVars.a);
        System.out.println(b);
    }
}
public class StaticVarsDemo {
    public static void main(String[] args) {
        StaticVars staticVars1 = new StaticVars();
        StaticVars staticVars2 = new StaticVars();

        System.out.println(staticVars1.a);
        System.out.println(StaticVars.b);
        System.out.println(staticVars1.b);

        staticVars1.b = 3;
        staticVars2.b = 4;

        System.out.println(staticVars1.b);
        System.out.println(staticVars2.b);
    }
}

2. Статические методы

На методы, объявленные как static, накладывается следующие ограничения:

  • Они могут непосредственно вызывать только другие статические методы.
  • Им непосредственно доступны только статические переменные.
  • Они не могут делать ссылки типа this или super.

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

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

Пример 2. Использование статических переменных, методов и блоков кода

public class UseStatic {
    static int a = 3;
    static int b;
    int c;

    public void nonStaticMethod() {
        System.out.println("Нестатический метод");
    }

    static {
        System.out.println("Статический блок инициализирован.");
        b = a * 4;
    }

    static void method(int x) {
        System.out.println("x = " + x);
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        //System.out.println("c = " + c); cannot access non-static member
    }

    public static void main(String[] args) {
        method(42);
        //nonStaticMethod();cannot access non-static member
        UseStatic useStatic = new UseStatic();
        useStatic.nonStaticMethod();
        System.out.println("c = " + useStatic.c);
        useStatic.method(67);
    }
}
public class UseStaticDemo {
    public static void main(String[] args) {
        UseStatic.method(42);
        System.out.println(UseStatic.a);
    }
}

Пример 3. Подсчет количества созданных объектов

public class Ball {
    private static int count = 0;
    private String color = "none";

    public Ball(String color) {
        this.color = color;
        count++;
    }

    static int getCountInstance() {
        return count;
    }

    protected void finalize() {
        System.out.println("In finalize");
        count--;
    }
}

4. Статический импорт

Для того чтобы получить доступ к статическим членам классов, требуются указать ссылку на класс. К примеру, необходимо указать имя класса Math: 

double r = Math.cos(Math.PI * theta); 

Конструкция статического импорта позволяет получить прямой доступ к статическим членам без указания имени класса:

import static java.lang.Math.PI; 
import static java.lang.Math.cos; 
double r = cos(PI * 4);


0 comments
Leave your comment: