Модификаторы 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 перед классом, то вы запретите наследование от него.
|