Модификаторы final и static очень важны в ООП. Ведь с помощью модификатора final вы сможете создать константу, а с помощью модификатора static можно обращаться к членам класса без создания экземпляра класса.
Рассмотрим для примера класс MyMath, который будет содержать арифметические функции:
1 2 3 4 5 6 7 8 |
public class MyMath { public static int Add(int x, int y) { return x + y; } public int Multiply(int x, int y) { return x * y; } } |
Функция Add у нас статичная, а функция Multiply нет:
1 2 |
int ans = MyMath.Add(x, y);//можно ans = MyMath.Multiply(x, y);//нельзя |
С другой стороны при создании объекта класса MyMath вы сможете пользоваться обеими функциями:
1 2 3 |
MyMath math = new MyMath(); int ans = math.Multiply(2,3); ans = math.Add(2,3); |
Конечно, обычно к статическим методам обращаются через название класса, а не через объект.
Теперь рассмотрим работу с статическими полями класса. Пусть у нас есть некоторая точка:
1 2 3 4 |
public class MyPoint { public static int x; public int y; } |
Тогда мы сможем изменять значение переменной x, не создавая объекта класса, при этом данное значение одно для всех, то есть любые изменения статического поля x будут видны во всех объектах класса, убедимся в этом на примере:
1 2 3 4 5 6 7 8 9 10 |
MyPoint point1 = new MyPoint(); MyPoint point2 = new MyPoint(); MyPoint.x = 1; System.out.println(MyPoint.x);//1 System.out.println(point1.x);//1 System.out.println(point2.x);//1 point1.x = 2; System.out.println(MyPoint.x);//2 System.out.println(point1.x);//2 System.out.println(point2.x);//2 |
Таким образом статичные члены относятся к самому классу, а не к его объектам, хотя доступ к ним возможен и через них.
Кроме того статичные функции не могут вызывать или обращаться к не статичным членам. Так как очевидно, что при вызове статичных функций не понятно к какому объекту мы обращаемся:
1 2 3 4 5 6 7 8 |
public class MyMath { public static int Add(int x, int y) { return Multiply(x, y);//нельзя обращаться к не статичным методам } public int Multiply(int x, int y) { return x * y; } } |
Любое поле в Java можно сделать константой с помощью ключевого слова final:
1 2 3 4 5 |
final int x = 0; x = 1;//ошибка final int y; y = 2; y = 1;//ошибка |
Как видно из примера, значение переменной с модификатором final можно присвоить только 1 раз.
Модификатор final еще используется для того, чтобы запретить переопределения метода в классах наследниках. Если указать final перед классом, то вы запретите наследование от него.