Modifiers

Modifiers

  • Access modifiers (Модификаторы доступа):

  • Non-Access modifiers (Другие модификаторы):

Access modifiers

  • public

  • private

  • protected

Non-Access modifiers

  • abstract

  • final

  • native

  • static

  • synchronized

  • transient

  • volatile

Modifier final

Modifier final

  • Field, объявленная final не может изменить своё значение.

  • Method, объявленный final не может быть переопределён в подклассе.

  • Class, объявленный final не может иметь подклассы.

Modifier final

Модификатор final (неизменяемый) может применяться к классам, методам и переменным.

final double PI = 3.14; // константы
final void run() {} // запрещено переопределение метода
final class Example {} // запрещено наследование

Example

public final class Person {
}
class Employee extends Person {
} // Compile error

Example

public class Person {
    public final void display() {
        System.out.println("Имя: " + name);
    }
}
class Employee extends Person {
    @Override
    public void display() {
        System.out.println("Имя: " + name);
    } // Compile error
}

Modifier final

  • Однако, у объектной переменной можно изменить внутреннее состояние (свойства) с помощью вызова methods, даже если она объявлена final.

Modifier native

Modifier native

  • Приложение на языке Java может вызывать методы, написанные на языке С++.

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

public native int loadCripto(int num);
  • Методы, помеченные native, можно переопределять обычными методами в подклассах.

Modifier transient

Modifier transient

  • Fields и methods пропускаются при сериализации содержащего их object.

Modifier volatile

Modifier volatile

  • Значение fields не кэшируется локально в thread и всегда считывается из основной памяти.

Modifier synchronized

Modifier synchronized

  • При использовании нескольких потоков управления в одном приложении необходимо синхронизировать методы, обращающиеся к общим данным.

  • Когда интерпретатор обнаруживает synchronized, он включает код, блокирующий доступ к данным при запуске потока и снимающий блок при его завершении.

Modifier static

Modifier static

  • Модификатор static (единственный) применяется к методам, переменным и логическим блокам.

  • Поля данных, объявленные в классе как static, являются общими для всех объектов класса и называются переменными класса.

  • Для работы со статическими атрибутами используются статические методы, объявленные со спецификатором static являются методами класса.

  • Не привязаны ни к какому объекту.

Modifier static

  • Не содержат указателя this на конкретный объект, вызвавший метод.

  • Реализует парадигму «раннего связывания», жестко определяющую версию метода на этапе компиляции.

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

  • Для обращения к статическим полям и методам достаточно имени класса, в котором они определены.

non static

Non static members

static

Static members

Example

public static void main(String[] args) {
    // statements
}

static fields: example

class Person {
    private int id;
    static int counter = 1;

    Person() {
        id = counter++;
    }

    public void displayId() {
        System.out.printf("Id: %d \n", id);
    }
}

static fields: example

public class Program {
    public static void main(String[] args) {
        Person tom = new Person();
        Person bob = new Person();
        tom.displayId();
        bob.displayId();
        System.out.println(Person.counter);
        Person.counter = 8;
        Person sam = new Person();
        sam.displayId();
    }
}

static constants: example

public class Program {
    public static void main(String[] args) {
        double radius = 60;
        System.out.printf("Radisu: %f \n", radius);
        System.out.printf("Area: %f \n", Math.PI * radius);
    }
}

public class Math {
    public static final double PI = 3.14;
}

static methods: example

public 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;
    }
}

static methods: example

public class Program {
    public static void main(String[] args) {
        System.out.println(Operation.sum(45, 23));
        System.out.println(Operation.subtract(45, 23));
        System.out.println(Operation.multiply(4, 23));
    }
}

static initializers: example

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);
    }
}

static initializers: example

public class Program {
    public static void main(String[] args) {
        Person tom = new Person();
        Person bob = new Person();
        tom.displayId();
        bob.displayId();
    }
}

static import: example

package study;

import static java.lang.System.*;
import static java.lang.Math.*;

public class Program {
    public static void main(String[] args) {
        double result = sqrt(20);
        out.println(result);
    }
}