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

Навигация

Лекция 1. Что такое Java? История создания

Лекция 2. Основы объектно-ориентированного программирования

Лекция 3. Лексика языка

Лекция 4. Типы данных

Лекция 5. Имена. Пакеты

Лекция 6. Объявление классов

Лекция 7. Преобразование типов

Лекция 8. Объектная модель в Java

Лекция 9. Массивы

Лекция 10. Операторы и структура кода. Исключения

Лекция 11. Пакет java.awt

Лекция 12. Потоки выполнения. Синхронизация

Лекция 13. Пакет java.lang

Лекция 14. Пакет java.util

Лекция 15. Пакет java.io

Лекция 16. Введение в сетевые протоколы

Реклама :





Рассмотрим следующий пример:

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) { super(); vx=x2-x1; vy=y2-y1;

len gth=Math. sq rt ( vx* vx+vy* vy ) ;

}

}

Видно, что оба конструктора совершают практически идентичные действия, поэтому можно применить более компактный вид записи:

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) { thisO;

System. out. pri ntln("Test( int x)" ) ;

}

}

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

Test() Test(intx)

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

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

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