Loading...

Static модификатору

 

Кадимки ыкмалардан жана талаалардан тышкары класста статикалык талаалар, методдор, константалар жана инициализаторлор болушу мүмкүн. Мисалы, негизги программа классынын статикалык негизги ыкмасы бар:

public static void main(String[] args) {

    

}

Статикалык өзгөрмөлөрдү, константаларды, методдорду жана инициализаторлорду жарыялоо үчүн static ачкыч сөзү аларды жарыялоонун алдында көрсөтүлөт.

 

Статикалык талаалар

Класс объекттерин түзүүдө ар бир объект статикалык эмес регулярдуу талаалардын өзүнүн көчүрмөсүн түзөт. Жана статикалык талаалар бүт класс үчүн жалпы болуп саналат. Ошондуктан, аларды класс объекттерин түзбөстөн колдонууга болот.

 

Мисалы, статикалык өзгөрмө түзөлү:

public class Program{

     

    public static void main(String[] args) {

        

        Person tom = new Person();

        Person bob = new Person();

        

        tom.displayId();    // Id = 1

        bob.displayId();    // Id = 2

        System.out.println(Person.counter); // 3

        

        // изменяем Person.counter

        Person.counter = 8;

        

        Person sam = new Person();

        sam.displayId();    // Id = 8

    }

}

class Person{

    

    private int id;

    static int counter=1;

    

    Person(){

        id = counter++;

    }

    public void displayId(){

    

        System.out.printf("Id: %d \n", id);

    }

}

Person классы конструктордо көбөйтүлгөн жана id өзгөрмөсүнө дайындалган статикалык өзгөрмө эсептегичти камтыйт. Башкача айтканда, ар бир жаңы Person объектисин түзүүдө бул өзгөрмө көбөйөт, андыктан ар бир жаңы Person объектинин id талаасынын мааниси мурункусунан 1 га көбүрөөк болот.

 

Эсептөөчү өзгөрмө статикалык болгондуктан, биз аны программада класстын аталышы менен айта алабыз:

System.out.println(Person.counter); // получаем значение

Person.counter = 8;                 // изменяем значение

 

Программанын консолдук натыйжасы:

Id = 1

Id = 2

3

Id = 8

Статикалык константалар

Бүткүл класс үчүн жалпы болгон статикалык константалар да бар.

public class Program{

     

    public static void main(String[] args) {

        

        double radius = 60;

        System.out.printf("Radisu: %f \n", radius);             // 60

        System.out.printf("Area: %f \n", Math.PI * radius);     // 188,4

    }

}

class Math{

    public static final double PI = 3.14;

}

Белгилей кетсек, буга чейинки бардык темаларда статикалык константалар жигердүү колдонулуп келген. Атап айтканда, сөз айкашында:

System.out.println("hello");

 

out жөн гана Системанын классынын статикалык константасын билдирет. Демек, ага Система классынын объектисин түзбөстөн кирүүгө болот.

 

Статикалык инициализаторлор

Статикалык инициализаторлор статикалык өзгөрмөлөрдү инициализациялоо үчүн же эң биринчи объект түзүлгөндө аткарылуучу аракеттерди аткаруу үчүн иштелип чыккан. Мисалы, статикалык инициализаторду аныктайлы:

public class Program{

     

    public static void main(String[] args) {

        

        Person tom = new Person();

        Person bob = new Person();

        

        tom.displayId();    // Id = 105

        bob.displayId();    // Id = 106

    }

}

class Person{

    

    private int id;

    static int counter;

    

    static{

        counter = 105;

        System.out.println("Static initializer");

    }

    Person(){

        id=counter++;

        System.out.println("Constructor");

    }

    public void displayId(){

    

        System.out.printf("Id: %d \n", id);

    }

}

Статикалык инициализатор кадимки инициализатор сыяктуу аныкталат, бирок анын алдында статикалык ачкыч сөз турат. Бул учурда, статикалык инициализатордо биз статикалык талаа эсептегичинин баштапкы маанисин коюп, консолго билдирүү басып чыгарабыз.

 

Программанын өзү Person классынын эки объектисин түзөт. Ошентип, консолдун чыгышы төмөнкүдөй болот:

Static initializer

Constructor

Constructor

Id: 105

Id: 106

Статикалык инициализатор класс жүктөлгөндөн кийин жана чындыгында класстын эң биринчи объекти түзүлгөнгө чейин чакырылаарын эске алуу керек.

 

Статикалык методдор

Статикалык методдор бүтүндөй класска да тиешелүү. Мисалы, жогорудагы мисалда статикалык өзгөрмө эсептегичке сырттан жеткиликтүү болгон жана биз анын маанисин Person классынын сыртында өзгөртө алганбыз. Сырттан өзгөртүүгө жеткиликсиз, бирок окула турган кылып коёлу. Бул үчүн, биз статикалык ыкманы колдонобуз:

public class Program{

     

    public static void main(String[] args) {

        

        Person.displayCounter();    // Counter: 1

        

        Person tom = new Person();

        Person bob = new Person();

        

        Person.displayCounter();    // Counter: 3

    }

}

class Person{

    

    private int id;

    private static int counter = 1;

    

    Person(){

        id = counter++;

    }

    // статический метод

    public static void displayCounter(){

        

        System.out.printf("Counter: %d \n", counter);

    }

    public void displayId(){

    

        System.out.printf("Id: %d \n", id);

    }

}

Эми статикалык өзгөрмө сырттан жеткиликтүү эмес, ал купуя. Жана анын мааниси displayCounter статикалык ыкмасын колдонуу менен көрсөтүлөт. Класстын аталышы статикалык ыкманы чакыруу үчүн колдонулат: Person.displayCounter().

 

Статикалык ыкмаларды колдонууда чектөөлөрдү эске алуу керек: статикалык методдордо биз башка статикалык ыкмаларды гана чакырып, статикалык өзгөрмөлөрдү гана колдоно алабыз.

 

Жалпысынан, методдор объекттин абалына, башкача айтканда, анын статикалык эмес талааларына жана константаларына таасирин тийгизбегенде статикалык деп аныкталат жана методду чакыруу үчүн класстын инстанциясын түзүү мааниси жок. Мисалы:

public class Program{

     

    public static void main(String[] args) {

            

        System.out.println(Operation.sum(45, 23));          // 68

        System.out.println(Operation.subtract(45, 23));     // 22

        System.out.println(Operation.multiply(4, 23));      // 92

    }

}

class Operation{

    

    static int sum(int x, int y){

        return x + y;

    }

    static int subtract(int x, int y){

        return x - y;

    }

    static int multiply(int x, int y){

        return x * y;

    }

}

Бул учурда, кошуу, кемитүү жана көбөйтүү ыкмалары үчүн Operation классынын кайсы нускасы колдонулганы маанилүү эмес. Бул ыкмалар параметрлер менен гана иштейт жана класстын абалына таасир этпейт. Ошондуктан, аларды статикалык деп аныктоого болот.