Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
Как следует из приведенного выше примера, использование одного объекта при инициализации другого нередко оказывается вполне оправданным. В данном случае при конструировании объекта s2 нет необходимости вычислять сумму. Даже если подобная инициализация не повышает быстродействие программы, зачастую удобно иметь конструктор, создающий копию объекта.
**Пример для опробования 6.2.**
Перегрузка конструктора класса Queue
В этом проекте предстоит усовершенствовать класс Queue, добавив в него два дополнительных конструктора. В первом из них новая очередь будет конструироваться на основании уже существующей, а во втором — присваиваться начальные значения элементам очереди при ее конструировании. Как станет ясно в дальнейшем, добавление этих конструкторов сделает класс Queue более удобным для использования.
Последовательность действий
1. Создайте новый файл QDemo2 . j ava и скопируйте в него код класса Queue, созданный в примере для опробования 6.1.
2. Добавьте сначала в этот класс приведенный ниже конструктор, который будет строить одну очередь на основании другой.
// Конструктор, строящий один объект типа Queue на основании другого.
Queue(Queue ob) {
putloc = ob.putloc;
getloc = ob.getloc;
q = new char[ob.q.length];
// копировать элементы очереди
for(int i=getloc+l; i <= putloc; i++)
q[i] = ob.q[i];
}
```
Внимательно проанализируем этот конструктор. Сначала переменные putloc и getloc инициализируются в нем значениями, содержащимися в объекте ob, который передается ему в качестве параметра. Затем в нем организуется новый массив для хранения элементов очереди, которые далее копируются из объекта ob в этот массив. Вновь созданная копия очереди будет идентична оригиналу, хотя они и являются совершенно отдельными объектами.
Добавьте в данный класс конструктор, инициализирующий очередь данными из символьного массива, как показано ниже.
// Конструирование и инициализация объекта типа Queue.
Queue(char а [ ]) {
putloc = 0;
getloc = 0;
q = new char[a.length+1];
for(int i = 0; i < a.length; i++) put(a[i]);
}
В этом конструкторе создается достаточно большая очередь для хранения символов из массива а. В силу особенностей алгоритма, реализующего очередь, длина очереди должна быть на один элемент больше, чем длина исходного массива.
Ниже приведен весь код видоизмененного класса Queue, а также код класса QDemo2, демонстрирующего организацию очереди для хранения символов и обращение с ней.
```
// Класс, реализующий очередь для хранения символов,
class Queue {
private char q[]; // Массив для хранения элементов очереди,
private int putloc, getloc; // Индексы размещения и извлечения
// элементов очереди.
// сконструировать пустую очередь заданного размера
Queue(int size) {
q = new char[size+1]; // выделить память для очереди
putloc = getloc = 0;
}
// сконструировать очередь из существующего объекта типа Queue
Queue(Queue ob) {
putloc = ob.putloc;
getloc = ob.getloc;
q = new char[ob.q.length];
// копировать элементы в очередь
for (int i=getloc+l; i <= putloc; i++)
q[i] = ob.q[i];
}
// сконструировать очередь из массива исходных значений
Queue(char а[]) {
putloc = 0;
getloc = 0;
q = new char[a.length+1];
for(int i = 0; i < a.length; i++) put(a[i]);
}
// поместить символ в очередь
void put(char ch) {
if(putloc==q.length-1) {
System.out.println(" - Queue is full.");
return;
}
putloc++;
q[putloc] = ch;
}
// извлечь символ из очереди
char get() {
if(getloc == putloc) {
System.out.println(" - Queue is empty.");