final double PI = 3.14; // константыAccess modifiers (Модификаторы доступа):
Non-Access modifiers (Другие модификаторы):
public
private
protected
abstract
final
native
static
synchronized
transient
volatile
finalfinalField, объявленная 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 errorpublic 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.
nativenativeПриложение на языке Java может вызывать методы, написанные на языке С++.
Такие методы объявляются с ключевым словом native, которое сообщает компилятору, что метод реализован в другом месте.
public native int loadCripto(int num);Методы, помеченные native, можно переопределять обычными методами в подклассах.
transienttransientFields и methods пропускаются при сериализации содержащего их object.
volatilevolatileЗначение fields не кэшируется локально в thread и всегда считывается из основной памяти.
synchronizedsynchronizedПри использовании нескольких потоков управления в одном приложении необходимо синхронизировать методы, обращающиеся к общим данным.
Когда интерпретатор обнаруживает synchronized, он включает код, блокирующий доступ к данным при запуске потока и снимающий блок при его завершении.
staticstaticМодификатор 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);
}
}