Модификатор доступа, который описывает доступность класса, объекта или поля — обязательный: при его отсутствии JVM (это такой источник вселенской магии) автоматически присваивает идентификатор по умолчанию package.
Начиная со второго модификатора идут non-access модификаторы, которые не являются обязательными, а также могут конфликтовать друг с другом (но обо всем по порядку).
Модификатор Static говорит о том, что класс, объект или поле статичны. Но что это значит? В основном он примерим к полям.
Статические переменные называются переменными класса и являются уникальными для всех экземпляров данного класса. Статические методы могут быть вызваны без создания объекта, в котором они описаны. Статические классы используются при вложении одного класса в другой и принцип взаимодействия внутреннего класса с внешним схож с методами (является темой отдельного разговора). Также может использоваться в виде отдельного блока внутри объекта.
Модификатор Final фактически служит для переменной указанием на то, что она является константой. Для методов — что они не могут быть переопределены при наследовании, ну а для классов это указание на то, что наследоваться от него нельзя (immutable).
Модификаторы static и final применимы к классам, объектам и полям. Однако есть модификаторы, которые применимы лишь к некоторым из них (или даже части, ведь и переменная и метод — это поле, но не все модификаторы применимы к обоим). Если проводить аналогию, на скорость можно зачаровать лишь ботинки и перчатки (чтобы быстрее двигались), а вот зачаровывать шляпу на скорость бессмысленно (да и Вселенский Надзирательный Совет (компилятор) не даст).
Модификатор Abstract применим только к методам и классам. Абстрактный метод — это метод без реализации (тела).
Если класс помечается как абстрактный, он либо содержит абстрактные методы, либо это делается для того чтобы запретить создание экземпляров этого класса. Если проводить аналогию, посреди инструкции можно увидеть заголовок «Раскраска объекта», после которого нет описания. Т.е. по этой инструкции можно создать объект и раскрасить его тоже можно, но в конкретно этой инструкции не написано как (пишите свою инструкцию по созданию красного объекта на основе этого объекта и опишите как его раскрашивать).
Модификатор Syncronized используется только для методов. Его наличие свидетельствует о том, что его может одновременно выполнять лишь один поток. Также может использоваться в виде отдельного блока кода внутри объекта (с указанием объекта синхронизации).
Модификатор Volatile — только для переменных. Его рекомендуется использовать для переменных, которые могут быть одновременно использоваться несколькими потоками. Переменная с таким модификатором при каждом изменении моментально копируется из кэша процессора в основную память, позволяя параллельным потокам получать самое «свежее» значение.
Стоит отметить, что volatile применим в тех случаях, когда только один поток может записывать в переменную, а остальные лишь читают из нее. Для остальных случаев лучше вешать модификатор synchronized на методы, которые записывают в волатильную переменную.
Модификатор Transient – только для переменных. Таким модификатором помечаются переменные, которые нужно пропускать при сериализации объекта (это такой умный процесс, о котором, в принципе, и самостоятельно почитать можно…)*
* - данная статья написана мною на 17 уровне и до тех пор сериализация как процесс описан не был, поэтому вместо копипасты я советую, при необходимости, изучить его самостоятельно.
- Final и Volatile – когда речь идет о переменных, мы не можем одновременно сказать что она финальна (константа) и что несколько потоков имеют возможность ее изменить… Ведь она постоянна, и в любой момент поток может ее считать, но ни один поток не в силах изменить константу (Вселенский Надзирательный Совет не даст).
- Final и Abstract — классы и методы не могут быть одновременно абстрактными (что в большинстве случаев подразумевает необходимость их уточнения для реализации) и финальными, т.е. неизменяемыми. Получается, что в инструкции написано, как создать хороший прочный шлем из любого материала (абстрактная часть), но для этого в нем обязательно не должно быть отверстий (финальная обязательная часть, изменению не подлежит).
- Abstract и Static — абстрактный метод не может одновременно быть статическим или синхронизированным. Статический абстрактный метод не имеет смысла, ведь он мало того, что ничего не делает, так еще и принадлежит целому классу — бесполезная штука получается.
- Abstract и Syncronized — какой смысл в синхронизации работы с методом, который ничего не делает?
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ