Динамический список из объектов
Следующий пример связан с созданием динамического списка из объектов. Каждый объект в этом списке, кроме числового поля, содержит ссылку на следующий объект, а самый последний объект ссылается на самый первый. При этом объекты имеют метод, возвращающий в качестве значения поле объекта, отстоящего от текущего объекта, из которого вызывается метод, на определенное количество позиций. Программный код приведен в листинге 4.10.
Листинг 4.10. Динамический список объектов
class MyClass{
// Поле для нумерации объектов: int number=0;
// Ссылка на следующий объект; MyClass next=this; void create(int n){ int i;
MyClass objA=this; MyClass objB; // Создание списка: for(i=1;i<=n;i++){
objB=new MyClass();
objA.next=objB;
objB.number=objA.number+1;
objA=objB;}
// Поледний объект списка ссылается на начальный:
objA.next=this;
}
// Номер объекта в списке: int getNumber(int k){ int i;
MyClass obj=this; for(i=1;i<=k;i++) obj=obj.next; return obj.number;}
}
class ObjList{
public static void main(String[] args){ // Исходный объект: MyClass obj=new MyClass();
// Создание списка из 4-х объектов (начальный + еще 3 объекта): obj.create(3);
// Проверка содержимого списка: System.out.println("Значение поля number объектов:"); System.out.printlnC'2-й после начального -> "+obj.getNumber(2)); System.out.printlnC'4-й после начального -> "+obj.getNumber(4)); System.out.println("2-й после 1-го -> "+obj.next.getNumber(2)); }}
В программе создается класс MyClass, у которого всего два поля: целочисленное поле number с нулевым значением по умолчанию и объектная переменная next класса MyClass. В эту переменную записывается ссылка на следующий в списке объект. По умолчанию значение переменной присваивается ссылке this, что означает ссылку на тот же объект, полем которого является переменная.
Для создания списка объектов предусмотрен метод create(). Метод не возвращает результата и в качестве аргумента ему передается целое число, которое определяет количество объектов, добавляемых в список. В методе объявляются локальная целочисленная индексная переменная i , локальная объектная переменная objA (текущий объект списка) класса MyClass с начальным значением this — ссылкой на объект, из которого вызывается метод create(), а также объектная переменная objB (следующий элемент списка) того же класса MyClass. Затем запускается цикл, в котором индексная переменная получает значения от 1 до n (аргумент метода create()) с единичным шагом дискретности. Командой objB=new MyClass() в цикле создается новый объект класса MyClass, и ссылка на этот объект присваивается в качестве значения переменной objB. Командой objA.next=objB в поле next объекта objA записывается ссылка на объект objB. То есть в поле next текущего объекта списка записывается ссылка на следующий элемент списка. Далее командой objB.number=objA.number+1 полю number следующего элемента списка присваивается значение, на единицу большее значения поля number текущего элемента списка. Наконец, командой objA=objB переменной objA присваивается ссылка на следующий элемент списка. На очередной итерации новое значение получит и переменная objB. После завершения цикла переменные objA и objB будут ссылаться на последний объект в списке. Полю number этого объекта значение уже присвоено (при выполнении инструкции цикла). Осталось только присвоить значение полю next этого объекта (по умолчанию в этом поле содержится ссылка на объект-владелец поля). Новое значение полю присваивается командой objA.next=this. В данном случае this — это ссылка на объект, из которого вызывался метод create() , то есть ссылка на начальный объект списка. После этого список будет создан.
Метод getNumber() возвращает в качестве результата целочисленное значение поля number объекта, который расположен в списке на указанное аргументом число позиций. Поскольку объекты в списке ссылаются друг на друга циклически (последний объект ссылается на первый), аргумент метода getNumber() может быть больше, чем количество объектов в списке. Алгоритм выполнения метода остаточно прост: в методе запускается цикл, в котором командой obj=obj.next в локальную объектную переменную в качестве значения записывается ссылка на следующий элемент списка (напомним, эта ссылка хранится в поле-переменной next). После завершения цикла переменная obj ссылается на нужный объект. В качестве результата возвращается поле number этого объекта.
В главном методе программы в классе ObjList командой MyClass obj=new MyClass() создается базовый начальный объект. Затем командой obj.create(3) создается список объектов (всего четыре объекта — один начальный и еще три к нему добавляются). Поле number начального элемента имеет по умолчанию значение 0, а у следующих в списке объектов значения полей number равны 1, 2 и 3. После этого несколькими командами выполняется проверка свойств созданной структуры объектов. В результате выполнения программы получаем следующее:
Значение поля number объектов:
2-й после начального -> 2
4-й после начального -> 0
2-й после 1-го -> 3
В частности, командой obj.getNumber(2) возвращается значение поля number объекта, смещенного от начального объекта на две позиции, то есть значение 2. Командой obj.getNumber(4) возвращается значение поля number объекта, отстоящего от начального на 4 позиции. На 3 позиции от начального размещен последний объект в списке. Этот объект ссылается на начальный объект. Поэтому в результате выполнения команды obj.getNumber(4) возвращается значение поля number начального объекта, то есть значение 0. Наконец, командой obj.next.getNumber(2) возвращается значение поля number объекта, смещенного на две позиции от объекта, ссылка на который записана в поле next объекта obj (начальный объект). Это третий объект после начального. Поэтому результатом команды является значение 3.
<== предыдущая лекция | | | следующая лекция ==> |
Ключевое слово this | | | Темперамент и свойства высшей нервной деятельности. Характерологические особенности темперамента. Особенности проявления в профессиональной деятельности сотрудников ОВД. |
Дата добавления: 2016-06-13; просмотров: 549;