Динамический список из объектов

Следующий пример связан с созданием динамического списка из объектов. Каждый объект в этом списке, кроме числового поля, содержит ссылку на сле­дующий объект, а самый последний объект ссылается на самый первый. При этом объекты имеют метод, возвращающий в качестве значения поле объекта, отстоящего от текущего объекта, из которого вызывается метод, на определен­ное количество позиций. Программный код приведен в листинге 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; просмотров: 501;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.