目前,Java语言被Sun分成了3块:

J2SE(Java 2 Standard Edition,Java 2标准版),
J2EE(Java 2 Platform, Enterprise Edition,Java 2企业版),
J2ME(Java 2 Micro Edition, Java 2微型版)

虽然是这样,但是Sun公司最初开发Java的时候,主要是把Java运用在电子设备方面的,用来开发嵌入到电子设备的软件.而这也就是现在的J2ME.

这些电子设备包括数字机顶盒(set-top box),移动电话,个人数字助理(Personal Digital Assistant,PDA),寻呼机等等这些大家常见的小型计算设备(当然手机也包括手机了).

Java的开发者们最初开发它的动力并不是Internet,而是把它作为开发嵌入到电子设备中的软件.
这可以说就是J2ME的前身. 可以说Java的最初就是用在J2ME方面的.

当时,由于Internet更具竞争性,挑战性等原因,所以Java的开发者们改变方向,向Internet进发. 这可以说是Java能够成名的一个很重要的原因.

在这期间,小型计算设备,如移动电话,有线电视的数字机顶盒(set-top box),汽车导航系统,寻呼机, 个人数字助理(Personal Digital Assistant,PDA),智能卡(smart card)等开始有了非常大的发展.

于是乎,Java的开发者又重操旧业,重新去搞J2ME,
在Java刚出生的时候,小型计算设备市场也是刚刚发展起来.

大家最熟悉的小型计算设备应该是手机.但是你不要认为J2ME就只有手机程序设计这块.
我记得好像在Java手机程序设计这方面做的最好的是日本.

1990年12月,Sun内部由James Gosling、Patrick Naughton以及Mike Sheridan成立了一个叫做Green Team的小组.

Green Team小组的主要目标,是要发展一种新架构,而这种架构必须能够在消费性电子产品作业平台上运行,现在我们普遍认识的PDA、手机或是信息家电(IA),都是属于这种架构的目标平台.

接着,Green Team在1992年的9月3号,发表了一款由Java 技术之父 James Gosling所领军研发,名叫Star Seven(*7)的机器,研发出一部交互式的掌上型家用娱乐装置,可透过使用动画触碰式屏幕的使用者接口来控制其它电子设备.

经过了13年的时间,现在我们检视J2ME的发展历史,我们可以发现,虽然在1999年,Java被切割成J2SE、J2ME、J2EE,所以有了J2ME这个名词的出现.但是Java并非1999年开始才开始发展嵌入式系统上的应用. 其实,Java本来就是为了嵌入式系统而发展的一种架构.即使目前大家多半将Java的应用聚焦于企业上的J2EE应用.但是严格来说,J2ME才是Java真正“回归本心”的领域.

J2ME在1999年的JavaOne开发人员大会初次亮相.

J2ME(Java 2 Micro Edition)中的Micro可以翻译为微,J2ME的中文名称可以叫做Java 2微型版.

J2ME是Java API和JVM虚拟机的一个缩减版本

J2ME由3部分(或者说”J2ME体系架构由3层”) 组成.
这3部分(层)分别是
配置层(Configuration),规范层(Profile)和可选包(optional packages).

J2ME配置

连接设备配置(Connected Device Configuration,CDC)
连接有限设备配置(Connected Limited Device Configuration,CLDC)

J2ME Profile

Profile是由特定小型计算设备或某一种类的小型计算设备实现功能的Java类组成的.
Sun共定义了7种profile:
Foundation Profile     
供CDC配置使用.
JSR为219,
点击以下链接即可查看:
http://java.sun.com/javame/reference/apis/jsr219/

Game Profile

对应WTK安装目录中的 Mobile Information Device Profile(MIDP) 最新的是MIDP 2.0, JSR(JSR的英文全称是Java Specification Request,它应该是起编号之类的作用吧!Java的规范太多了)为118

PDA Porfile

Personal Profile JSR为216,
点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr216/

Personal  Basis Profile
JSR为217, 点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr217/

RMI Profile
JSR为66
点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr066/

Profile这个单词可以理解为规范.

Optional Packages(可选包)
Bluetooth这个英文单词实际上是2个单词结合后形成的,
blue是蓝色的意思,而tooth,你可以去查一下,是牙齿的意思.
所以这个单词的意思就是蓝牙.

关于Bluetooth,Sun公司有一个API,它的JSR是82
其实也只有一个叫javax.bluetooth的包而已.
点击以下链接即可查看
http://java.sun.com/javame/reference/apis/jsr082/

关于智能卡,Sun公司有一个规范(Specification), 这个规范的最新版本是v2.2.2
Java Card(TM) 2.2.2 FR Specification

我们平时所编写的J2ME程序就是基于这3层的.
初学J2ME,使用的配置层是CLDC(目前最新的是CLDC 1.1),
规范层是MIDP(是上面提到的7个profile之一),
关于Bluetooth和智能卡(smart card)应该就是可选包.
初学J2ME主要用到的一个开发工具是WTK(J2ME Wireless Toolkit,目前最新的版本是2.2).当然还有JVM(Java Virtual Machine),要不然这个WTK怎么安装、使用啊!
请记住,Java是在JVM中运行的(正因为这样,Java才能实现可移植性和Write Once,Run Anywhere:一编写一次,到处运行).
 
当你决定编写第一个J2ME程序时,你创建了一个类叫BasicMIDlet,这个类必须继承javax.microedition.midlet.MIDlet类.原因很简单,因为要启动MIDlet(其实是启动你自己创建的MIDlet,也就是BasicMIDlet)需要用到一个startApp()方法.而暂停MIDlet使用的是pauseApp()方法.终止MIDlet则使用的是destroyApp(boolean arg0)方法.
这3个方法是在MIDlet类中的.
例1    第一个J2ME程序

import javax.microedition.midlet.MIDlet;
public class BasicMIDlet extends MIDlet {
    public void startApp() {

    }

    public void pauseApp() {

    }

    public void destroyApp(boolean arg0) {

    }
}
注意一下, startApp()和destroyApp(boolean arg0)方法有可能会抛出javax.microedition.midlet. MIDletStateChangeException异常.

J2ME的用户界面设计不同于一般的AWT或Swing,
因为J2ME所面对的一个事实是小型计算设备的资源是非常有限的.CLDC设备的内存只有128~512KB.
Swing还有一点就是它占用了太多的内存了.根本不适合这些小型计算设备.
J2ME的用户界面设计由javax.microedition.lcdui包和javax.microedition.lcdui.game包负责的
(这2个包是在MIDP中的).
javax.microedition.lcdui.game包针对的是游戏用户界面.是用在J2ME游戏设计方面的.

lcdui的全称是liquid crystal display user interface (LCD UI),中文意思就是"液晶显示用户界面".

javax.microedition.lcdui包可以分为2个部分:高层显示Screen和和低层显示Canvas
不过它们都是javax.microedition.lcdui.Displayable(它的父类是Display)的子类.
但是无论是高层还是低层显示,要让它能够在显示设备中显示出来,需要2步.

第一,创建Display类的实例(也就是创建对象).
Display对象的创建方法是Display.getDisplay(MIDlet midlet);
当您创建自己的J2ME类时,都必须继承javax.microedition.midlet.MIDlet类,所以上面的方法也可以写成Display.getDisplay(this);
this是对象引用,引用的是你自己创建的类.

第二,使用setCurrent(Displayable displayable)方法
这个方法是在Display类中的,所以只有创建Display对象才能调用这个方法.

例2   

public class TextBoxMIDlet extends MIDlet {
    private TextBox textbox;
    public void startApp() {
        Display display = Display.getDisplay(this);
        textbox = new TextBox("Hello World", "My first MIDlet", 40, 0);
        display.setCurrent(textbox);
    }

    public void pauseApp() {

    }

    public void destroyApp(boolean arg0) {

    }

}
你是否会有疑惑,这上面这段代码中setCurrent()中的参数不是Displayable类的引用.Why?
原因很简单,因为TextBox(它的父类是Screen)是Displayable的间接子类
你会发现一点, pauseApp()和destroyApp(boolean arg0)方法都是空的.事实这两个方法可以为空.