Java. Урок 27. Модификаторы static и final

Уроки для начинающих   5 февраля 2013  Автор статьи:  

Модификаторы final и static очень важны в ООП. Ведь с помощью модификатора final вы сможете создать константу, а с помощью модификатора static можно обращаться к членам класса без создания экземпляра класса.
Рассмотрим для примера класс MyMath, который будет содержать арифметические функции:

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 нет:

int ans = MyMath.Add(x, y);//можно
ans = MyMath.Multiply(x, y);//нельзя

С другой стороны при создании объекта класса MyMath вы сможете пользоваться обеими функциями:

MyMath math = new MyMath();
int ans = math.Multiply(2,3);
ans = math.Add(2,3);

Конечно, обычно к статическим методам обращаются через название класса, а не через объект.
Теперь рассмотрим работу с статическими полями класса. Пусть у нас есть некоторая точка:

public class MyPoint {
public static int x;
public int y;
}

Тогда мы сможем изменять значение переменной x, не создавая объекта класса, при этом данное значение одно для всех, т.е любые изменения статического поля x будут видны во всех объектах класса, убедимся в этом на примере:

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

Таким образом статичные члены относятся к самому классу, а не к его объектам, хотя доступ к ним возможен и через них.
Кроме того статичные функции не могут вызывать или обращаться к не статичным членам. Так как очевидно, что при вызове статичных функций не понятно к какому объекту мы обращаемся:

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:

final int x = 0;
x = 1;//ошибка
final int y;
y = 2;
y = 1;//ошибка

Как видно из примера, значение переменной с модификатором final можно присвоить только 1 раз.
Модификатор final еще используется для того, чтобы запретить переопределения метода в классах наследниках. Если указать final перед классом, то вы запретите наследование от него.

  • Роман

    28 Урок открыватся в виде иероглифов …

    • У меня все норм.

  • Nina Sedykh

    тут наверное опечатки. в строках 5, 6, 9, 10 — (point*.x)
    или и так работать будет?)
    1. MyPoint point1 = new MyPoint();
    2. MyPoint point2 = new MyPoint();
    3. MyPoint.x = 1;
    4. System.out.println(MyPoint.x);//1
    5. System.out.println(point1);//1*
    6. System.out.println(point2);//1*
    7. point1.x = 2;
    8. System.out.println(MyPoint.x);//2
    9. System.out.println(point1);//2*
    10. System.out.println(point2);//2*

    • Ошибка, вы правильно заметили. Но если бы в классе point был описан toString, который возвращал бы x, то и так бы работало.

  • pavlozvarych

    Спасибо за хорошее обьяснение!

  • Олег

    http://proglang.su/java/145 — более подробно про модификаторы static, final, abstract, synchronized, transient, volatile, используемые не для доступа.

  • Сергей Сергеев

    Коротко,ясно и читабельные коды — примеры для начинающих самое то. Ато понапишут некоторые кодов — совсем не понимают простолюдин 🙂

Научиться программировать

  • на Delphi

  • на Java

  • на C++