{{notification.text}}

MirGames

В данной статье я попытаюсь научить читателя программировать на языке J2ME (Java 2 Micro Edition), объясню основные понятия языка, структуру приложений написанных на нем, познакомлю с синтаксисом. После ознакомления с данным материалом автор сможет перейти к более углубленному изучению языка, зная основы и синтаксис.

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

Для тех, кто не в курсе, J2ME – объектно-ориентированный язык программирования для написания приложений для мобильных телефонов. Думаю, что вступления хватит и нужно уже переходить к делу, а для тех кто как говориться “не въехал” рекомендую купить какую-нибудь книжечку по программированию для начинающих.

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

Каждая переменная имеет имя, тип и значение.

Имя – это то название, по которому к переменной обращаются. Оно должно состоять только из букв латинского алфавита, цифр, либо символа подчеркивания “_”, но начинаться с цифр не может. Пример, допустимых имен переменных: beisik, super, _coder666.

Тип определяет вид данных, которые находятся в переменной.
Примечание
Реализация J2ME не является примером языка свободного использования типов.
Т.е. необходимо всегда задавать тип переменной, и он не может быть изменен в дальнейшем.

J2ME поддерживает следующие простые типы данных:
  • Целый (byte, int, short, long)
  • Строковый (char)
  • Булевый, или логический (boolean)

Для того чтобы присвоить переменным значения основных типов используются литералы – буквальные значения соответствующих типов.

Для целого типа используются целые литералы – последовательность цифр, которая представляет обычные целые числа: 32, 1024, -99, +16 и т.д.

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

Булевы литералы могут (для булевого типа) могут принимать одно из двух значений: true(истинна) или false(ложь).

Определяется переменная следующим образом:
тип_переменной имя_переменной [= начальное_значение];

А так это будет выглядеть на языке J2ME:
int number = 32;
boolean good;


Примечание
Начальное значение можно и не указывать.

Выражения и операторы
Оператор – отдельная команда, которую должен выполнить компьютер. Выражение – комбинации переменных, литералов и операторов, результат которой — единственное значение.

Присваивание
Присваивание – выражение присваивания, в котором какой-нибудь переменной присваивается значение. Знак оператора — = (равно).
int D = 666 * b – 777;

В этом фрагменте кода переменной D присвоили результат выражения 666*b-777.

Условные операторы (Операторы выбора)
Существуют два условных оператора: if...else и switch.

Синтаксис if...else выглядит так:
if(условие){
   операторы1;}
[else{
   операторы2;}]

Т.е. если условие истинно, то выполняются операторы1, иначе операторы2.

Блок else{} необязателен.

Switch. Практически тоже самое, что и прошлый, но поддерживает большее количество вариантов. Записывается так:
switch(выражение){
   case значение1:
     [операторы1;]
     break;
   case значение2:
     [операторы2;]
     break;
   ...
   case значениеX:
     [операторыX;]
     break;
}

Если значение выражения равно значению1, то выполняется операторы1, если значению2, то операторы2 и т.д. break – прерывает работу цикла оператора.

Условный цикл
Или, как его еще называют, цикл “пока”. Пока верно заданное на проверку выражение, будет выполняться оператор:
while (выражение){
   операторы;
}


Функции
Функция – кусок кода программы, который выделен отдельно, получил имя и может вызываться под этим именем. У функции имеется заголовок, с описанием ее параметров, “тело” (код), который размещается между { и }. Также она может иметь или не иметь результат на выходе. Синтаксис функции достаточно простой:
тип_результата имя_функции([параметры_функции]){
[операторы;]
return [значение_результата];
}

Т.е. сначала необходимо написать тип выводимого результата. Он может быть любым (int, char, boolean, какой-либо пользовательский класс и т.д.), а если он не нужен, то нужно просто записать слово void. Далее следует имя функции, а в скобках необязательные параметры инициализации. В “теле” (коде) функции обязательно должен присутствовать оператор return, который возвращает значение результата функции. Опять таки, если функция без результата (void), то значение результата нужно просто опустить.

Объекты
Как уже писалось выше, J2ME – объектно-ориентированный язык программирования. А это значит, что практически любые данные представляются в виде объектов. Объект (или класс) – некая конструкция, у которой имеются поля-переменные (свойства) и поля-функции (методы) для работы с этими свойствами.

Чтобы создать объект нужно вызвать его конструктор (специальный метод, отвечающий за инициализацию объекта). Делается это при помощи оператора new, после которого указывается тип создаваемого класса. Конструктор может иметь входящие параметры. Также у объекта могут быть несколько конструкторов, а вызываться будет тот, параметры которого совпадут по количеству и типу с параметрами, переданными через new. Синтаксис создания класса такой:
тип_класса имя_класса = new конструктор_класса([входящие параметры]);

На языке J2ME это будет выглядеть так (на примере класса String):
String my_nick = new String("beisik");

А теперь я расскажу вам о такой полезной штуке как наследование. Это означает, что на основе любого объекта можно создать свой собственный объект, у которого будут все поля и методы родительского (тот от которого наследовали) класса, а также те свойства и методы, которые мы определим. Реализуется наследование с помощью ключевого слова extends:
public class MyMidlet extends MIDlet

Здесь мы определили класс MyMidlet, наследуемый от стандартного класса MIDlet. Слово class означает, что мы создаем именно класс (объект).

Следует заметить, что часто нужно создать такой класс, который бы наследовал свойства и методы более чем одного объекта. Данная возможность (множественное наследование) не предусмотрено вообще. Вместо этого нам предлагают пользоваться такой вещью, как интерфейс.

Интерфейс отличается от класса тем, что содержит только заголовки методов без их реализации (абстрактные методы). Любой класс может реализовывать один или более интерфейсов. Пример:
public class MyMidlet extends MIDlet implements CommandListener

Здесь мы модифицируем наш класс MyMidlet, наследованный от MIDlet, подключая ему возможность реализовать методы стандартного интерфейса CommandListener. Зарезервированное слово implements означает, что за ним следует название подключаемого интерфейса.

Классы, которые представляются нам реализацией J2ME, объединены в пакеты, представляющие группу классов определенной тематики. Для компилятора имя класса – это и название объекта, а также и название пакета, в котором он содержится. И, чтобы не писать такое имя (а оно зачастую бывает длинным) можно просто импортировать класс с помощью оператора import. Синтаксис оператора следующий:
import имя_пакета.имя_класса;

Можно импортировать сразу все классы, содержащиеся в пакете. Для этого имя определенного класса нужно заменить символом *:
import имя_пакета.*;

А так это будет выглядеть, если импортировать основной класс мобильного приложения MIDlet:
import javax.microedition.midlet.MIDlet;


Структура программы
Вот вы и познакомились с синтаксисом языка, и пришло время написать минимальное приложение. Для этого вам понадобиться некоторое программное обеспечение (минимум: исполняющая среда разработчика – J2SE SDK, набор средств для разработки java-приложений — J2ME WTK, любой текстовый редактор; существуют и специальные IDE, но это уже тема отдельной статьи, и если вас это интересует, то загляните в раздел “Полезные ссылки и т.п.” чуть ниже) и написать код программы на языке J2ME.

Первое осталось за пределами данной статьи, а вот вторым (написанием кода) мы сейчас займемся.

Немного терминологии. Мидлет(MIDlet) – приложение Java, которое использует профайл MIDP (Mobile Information Device Profile) и конфигурацию CLDC (Connected Limited Device Configuration). В подробности вдаваться не будем. Само по себе название MIDlet произошло от основного класса мобильного приложения javax.microedition.midlet.MIDlet.

Основной класс всех мобильных приложений должен быть унаследован от абстрактного MIDlet и содержать описание его методов startApp(), pauseApp(), destroyApp(boolean unconditional) – эти три основных метода и отвечают за контроль над состоянием приложения.

Перейдем к практике, т.е. напишем исходный код нашего мобильного приложения.
// Импортируем основной класс MIDlet
import javax.microedition.midlet.MIDlet;
// Наследуем свой собственный класс SuperMIDlet от MIDlet
public class SuperMidlet extends MIDlet
{
         // Первый абстрактный метод, вызываемый при переходе приложения в приостановленное состояние
         public void pauseApp()
         {
         }
         // Второй абстрактный аргумент, который вызывается при переходе приложения в прерванное состояние.
         public void destroyApp(boolean flag)
         {
                 // Информируем систему о переходе в прерванное состояние - необязательно
                 notifyDestroyed();
         }
         // Третий абстрактный метод, вызывается при переходе в активное состояние из приостановленного или в начале работы мидлета
         public void startApp()
         {
         }
}

Думаю вопросов возникнуть не должно, т.к. код неплохо закомментирован. Напомню лишь то, что наследуемый класс от MIDlet обязан содержать реализацию трех абстрактных методов. Они могут быть пустыми, но присутствовать в классе должны.

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

Итоги
На этом краткий экскурс в синтаксис языка J2ME окончен. Теперь можете со спокойной душой “выкачивать” много-мегабайтное программное обеспечение, покупать книжечки для дальнейшего обучения и быть уверенными, что в них вы не “заблудитесь”.

Полезные ссылки
  • www.java.sun.com – сайт компании Sun Microsystems. Отсюда можно скачать J2SE SDK и J2ME WTK
  • Буткевич Е. “Пишем программы и игры для сотовых телефонов”
  • www.mirgames.ru/articles/mobile/j2me.html — статья по разработке игр на J2ME с использованием NetBeans IDE
01.03.07 00:07