Java предоставляет 4 типа модификаторов без контроля доступа, для повышения функциональности:
- static – используются при создании методов и переменных класса .
- final – используется для классов, методов и переменных. Сообщает о том что реализация является законченной и не подлежит изменениям.
- abstract – применяется для создания абстрактных методов и классов.
- synchronized и volatile – используются в многопоточных приложениях.
- transient – используется для сброса значения переменной, при сериализации.
Модификатор Static
Статические переменные
Использование ключевого слово static при создании переменной, делает её независимой от того был создан экземпляр класса или нет. Может существовать только одна копия статической переменной, не зависимо от того сколько было создано экземпляров класса.
Статические переменные так же известны как переменные класса. Локальная переменная не может быть объявлена как статическая.
Статические методы
Метод объявленный как статический(с модификатором static), может быть вызван без создания экземпляра класса.
Синтаксис вызова статического метода:
1 |
ClassName.methodName(); |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class InstanceCounter { private static int numInstances = 0; protected static int getCount() { return numInstances; } private static void addInstance() { numInstances++; } InstanceCounter() { InstanceCounter.addInstance(); } public static void main(String[] arguments) { System.out.println("Starting with " + InstanceCounter.getCount() + " instances"); for (int i = 0; i < 500; ++i) { new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } } |
Результат выполнения:
1 2 |
Started with 0 instances Created 500 instances |
Модификатор Final
Переменные Final
Переменные с модификатором final могут быть явно инициализированы только один раз. Переменные ссылочного типа указанные как final, не могут быть переназначены на другие объекты.
Переменные указанные как final, чaсто используются вместе с модификатором static.
Пример:
1 2 3 4 5 6 7 8 9 10 11 |
public class Test { final int value = 10; // Следующая переменная является константой public static final int BOXWIDTH = 6; static final String TITLE = "Manager"; public void changeValue() { value = 12; // will give an error } } |
Методы Final
Методы объявленные как final в суперклассе нельзя переопределить в подклассе. Как упоминалось ранее модификатор final предотвращает изменение унаследованных методов в подклассе.
Пример:
1 2 3 4 5 |
public class Test { public final void changeName() { // body of method } } |
Классы Final
Если класс помечен как final, то ни один класс не может наследоваться от него.
Пример:
1 2 3 |
public final class Test { // body of class } |
Модификатор – Abstract
Абстрактный класс
Абстрактный класс не может быть инстанцирован(создан экземпляр). Если класс объявлен с модификатором abstract, то он может служить только для расширения других классов.
Класс одновременно не может быть объявлен как abstract и final(класс с final не может быть унаследован). Если класс содержит абстрактный метод, то он так же должен быть объявлен абстрактным, иначе произойдёт ошибка при компиляции.
Пример:
1 2 3 4 5 6 7 |
abstract class Caravan { private double price; private String model; private String year; public abstract void goFast(); // Абстрактный метод public abstract void changeColor(); } |
Абстрактные методы
Методы с модификатором abstract могут быть объявлены без реализации(тело метода). Метод должен быть реализован в подклассе. Абстрактный метод не может быть объявлен как final или static.
Класс который наследуется от абстрактного класса, должен реализовать все методы суперкласса которые имеют модификатор abstract. Или класс так же должен быть объявлен абстрактным.
Если класс содержит хотя бы один абстрактный метод – то он должен быть так же объявлен абстрактным.
Синтаксис:
1 |
public abstract methodName(); |
Пример:
1 2 3 4 5 6 7 8 9 10 |
public abstract class SuperClass { abstract void m(); // Абстрактный метод } class SubClass extends SuperClass { // реализация абстрактного метода void m() { ......... } } |
Модификатор Synchronized
Ключевое слово synchronized используется для обозначения того что метод может выполняться в одно время, только в одном потоке.
Модификатор synchronized может совместно использоваться с любым из 4 модификаторов доступа.
Пример:
1 2 3 |
public synchronized void showDetails() { ....... } |
Модификатор Transient
Переменная экземпляра отмеченная ключевым словом transient необходима что бы указать JVM не сохранять её значение при сериализации.
Пример:
1 2 |
public transient int limit = 55; // will not persist public int b; // will persist |
Модификатор Volatile
В целях повышения эффективности работы, спецификации языка Java позволяет JRE сохранять локальную копию переменной в каждом потоке, который ссылается на нее. Можно считать эти «внутрипоточные» копии переменных похожими на кэш, помогающий избежать проверки главной памяти каждый раз, когда требуется доступ к значению переменной.
Но если в случае когда: запустятся два потока, и первый прочитает переменную А как 5, тогда как второй – как 10. Если переменная А изменились от 5 до 10, то первый поток не будет знать об изменении, так что будет иметь неправильное значение А. Однако если переменная А будет помечена как volatile, то то в любое время, когда поток обращается к её значению, он будет получать копию А и считывать её текущее значение.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class MyRunnable implements Runnable { private volatile boolean active; public void run() { active = true; while (active) { // line 1 // some code here } } public void stop() { active = false; // line 2 } } |