Saludos,
Lo primero a explicar es que Java es más que un lenguaje, ya que hay diferentes partes como son la maquina virtual donde se ejecuta (JVM), el lenguaje de mismo nombre, las librerias, las extensiones estandar etc.
Entonces, dado que obviamente existen distintos tipos de programas para afrontar distintos problemas (no es lo mismo programar un microondas, que un sitio web, que una aplicacion de escritorio de facturacion...) existen diferentes "conjuntos" de Java para afrontar esos tipos distintos de programas.
J2ME (de Micro Edition) es para programar dispositivos pequeños con capacidades limitadas (memoria disponible, graficos, espacio...) y se usa cuando se programan, por ejemplo, telefonos moviles, PDAs... Tiene además algunas capacidades recortadas y se ejecuta sobre unas JVM especiales.
J2EE (de Enterprise Edition) es para programar aplicaciones multi-capa y se supone que a nivel empresarial. Se ejecuta sobre una JVM normal y basicamente lo que hace es definir una serie de librerias y extensiones estandar que los servidores de aplicaciones deben proveer para que puedas hacer programas "gordos".
J2SE (de Standard Edition) es el nucleo basico: el lenguaje Java y las extensiones básicas que se supone que casi todos los programas "normales" podrían usar (JDBC, Swing, comunicaciones...).
En el caso de J2EE y J2SE la programacion es practicamente la misma y se diferencia en las librerias que tienes a tu disposicion sin hacer nada. J2EE tiene más pero en cambio los servidores son mas "pesados", con J2SE tambien puedes hacer programas "empresariales" pero te tienes que buscar la vida con las librerias tu.
En cambio J2ME es diferente ya que al ir sobre una JVM distinta y tener restricciones en el lenguaje, pues hay cosas que cambian. Aunque el lenguaje en si es el mismo, a nivel sintaxis, te puedes encontrar que no haya ficheros (File) o que esten representados de otra forma, etc. Esto es normal ya que un movil no tiene raton, ni sistema de ficheros como un PC etc.
Mas o menos así sería una mini-introducción. Tampoco te obsesiones con entenderlo todo de golpe por que no podrás, hay un monton de cosas en Java y no hay que intentar saberlo todo por que el cerebro no da para tanto ;). Quiero decir que con eso no se acaba, ya que hay Java para tiempo real, programacion de dispositivos aun más reducidos (JavaCard)...
Paso a paso que el camino se hace andando
.
S!