Статический метод и атрибуты класса в Java

Речь пойдет о static методах и атрибутах класса, зачем они используются, что дают они программистам.

Начнем с теории:

Модификатор static дает возможность разработчику иметь одно состояние объекта для всех экземпляров класса.

Где применяется?

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

Пример:

package com.devcolibri.core;

public class A{

    private static String stateDo;
    private static int countCallMethod = 0;

    public static void main(String[] args){
        System.out.println("Для объекта - a");
        A a = new A();
        a.methodA();
        getStateDo();

        a.methodD();
        getStateDo();

        System.out.println("Для объекта - b");
        A b = new A();
        b.methodB();
        getStateDo();

        System.out.println("Для объекта - c");
        A c = new A();
        b.methodC();
        getStateDo();

    }

    public void methodA(){
        // какие то действия
        stateDo = "Выполняется метод methodA()";
        countCallMethod++;
    }

    public void methodB(){
        // какие то действия
        stateDo = "Выполняется метод methodB()";
        countCallMethod++;
    }

    public void methodC(){
        // какие то действия
        stateDo = "Выполняется метод methodC()";
        countCallMethod++;
    }

    public void methodD(){
        // какие то действия
        stateDo = "Выполняется метод methodD()";
        countCallMethod++;
    }

    public static void getStateDo() {
        System.out.println(stateDo + " call: " + countCallMethod);
    }

}

Также я создал переменную которая показываю сколько раз был вызван любой метод с данного класса переменная называется countCallMethod изначально равна нулю.

Результат выполнения кода:

Для объекта - a
Выполняется метод methodA() call: 1
Выполняется метод methodD() call: 2
Для объекта - b
Выполняется метод methodB() call: 3
Для объекта - c
Выполняется метод methodC() call: 4

Еще static дает возможность получать доступ к методам и атрибутам класса без создание экземпляра этого класса. При условии что методы или атрибуты с модификатором static не есть private.

Продемонстрирую на том же примере, только в старом примере наши переменные есть private это не допустимо для демонстрации примера, поэтому я делаю их public, а также все методы делаю static, после моих изменений класс A будет выглядеть следующим образом:

package com.devcolibri.core;

public class A{

    public static String stateDo;
    public static int countCallMethod = 0;

    public static void main(String[] args){
        System.out.println("Для объекта - a");
        A.methodA();
        System.out.println(A.stateDo + "  call: " + A.countCallMethod);

        A.methodD();
        System.out.println(A.stateDo + "  call: " + A.countCallMethod);

        System.out.println("Для объекта - b");
        WorkInFile.methodB();
        System.out.println(A.stateDo + "  call: " + A.countCallMethod);

        System.out.println("Для объекта - c");
        WorkInFile.methodC();
        System.out.println(A.stateDo + "  call: " + A.countCallMethod);

    }

    public static void methodA(){
        // какие то действия
        stateDo = "Выполняется метод methodA()";
        countCallMethod++;
    }

    public static void methodB(){
        // какие то действия
        stateDo = "Выполняется метод methodB()";
        countCallMethod++;
    }

    public static void methodC(){
        // какие то действия
        stateDo = "Выполняется метод methodC()";
        countCallMethod++;
    }

    public static void methodD(){
        // какие то действия
        stateDo = "Выполняется метод methodD()";
        countCallMethod++;
    }
}

Результат выполнения тот же:

Для объекта - a
Выполняется метод methodA() call: 1
Выполняется метод methodD() call: 2
Для объекта - b
Выполняется метод methodB() call: 3
Для объекта - c
Выполняется метод methodC() call: 4

Теперь как вы заметили мы не создаем экземпляр данного класса, а просто вызываем методы этого класса и обращаемся к его атрибутам напрямую.

Для того что бы вызвать метод, мы обращаемся по имени класса к его параметрам A.stateDo или A.methodA();

Урок создан: 01 апреля 2013 | Просмотров: 13729 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

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

  • 22 апреля 2015 в 11:43

    Володимир

    Почему во втором примере для вызова методов B и C написано WorkInFile? Разве не должно быть А.methodB(); , А.methodС(); ?