final double PI = 3.14; // константы
Access modifiers (Модификаторы доступа):
Non-Access modifiers (Другие модификаторы):
public
private
protected
abstract
final
native
static
synchronized
transient
volatile
final
final
Field, объявленная final
не может изменить своё значение.
Method, объявленный final
не может быть переопределён в подклассе.
Class, объявленный final
не может иметь подклассы.
final
Модификатор final
(неизменяемый) может применяться к классам, методам и переменным.
final double PI = 3.14; // константы
final void run() {} // запрещено переопределение метода
final class Example {} // запрещено наследование
public final class Person {
}
class Employee extends Person {
} // Compile error
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
}
final
Однако, у объектной переменной можно изменить внутреннее состояние (свойства) с помощью вызова methods, даже если она объявлена final
.
native
native
Приложение на языке Java может вызывать методы, написанные на языке С++.
Такие методы объявляются с ключевым словом native
, которое сообщает компилятору, что метод реализован в другом месте.
public native int loadCripto(int num);
Методы, помеченные native
, можно переопределять обычными методами в подклассах.
transient
transient
Fields и methods пропускаются при сериализации содержащего их object.
volatile
volatile
Значение fields не кэшируется локально в thread и всегда считывается из основной памяти.
synchronized
synchronized
При использовании нескольких потоков управления в одном приложении необходимо синхронизировать методы, обращающиеся к общим данным.
Когда интерпретатор обнаруживает synchronized
, он включает код, блокирующий доступ к данным при запуске потока и снимающий блок при его завершении.
static
static
Модификатор static
(единственный) применяется к методам, переменным и логическим блокам.
Поля данных, объявленные в классе как static
, являются общими для всех объектов класса и называются переменными класса.
Для работы со статическими атрибутами используются статические методы, объявленные со спецификатором static
являются методами класса.
Не привязаны ни к какому объекту.
static
Не содержат указателя this
на конкретный объект, вызвавший метод.
Реализует парадигму «раннего связывания», жестко определяющую версию метода на этапе компиляции.
Статические поля и методы не могут обращаться к нестатическим полям и методам напрямую по причине недоступности указателя this.
Для обращения к статическим полям и методам достаточно имени класса, в котором они определены.
static
static
public static void main(String[] args) {
// statements
}
static
fields: exampleclass Person {
private int id;
static int counter = 1;
Person() {
id = counter++;
}
public void displayId() {
System.out.printf("Id: %d \n", id);
}
}
static
fields: examplepublic 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: examplepublic 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: examplepublic 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: examplepublic 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: exampleclass 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: examplepublic class Program {
public static void main(String[] args) {
Person tom = new Person();
Person bob = new Person();
tom.displayId();
bob.displayId();
}
}
static
import
: examplepackage 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);
}
}