Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

public class Vector {

private int vx, vy;

protected double length;

public Vector(int x, int y) {

super;

vx=x;

vy=y;

length=Math.sqrt(vx*vx+vy*vy);

}

public Vector(int x1, int y1,

int x2, int y2) {

this(x2-x1, y2-y1);

}

}

Большим достоинством такого метода записи является то, что удалось избежать дублирования идентичного кода. Например, если процесс инициализации объектов этого класса увеличится

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

Разумеется, такое обращение к конструкторам своего класса не должно приводить к зацикливаниям, иначе будет выдана ошибка компиляции. Цепочка this должна в итоге приводить к super, который должен присутствовать (явно или неявно) хотя бы в одном из конструкторов. После того, как отработают конструкторы всех родительских классов, будет продолжено выполнение каждого конструктора, вовлеченного в процесс создания объекта.

public class Test {

public Test {

System.out.println("Test");

}

public Test(int x) {

this;

System.out.println("Test(int x)");

}

}

После выполнения выражения new Test(0) на консоли появится:

Test

Test(int x)

В заключение рассмотрим применение модификаторов доступа для конструкторов. Может вызвать удивление возможность объявлять конструкторы как private. Ведь они нужны для генерации объектов, а к таким конструкторам ни у кого не будет доступа. Однако в ряде случаев модификатор private может быть полезен. Например:

* private -конструктор может содержать инициализирующие действия, а остальные конструкторы будут использовать его с помощью this, причем прямое обращение к этому конструктору по каким-то причинам нежелательно;

* запрет на создание объектов этого класса, например, невозможно создать экземпляр класса Math ;

* реализация специального шаблона проектирования из ООП Singleton, для работы которого требуется контролировать создание объектов, что невозможно в случае наличия не- private конструкторов.

Инициализаторы

Наконец, последней допустимой конструкцией в теле класса является объявление инициализаторов. Записываются объектные инициализаторы очень просто – внутри фигурных скобок.

public class Test {

private int x, y, z;

// инициализатор объекта {

x=3;

if (x>0)

y=4;

z=Math.max(x, y);

}

}

Инициализаторы не имеют имен, исполняются при создании объектов, не могут быть вызваны явно, не передаются по наследству (хотя, конечно, инициализаторы в родительском классе продолжают исполняться при создании объекта класса-наследника).

Было указано уже три вида инициализирующего кода в классах –

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

если первой строкой идет обращение к конструктору родительского класса (явное или добавленное компилятором по умолчанию), то этот конструктор исполняется;

в случае успешного исполнения вызываются все инициализаторы полей и объекта в том порядке, в каком они объявлены в теле класса;

если первой строкой идет обращение к другому конструктору этого же класса, то он вызывается. Повторное выполнение инициализаторов не производится.

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

Во-вторых, теперь можно сформулировать наиболее гибкий подход к инициализации final -полей. Главное требование – чтобы такие поля были проинициализированы ровно один раз. Это можно обеспечить в следующих случаях:

если инициализировать поле при объявлении;

если инициализировать поле только один раз в инициализаторе объекта (он должен быть записан после объявления поля);

если инициализировать поле только один раз в каждом конструкторе, в первой строке которого стоит явное или неявное обращение к конструктору родителя. Конструктор, в первой строке которого стоит this, не может и не должен инициализировать final -поле, так как цепочка this -вызовов приведет к конструктору с super, в котором эта инициализация обязательно присутствует.

Для иллюстрации порядка исполнения инициализирующих конструкций рассмотрим следующий пример:

public class Test {

{

System.out.println("initializer");

}

int x, y=getY;

final int z; {

System.out.println("initializer2");

}

private int getY {

System.out.println("getY "+z);

return z;

}

public Test {

System.out.println("Test");

z=3;

}

public Test(int x) {

this;

System.out.println("Test(int)");

// z=4; - нельзя! final-поле уже

// было инициализировано

}

}

После выполнения выражения new Test на консоли появится:

initializer

getY 0

initializer2

Test

Обратите внимание, что для инициализации поля y вызывается метод getY, который возвращает значение final -поля z, которое еще не было инициализировано. Поэтому в итоге поле y получит значение по умолчанию 0, а затем поле z получит постоянное значение 3, которое никогда уже не изменится.

Поделиться:
Популярные книги

Иржина

Завойчинская Милена
Фантастика:
фэнтези
8.12
рейтинг книги
Иржина

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Неожиданная Россия. XX век

Волынец Алексей Николаевич
2. Неожиданная Россия
Проза:
историческая проза
5.00
рейтинг книги
Неожиданная Россия. XX век

Сингомэйкеры

Никитин Юрий Александрович
Странные романы
Фантастика:
социально-философская фантастика
5.75
рейтинг книги
Сингомэйкеры

Жизнь-поиск

Данилов Борис Федорович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Жизнь-поиск

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.39
рейтинг книги
Князь Мещерский

Дневники св. Николая Японского. Том V

Японский Николай
Религия и эзотерика:
православие
христианство
религия
5.25
рейтинг книги
Дневники св. Николая Японского. Том V

Легенды российских тамплиеров

Никитин Андрей Леонидович
Религия и эзотерика:
эзотерика
5.00
рейтинг книги
Легенды российских тамплиеров

Виконт де Бражелон, или Десять лет спустя. Том 2

Дюма-отец Александр
3. Три мушкетера
Приключения:
исторические приключения
9.32
рейтинг книги
Виконт де Бражелон, или Десять лет спустя. Том 2

Северный путь

Гольшанская Светлана
Фантастика:
фэнтези
героическая фантастика
мистика
6.50
рейтинг книги
Северный путь

Прорыв реальности

Бурносов Юрий Николаевич
Новая зона
Фантастика:
боевая фантастика
6.40
рейтинг книги
Прорыв реальности

Воронцов. Перезагрузка. Книга 5

Тарасов Ник
5. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.20
рейтинг книги
Воронцов. Перезагрузка. Книга 5

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10