Программирование моделей на java

Объектно-ориентированное программирование

Статические элементы
Предположим, необходимо хранить количество всех людей (экземпляров класса Human, существующих в системе). Эта характеристика относиться ко всему типу в целом. Отсюда появление названия «поле класса», в отличие от «поля объекта». Объявляются такие поля с помощью модификатора static:

class Human
public static int totalCount;
>

Чтобы обратиться к такому полю, ссылка на объект не требуется, вполне достаточно имени класса:

Для удобства разрешено обращаться к статическим полям и через ссылки:

Human h = null;
h.totoalCount = 100;

Однако считается правилом хорошего тона этого не делать. Да и к тому же такое выражение будет преобразовано компилятором к «каноническому» виду:

Значение ссылки равно null, но это не имеет значения в силу описанной конвертации.
Аналогично объявляются статические методы:

class Human
private static int totalCount;

public static int getTotalCount()
return totalCount;
>
>

Для вызова статического метода ссылки на объект также не требуется.

Хотя обращения через ссылку разрешены, этого делать не рекомендуется, так как это сильно усложняет код.
Обращение к статическому полю либо методу являются корректными независимо от того, были ли порождены объекты этого класса и в каком количестве. Например, метод main() запускается до того, как программа создаст хотя бы один объект.
Статические поля также могут быть объявлены как final, это означает, что они должны быть проинициализированы строго один раз и затем уже больше не менять значения. Аналогично, статические методы могут быть объявлены как final, а это означает, что их нельзя переопределять в классах наследниках.
Для инициализации статических полей можно обращаться к статическим методам и нельзя обращаться к динамическим. Вводят специальные понятия – статический и динамический контексты. К статическому контексту относятся статические методы, поля и инициализаторы (последние редко используются в обычной практике программирования и потому не входят в данный курс). Все остальные части кода имеют динамический контекст.
При выполнении кода в динамическом контексте всегда есть объект, с которым идет работа в данный момент. Например, для динамического метода это объект, у которого он был вызван.
Со статическим контекстом ассоциированных объектов нет. А раз нет ассоциированных объектов, то и пользоваться динамическими конструкциями нельзя. Можно только ссылаться на статические поля и вызывать статические методы. Либо обращаться к объектам через ссылки на них, полученные в результате вызова конструктора или в качестве аргумента методы и т.п.

class Test
public void process()
>

public static void main(String[] args)
//process(); — ошибка! нет объекта!

Test test = new Test();
test.process(); //правильно!
>
>
Ключевые слова this и super
Если выполнение кода идет в динамическом контексте, то есть ассоциированный с ним объект. В этом случае ключевое слово this возвращает ссылку на данный объект.

class Test
public Object getThis()
return this;
>

public static void main(String[] args)
Test test = new Test();
System.out.println(test.getThis()==test); // true!
>
>

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

Наконец, слово this применяется в конструкторах для явного вызова в первой строке другого конструктора этого же класса. Там же может применяться и слово super, только уже для обращения к конструктору родительского класса.
Другие применения слова super также связаны с обращением к родительскому классу объекта. Например, оно может потребоваться в случае переопределения родительского метода.
Переопределением называют объявление метода, сигнатура которого совпадает с одним из методов родительского класса.
Иногда при переопределении бывает полезно воспользоваться результатом работы родительского метода. Предположим, он делал сложные вычисления, а переопределенный метод должен вернуть округленный результат этих вычислений. Гораздо удобнее обратиться к родительскому методу, нежели переписывать алгоритм заново. Здесь применяется слово super. Из класса наследника с его помощью можно обратиться к переопределенным методам родителя.

class Parent
public int getValue()
return 5;
>
>

class Child extends Parent
//переопределение метода
public int getValue()
//обращение к методу родителя
return super.getValue() + 2;
>

public static void main(String[] args)
Child c = new Child();
System.out.println(c.getValue()); //7
>
>

posted by Sergey A Brazhnik at 14:46

Источник

Читайте также:  Php my admin создать базу данных
Оцените статью