Е. Буткевич Пишем программы и игры



страница5/15
Дата22.06.2019
Размер2.79 Mb.
ТипКраткое содержание
1   2   3   4   5   6   7   8   9   ...   15
Глава 5

Структуры

и форматы данных в J2ME

Самое время перейти к теме, с которой, наверное, стоит начинать изучение любо­го языка программирования: типы и структуры данных. Какие-то типы мы уже использовали в примерах, теперь рассмотрим все существующие типы, а также структуры хранения данных.

Кому-то вводная информация о типах данных и контейнерах языка Java может по­казаться скучной. В таком случае лучше сразу перейти к водным процедурам — ко второй части главы, где мы продолжим разработки нашей игры в змейку. С теми же, кому требуется дополнительный ликбез в области общего программирования, мы продолжим.

Объекты

Язык Java является объектно-ориентированным языком даже в большей степени, чем остальные языки, оперирующие понятием «объект». Любые данные представ­ляются в виде объектов — сущностей, имеющих набор свойств-полей и методов для работы с этими свойствами.

Создается новый объект с помощью операции new, где указывается тип создава­емого объекта. При создании объекта автоматически вызывается его конструк­тор — особый метод, отвечающий за инициализацию объекта. Конструктор мо­жет иметь входные параметры инициализации, которые передаются в операции new через круглые скобки, например:

String str - new StringC'some text"):

Объект может иметь несколько конструкторов. Вызывается тот конструктор, пара­метры которого совпадут по количеству и типу с параметрами, переданными че­рез new.

В двух словах коснемся наследования классов. На основе любого класса можно создать свой собственный класс, который будет содержать все поля и методы ро­дительского класса, а также те свойства и методы, которые мы решим придать новому классу. Реализуется наследование с использованием ключевого слова extends, которое мы уже применяли в прошлой главе: public class Graph extends Canvas

Для знатоков C++ заметим, что в языке Java множественное наследование запре­щено вообще. Вместо этого предлагается сущность, именуемая интерфейсом.

Массивы 53

Интерфейс отличается от обычного класса тем, что содержит только заголовки методов и не содержит их реализации. Любой создаваемый класс может реализо­вать один или несколько интерфейсов, как мы это делали в прошлой главе:

public class Point extends Canvas implements CommandListener

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

Примитивные типы

Несмотря на то, что Java является объектно-ориентированным языком, представ­ляющим любые данные в виде объектов, все же существуют особые типы данных, называемые примитивными, которые очень широко используются в мобильном программировании.

Поддержка таких типов обусловлена тем, что зачастую малоэффективно созда­вать полноценный объект, используя оператор new и всю систему объектного за­хвата памяти, для одной маленькой циферки. Далее приведены примитивные типы, которые поддерживает J2 ME, с объемом памяти, выделяемым каждому типу:

byte 1 байт

short 2 байта

char 2 байта

int 4 байта

long 8 байт

В прошлых главах мы рассматривали набор методов различных классов. Перед каждым методом указан тип данных, который возвращает тот или иной метод. Например, метод класса Canvas int getHeightO) возвращает высоту экрана в виде числа, представленного примитивным типом int. Часто методы выполняют ка­кие-то действия, но не возвращают никаких данных или значений. В таком слу­чае тип возвращаемых данных в заголовке метода должен быть определен как void (пустой тип данных). В этом случае оператор return предписывает лишь выход из метода и не возвращает никаких значений.

Справедливости ради заметим, что любой примитивный тип данных может быть представлен соответствующим объектом одного из классов: Byte, Character, Short, Integer, Long.



Массивы

Массивом называется набор однотипных данных, хранимых в смежных ячейках оперативной памяти. Работа с массивами в языке Java производится в три этапа.

1. Объявление массива. На этом этапе задается переменная и тип массива. Квад­ратные скобки указывают на то, что объявляется именно массив. Например:

int array[]; Image images[]:

54 Глава 5. Структуры и форматы данных в J2ME

2. Определение массива осуществляется с помощью оператора new, в котором


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

array - new int[50]; images = new Image[20]:

3. Инициализация массива — присвоение значений элементам массива. Каждый
элемент имеет свой индекс — порядковый номер от нуля до длины массива без
единицы. Обращение к элементам массива выглядит так:

аггауШ - 5; аггауШ = 10:

Одна из основных проблем обычных массивов состоит в том, что при создании массива нужно точно указать количество хранимых в нем данных, что далеко не всегда удобно или вообще невозможно. Кроме обычных массивов существуют классы-контейнеры, позволяющие хранить произвольное количество данных. Такие контейнеры позволяют удобно решать задачи, требующие частого добавле­ния и удаления неизвестного заранее количества данных. Все контейнеры содер­жатся в пакете Java. uti 1. Класс Vector содержится в языке Java с самых первых ее версий.

Класс Vector

Класс Vector предназначен для хранения произвольного числа аргументов самого общего типа Object, то есть хранимые данные должны быть тем или иным образом наследованы из класса Object. Под эту категорию попадают любые объекты языка J2ME, кроме примитивных типов данных.

Размер вектора (size) — это количество хранимых в нем элементов. Каждый эле­мент при добавлении получает свой порядковый индекс, начиная с нуля. Таким образом, индекс последнего элемента вектора на единицу меньше его размера. Метод int size() возвращает текущий размер вектора, а метод boolean isEmpty() возвращает значение true, если вектор не содержит элементов. Метод void setSize(int newSize) устанавливает новый размер вектора, причем если значение newSi ze превышает текущий размер вектора, то все новые элементы при­нимают значение nul l. Если значение newSi ze меньше, чем текущий размер векто­ра, то все элементы с индексами newSi ze и выше удаляются.

Добавить новый элемент в вектор можно с помощью трех методов:



  • void addElement(Object obj) — добавляет новый элемент в конец вектора. До­
    бавленный элемент получает наивысший индекс, размер вектора увеличива­
    ется на единицу;

  • void insertElementAt(Object obj. int index) — добавляет новый элемент с за­
    данным индексом 1 ndex. Индекс элемента, находившегося на этом месте, а так­
    же все следующие индексы увеличиваются на единицу. Аргумент index дол­
    жен быть больше или равен нулю и меньше, или равен размеру вектора;

Класс Snake 55

void setElement AK ( Object obj, int index) — заменяет элемент с индексом index


на новый элемент obj, при этом старый элемент удаляется из вектора.

Удалить элементы из вектора можно также следующими методами:



  • void removeElementAt(int index) — удаляет из вектора элемент с индексом index,
    при этом все индексы элементов, выше удаляемого, уменьшаются на единицу;

  • boolean removeElement (Object obj) —удаляет из вектора первое вхождение эле­
    мента obj с логикой сдвига индексов, как и в предыдущем случае. Метод воз­
    вращается значение true, если удаляемый элемент действительно находился
    в векторе;

  • void removeAll Elements О — удаляет все элементы вектора; аналогично вызову
    setSize(O).

Получить конкретный элемент вектора можно с помощью следующих методов:

  • Object firstElementO — возвращает первый элемент вектора;

  • Object lastEl ement O) — возвращает последний элемент вектора;

■ Object elementAtdnt index) — возвращает элемент вектора с индексом 1ndex.
Следующие методы предоставляют возможности поиска элемента в векторе:

  • boolean contains(Object elem) — возвращает значение true, если элемент elem
    содержится в векторе;

  • int indexOf ( Object elem) — возвращает индекс первого вхождения элемента
    elem в вектор; в случае отсутствия элемента в векторе возвращает — 1;

  • int indexOf (Object elem, int index) — возвращает индекс первого вхождения
    элемента elem в вектор, начиная поиск с элемента с индексом index;

  • int Ias1 1ndexOf (Object elem) — возвращает индекс последнего вхождения эле­
    мента el em в вектор;

  • int lastlndexOf (Object elem, int index) — возвращает индекс последнего вхож­
    дения элемента el em в вектор. Поиск осуществляется в обратном направлении,
    начиная с элемента с индексом index.

Класс Snake

Самое время вернуться к нашей змее. В прошлой главе мы рассматривали пример программы управляемой точки. Теперь расширим это приложение до управля­емой змейки. Сейчас мы заложим основу и реализуем скелет нашей будущей игры.

Первым делом нарисуем собственно управляемую змейку, которая будет состо­ять из маленьких кусочков, каждый из которых будет представлен готовой кар­тинкой. По сценарию змея должна не просто ползать по экрану, а охотиться на воображаемую добычу, поэтому также нам потребуется дополнительная логика для управления добычей и процессом «поедания». И самое главное: если змея укусит свой хвост или упрется в стену, то она неминуемо погибнет.

Основной класс, который будет реализовывать всю логику игры, будем наследо­вать от рассмотренного в прошлой главе класса Canvas, который отвечает нашим



56

Глава 5. Структуры и форматы данных в J2ME



требованиям рисования произвольной графики, а также организации управления на низком уровне:

private class Snake extends Canvas

Для реализации гибкого змеиного тела нам потребуется пять различных элемен­тов: голова, хвост, тело и два варианта сгибов тела, различающихся направлением поворота. Эти типы частей в нашем классе будут представлены следующими кон­стантами:


голова змеи // хвост зкеи // тело змеи

// сгиб тела против часовой стрелки // сгиб тела по часовой стрелке

В каждый момент времени мы точно знаем, в какую сторону ползет змея, и в соот­ветствии с этим делаем необходимые проверки и продвигаем змею в нужном на­правлении. Возможные направления представлены следующими константами: // константы, определяющие направление движения



// константы, определяющие тип части тела змеи

II

private int HEAD - 0;

private int TAIL - 1;

■ 3 4;

private int BODY - 2:

private int ACLOCKWISEJURN

private int CLOCKWISE JRJRN

private int UP =0: private int LEFT = 1; private int RIGHT = 2 private int DOWN • 3: private int direction

// вверх

// влево

// вправо

// вниз

// текущее направление движения змеи

Текущее направление движения представлено полем int direction, которое при­нимает значение одной из констант, определяющих направление движения. Поскольку мы взялись за красивую качественную игру, то и змея наша должна выглядеть достаточно реалистично, поэтому в зависимости от направления дви­жения различные части змеи будут выглядеть по-разному. Заготовим для каждой возможной части отдельные картинки и разместим их в папке ресурсов приложе­ния /res. Здесь можно проявить фантазию и художественное мастерство. Я нари­совал вот такие части (рис. 5.1).



HeadLeft.

TailLefl. png

HeadUp. png

TailUp.


raj

HeadDown. png

TailDown. png

TailRight.

png


BodyLeft. png

BodyUp.



TurnDownLeft. png

TurnUpLefl. png

TurnDownRight.

mm

TurnDownRight. png



Рис. 5.1. Части змеи выглядят по-разному в зависимости от направления

Класс Snake 57

Частей змеи у нас фиксированное количество, не требующее динамического до­бавления или удаления, поэтому в данном случае достаточно обычного массива, который также будет являться членом класса Snake:

private Image[] images;

Размер картинки также будем хранить в отдельном поле:

private int imageSize:

Каждая часть тела змеи будет представлена объектом класса SnakePart, который будет содержать тип части, координаты и направление движения. Если для уп­равления точкой нам было достаточно хранить только текущие координаты, то теперь нам потребуется хранилище для всех частей. Класс Vector полностью отве­чает нашим требованиям, поэтому класс SnakePart должен быть наследован от клас­са Object. Согласно правилам хорошего тона программирования работу с внут­ренними полями нового класса организуем через дополнительные методы. Код класса SnakePart выглядит следующим образом:



private class SnakePart extends Object { private int x: // координата х private int у: // координата у private int part: // код части тела змеи private int dir; // код направления движения // конструктор, принимающий все поля как аргументы public SnakePart(int _x, int j, int _part, int _dir) { x = _x:

a? - jfi

part = _part: dir = _dir:

]

// получить код части тела змеи

private int getPartO { return part: }

// получить код направления движения

private int getDirO { return dir: }

// получить координату х

private int getXO { return x; }

// получить координату у

private int getYO { return y; }

// установить тип части и направление

private void setPartDir(int _part. int _dir) {

// если второй аргумент 0. то

// направление остается неизменным

part = _part:

ifCJir != 0) dir - _dir;

Все элементы змеи будет хранить поле private Vector snake;

58 Глава 5. Структуры и форматы данных в J2ME

Также для организации графики нам потребуются следующие поля:

private int width: // ширина экрана

private int height; // высота экрана

private int xHead; П координата х головы змейки

private int yHead: // координата у головы змейки

После всех необходимых приготовлений и организации структуры класса можно переходить к конструированию нового объекта класса Snake:

// конструктор класса Snake public SnakeO {



II конструктор родительского класса

superO):


// создать массив для картинок-частей змейки

images • new Image[20]:

// создать обьекты картинок для каждой части

try {


// голова во всех направлениях

images[0] = Image.createlmageC'/HeadUp.png"):

images[l] » Image.createlmageC'/HeadLeft.png");

images[2] = Image.createlmageC'/HeadRight.png");

images[3] = Image.createlmageC'/HeadDown.png"):

// хвост во всех направлениях

images[4] = Image.createlmageC'/TailUp.png");

images[5] = Image.createlmageC'/TailLeft.png"):

images[6] = Image.createlmageC'/TailRight.png"):

images[7] = Image.createlmageC/TailDown.png"):

// тело

images[8] - Image. createlmageC"/BodyUp.png"):



images[9] » Image. createlmageC"/BodyLeft .png");

images[10] = images[9]:

images[ll] = images[8]:

// сгиб тела против часовой стрелки

images[12] = Image. createlmageC"/TurnDownLeft. png");

images[13] = Image.createlmageC'/TurnUpLeft.png");

images[14] = Image.createlmageC"/TurnDownRight.png");

images[15] » Image.createlmageC"/TurnUpRight.png"); ■



ff сгиб тела по часовой стрелке

images[16] - images[14];

images[17] = images[12];

images[18] = images[15]:

images[19] = images[13];

}

eaten (IOException ioe) {} // получить разкер одного элемента змеи iinageSize - iraages[O].getWidth(); // создать вектор, хранящий элементы змейки



Класс Snake 59

snake = new VectorO:



il получить ширину экрана

width = getWidthO;

// получить высоту экрана

height = getHeightC):

// установить координаты головы в центре экрана

// для транспортабельности координаты кратны imageSize

xHead = ((width/2)/imageSize)*imageSize:

yHead = ((height/2)/imageSize)*iiriageSize;

// создать элемент головы змейки

SnakePart parts - new SnakePart(xHead, yHead. HEAD. UP);

// добавить элемент в вектор

snake.addElement(partS);

// создать элемент тела змейки

parts = new SnakePart(xHead.yHead+imageSize.BODY,UP);

snake. addElement(partS):

// создать элемент хвоста змейки

parts - new SnakePart(xHead.yHead+2*imageSize.TAIL.UP);

snake. addE lement (partS);

// установить текущее направление движения

direction = UP;



It сбросить флаг окончания игры

gameOverFlag = false: }

Как описывалось в прошлой главе, для любых классов, расширяющих класс Canvas, обязателен к реализации метод paint (), отвечающий за перерисовку экрана. Прой­дем по всем элементам вектора и выведем на экран соответствующие части змей­ки согласно их координатам: public void paint(Graphics g) {

// очистить экран

g.setColor(OxFFFFFF):

g.fillRect(O.0,width.height);

g.setColor(OxOOOOOO);

// нарисовать рамку

g.drawRect(l.l,width-3.height-3);

II получить длину змейки

int snakeLen = snake.sizeO;

// если поднят флаг конца игры

if ( gameOverFlag ) { // вывести сообщение

g.drawStringC'GAME OVER".width/2.height/2-10.g.HCENTER|g.TOP): II вывести счет, равный длине змейки String score - new StringC'YOUR SCORE: "+snakeLen): g.drawString(score,width/2.height/2+10.g.HCENTER|g.TOP): return:

60 Глава 5. Структуры и форматы данных в J2ME

} else {


// для каждого элемента змейки for ( int 1-0: i// вывести картинку, индекс которой вычисляется // с помощью комбинации кода части тела и кода направления g.drawImage(images[4*((SnakePart)snake.elementAt(i)) .getPart()+ ((SnakePart)snake.elementAt(i)).getDir()]. ((SnakePart) snake. elementAt(i)).getX(). ((SnakePart)snake.elementAt(i)).getY(). g.HCENTER | g.VCENTER);

Теперь добавим управление нашей змейкой. Для этого реализуем метод keyPressed(i nt keyCode). Перед тем как осуществлять передвижение, будем проверять, можно ли ползти в заданном направлении. Если на пути стена или собственный хвост, то поднимаем флаг конца игры.

public void keyPressed(int keyCode) { I) если флаг конца игры не поднят if ( IgameOverFlag )!{ switch (keyCode) {

// проверить, можно ли передвигаться в заданном направлении. // и вызвать соответствующую функцию передвижения case KEY_NUM2: checkMoveUHead, yHead-imageSize); moveUpO: break:

case KEY_NUM4: checkMoveCxHead- imageSize. yHead): moveLeftO: break:

case KEY_NUM6: checkMove(xHead+ imageSize. yHead): moveRightO; break:

case KEY_NUM8: checkMove(xHead. yHead+ imageSize): moveDownO :; break:

]

// вызвать перерисовку экрана repaintO: 1



!

// проверить возможность передвижения

// в точку с координатам и(хН.уН) public void checkMove(int xH, int yH) { // для каждого элемента змеи for ( int 1-3; i

// если проверяемая точка совпадает с координатами элемента if ( хН — (U уН — USriakePart)(snake.e1ementAt(i))).getY()) // поднять флаг конца игры

Класс Snake 61

gamedverF lag=triie;

// передвижение влево private void moveLeftO {

// если текущее направление не направо if ( direction!=RIGHT) {

// сдвинуть координату головы влево

xHead--imageSize:



// проверить выход за левую границу

if ( xHead < 4) { gameOverFlag=true; return; }

// получить первый элемент змеи

SnakePart head - (SnakePart)(snake.firstElementC )):

// если текущее направление вверх

if ( direction—UP )

II заменить голову на сгиб против часовой стрелки head.setPartDir(ACLOCKWISE_TURN .LEFT): else {

// если текущее направление вниз if ( direct!on==DOWN )

// заменить голову на сгиб по часовой стрелке head. setPartDi r(CLOCKWISE _TURN. LEFT); else // если текущее направление влево II заменить голову на тело head.setPartDi r(BODY.LEFT);

)

// создать новый элемент для головы

SnakePart sPart = new SnakeParttxHead.yHead.HEAD. LEFT);

// добавить голову первым элементом вектора

snake, insertElementAU sPart,0):

// продвинуть хвост

// удалить последний элемент

snake. rerooveElement (snake. lastElement О):

// назначить хвостом предпоследний элемент

((SnakePart)snake.lastElementО).setPartDir(TAIL,-1);

// установить текущее направление

direction - LEFT:

Передвижение в остальных направлениях реализуйте самостоятельно в функци­ях moveUp(),moveRi grit О, moveDown() по образу и подобию приведенной выше функ­ции moveLeft O.

Итак, основа игры написана. Приложение уже можно компилировать и запускать. На экране мы увидим вот такого милого червячка (рис. 5.2).

62

Глава 5. Структуры и форматы данных в J2ME


Управление змейкой уже реализовано, поэтому можно смело делать первые шаги, точнее, первые ползки. Покрутимся в разные стороны и убедимся, что все пово­роты реализованы без ошибок. При попытке уползти за пределы экрана мы долж­ны получить сообщение о завершении игры (рис. 5.3).













Рис. 5.2. Змейка в начале игры

Рис. 5.3. «Game over!»



Итак, все работает отменно, кроме главного момента — змея не растет. Как мы помним из аналогов, для роста змее требуется вкусная и здоровая пища, которая появляется на экране случайным образом. Пища в нашей игре будет представле­на сердечком, картинку для которого сохраним в файле heart.png, находящемся в папке /res вместе с остальными картинками элементов змейки. Для реализации правильного питания в класс Snake добавим несколько полей:

private Image heart: // картинка сердца

private int xHeart: // координата х сердца

private int yHeart: // координата у сердца

private boolean eatFlag: // флаг удлинения змеи

Также нам понадобится метод вычисления координат для случайного размеще­ния сердечка на экране. Здесь нам потребуется генератор случайных чисел,



Класс Snake 63

представленный в языке J2ME классом Random. Очередное случайное число гене­рируется с помощью метода int nextlnt О . Заметим, что число может быть отрица­тельным, поэтому требуется получить его абсолютное значение, используя метод класса Math int absdnt a).

// получить новые координаты для сердца public void setNewHeartO {

i! получить количество возможных позиций по координате х

int xPartMaxNum • (width-5)/imageSize;

// получить количество возможных позиций по координате у

int yPartMaxNum = (height-5)/imageSize:



iI получить длину змеи

int len • snake.sizeO:

// создать объект генератора случайных чисел

Random rnd = new RandomO :

// флаг корректной генерации

boolean setFlag = false;

// повторяем, пока не сгенерируем корректные координаты сердца

while ( IsetFlag ) {

// поднять флаг корректной генерации

setFlag - true:

// сгенерировать случайную координату х. кратную imageSize

xHeart = imageSize*(Math.abs(rnd.nextInt())£xPartMaxNum+l):

// сгенерировать случайную координату у, кратную imageSize

yHeart - imageSize*(Math.abs(rnd.nextInt()UyPartMaxNum+l);

// проверить совпадение координат сердца

// с координатами элементов змеи

for ( int i=0: i

if ( xHeart == ((SnakePart)(snake.elementAt(i))).getX() && yHeart — KSnakePartMsnake.elementAUim.getYO) It опустить флаг корректной генерации setFlag • false: } I

В конструкторе класса Snake добавим создание объекта картинки для сердечка heart = Image. createlmage("/heart.png") и в самом конце вызовем метод вычисле­ния координат для этой картинки setNewHeart(). В методе paint О вызовем про­рисовку картинки: g.drawlmage(heart,xHeart.yHeart.д.HCENTER | g.VCENTER).

Осталось реализовать логику удлинения змеи при встрече с сердечком. В методе checkMove() при попытке передвижения проверяем, совпадают ли координаты пред­полагаемого передвижения с координатами сердечка, и в случае равенства под­нимаем флаг удлинения змеи: if ( хН — xHeart && уН - yHeart )

eatFlag • true: else

eatFlag * false:



64

Глава 5. Структуры и форматы данных в J2ME

В методах передвижения moveUp(),moveLeftО,moveRight (), moveDown(), перед тем как продвинуть хвост, удаляя последний элемент вектора, нужно проверить, не под­нят ли флаг удлинения змеи. В случае удлинения вызовем метод генерации но­вых координат для сердечка setNewHeart(), а продвижение хвоста производить не будем:

// если флаг удлинения змеи поднят if (eatFlag)

// получить новые координаты для сердца

setNewHeartO:



// продвинуть хвост

// удалить последний элемент

snake. removeElement(snake.1astElement()):

// назначить хвостом предпоследний элемент

(CSnakePart)snake.lastElementС)).setPartDir(TAIL.-l);

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



import javax.microedition.midlet.MIDlet;

import javax.microedition.lcdui .Image; import javax.microedition.lcdui.Canvas: import javax.microedition.lcdui .Graphics: import javax.microedition.Icdui. Display: import Java.util.Vector: import Java.util.Random: import java.io.IOException:

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

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

Класс Stack


Рис. 5.4. Змейка в действии

В заключении главы рассмотрим еще один класс- контейнер, реализующий структуру данных стек.

Класс Stack 65

Данная структура характерна особым подходом к добавлению и удалению элемен­тов. Принцип хранения данных LIFO (Last In, First Out) означает, что извлечь из структуры можно только тот элемент, который был добавлен последним. Для ясно­сти проведем аналогию с узким стаканом, в который можно складывать различные предметы, но достать можно лишь тот предмет, который находится выше всех.

В языке J2ME класс Stack реализован на основе класса Vector, расширяя его функ­циональность следующими методами:


  • Object push(Object item)—добавляет элемент на вершину стека;

  • Object pop О — извлекает элемент с вершины стека;

  • Object peek () — возвращает элемент с вершины стека без его извлечения;

  • boolean empty() — возвращает значение true, если стек пуст.

  • int search (Object о) — возвращает позицию искомого объекта относительно
    вершины стека. Если объект содержится в стеке несколько раз, то возвращает­
    ся позиция самого верхнего; если элемент не содержится в стеке, то возвраща­
    ется значение -1.

* * * \

Итак, мы рассмотрели в теории и применили на практике основные типы и струк­туры данных языка J2ME. Корректное обращение с данными и преобразование типов данных предотвратит массу возможных ошибок, поэтому к этому моменту стоит отнестись особо внимательно. Перед разработкой любого приложения сле­дует хорошо обдумать, каким образом будут храниться данные приложения, ка­кова область применения тех или иных данных, и в зависимости от этого уже про­ектировать структуру классов и самого мидлета.




Каталог: Техника -> Информационные%20технологии
Информационные%20технологии -> Методические рекомендации по построению систем защиты узлов интернет 1 требования к системе защиты узла интернет 2
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации
Техника -> Ремонт китайских телефонов
Техника -> Для профилактики и лечения насморка Зачем промывать нос во время насморка?
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации


Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7   8   9   ...   15


База данных защищена авторским правом ©vossta.ru 2019
обратиться к администрации

    Главная страница