Documente Academic
Documente Profesional
Documente Cultură
Caractersticas del
Lenguaje Java
Lenguaje Java
Java API
Plataforma:
En
Informtica,
una
plataforma es un sistema
que sirve como base para
hacer
funcionar
determinados mdulos de
hardware o de software
con los que es compatible.
Dicho
sistema
est
definido por un estndar
alrededor del cual se
determina
una
arquitectura de hardware y
una
plataforma
de
software
(incluyendo
entornos de aplicaciones).
Al definir plataformas se
establecen los tipos de
arquitectura,
sistema
operativo, lenguaje de
programacin o interfaz de
usuario
compatibles.
(Wikipedia, 2013)
Plataforma
Java
Plataforma de Hardware
MiAplicacion.java
El compilador se encarga de
generar los archivos binarios a partir
de los archivos fuentes
Compilador
javac
MiAplicacion.class
Mquina Virtual
Java
Mi Aplicacin
JVM
La JVM se encarga de
interpretar las instrucciones de
los archivos binarios
Archivo binario
(.class)
JVM
JVM
JVM
(Win32)
(Unix)
(Mac OS)
Win32
UNIX
Mac OS
Este esquema permite que por medio de distintas Mquinas Virtuales Java,
una misma aplicacin sea posible de ejecutar sobre distintas plataformas.
Codificacin
Comenzaremos con la codificacin de un programa que muestre en pantalla
el siguiente mensaje:
Este es mi primer programa Java
Para ello abriremos un editor de texto plano (si utiliza Microsoft Windows
como sistema operativo puede utilizar el programa Notepad) y en un nuevo
archivo escribiremos el siguiente cdigo:
public class MiPrograma
{
public static void main(String[] args)
{
System.out.println("Este es mi primer programa Java");
}
}
Compilacin
El paso siguiente que debemos realizar es compilar el archivo fuente.
Para ello abrimos la consola de smbolo del sistema (Inicio Ejecutar
cmd) y nos ubicamos en el directorio en donde hemos guardado el archivo
fuente MiPrograma.java. A modo de ejemplo, vamos a suponer que el
archivo MiPrograma.java se encuentra en el directorio C:\POO. Desde
dicha ubicacin ejecutaremos el compilador de java (javac.exe) y le
indicaremos el archivo fuente que debe compilar. El compilador javac.exe
se encuentra en el directorio bin de la JDK y este ltimo se encuentra en
el directorio de instalacin que hemos designado en el momento de instalar
la JDK.
El comando a ejecutar para realizar la compilacin del archivo fuente
MiPrograma.java es el siguiente:
"c:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" MiPrograma.java
Eclipse
NetBeans
JDeveloper
MyEclipse
JBuilder
JCreator
BlueJ
Una vez que tenemos el proyecto creado, el siguiente paso es crear una clase
que contendr el mtodo main. Recordemos que este mtodo es el punto
de ejecucin de una aplicacin Java.
Para crear una nueva clase, apretamos botn derecho en el contenedor
Paquetes de fuentes, seleccionamos Nuevo, Clase Java y en la nueva
ventana debemos colocar un nombre para nuestra nueva clase. El nombre
que definiremos ser MiPrograma. Una vez definida el nombre de la
clase, apretamos el botn Terminar.
2.2- Sintaxis
2.2.1- Identificadores
En el lenguaje de programacin Java, todos los componentes como clases,
variables y mtodos necesitan de un nombre que los identifiquen. En
Java, estos nombres se denominan identificadores. Un identificador est
constituido por una secuencia de caracteres que deben obedecer ciertas
reglas.
A continuacin vamos a describir las reglas en las que el compilador se basa
para determinar si el nombre con el que hemos constituido a un
identificador es legal. Por legal entendemos todo aquello que est permitido
por el compilador, pero no siempre todo lo que est permitido es
aconsejable. Por ello, tambin indicaremos algunos consejos en el momento
de usar identificadores.
Tcnicamente, un identificador debe obedecer las siguientes reglas:
-
abstract
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
extends
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while
assert
enum
2.2.3- Comentarios
Una aplicacin Java puede ser documentada mediante la insercin de
comentarios en algunos sectores relevantes del cdigo fuente. El
propsito de estos comentarios es el de mantener documentada la
aplicacin para facilitar el entendimiento de la misma. Estos comentarios
son ignorados por el compilador.
Los tipos de comentarios que existen son los siguientes:
1) Comentario de nica lnea: se indica mediante los caracteres //
Ejemplo:
public class MiPrograma
{
// Este es un comentario de una nica lnea
public static void main(String[] args)
{
System.out.println("Este es mi primer
programa Java");
}
}
Todo lo que est escrito a la derecha de los caracteres // es ignorado
por el compilador.
identificador;
Ejemplo:
int edad;
El ejemplo se corresponde con la declaracin de una variable cuyo tipo de
dato es un numrico entero y tiene por nombre edad.
Si tenemos varias variables del mismo tipo, es posible declararlas a todas
ellas en una misma lnea:
int edad, peso, numero;
En este caso se declaran tres variables numricas enteras. Esta lnea es
equivalente a declarar las tres variables en lneas separadas:
int edad;
int peso;
int numero;
Tambin se puede asignar un valor a la variable en la misma lnea de la
declaracin:
int edad = 25;
int a, b, c = 10;
int d=128, e,f=15;
La variable edad tiene como valor asignado al nmero 25.
Las variables a, b y c tienen como valor asignado al nmero 10.
La variable d tiene como valor asignado al nmero 128.
La variable e y f tienen como valor asignado al nmero 15.
2.2.5- Separadores
El uso de separadores en Java ayuda a definir y organizar la
estructura del cdigo del programa. A continuacin se listan los
separadores de cdigo usados en Java y el propsito de cada uno de ellos:
Separador
Propsito
Encierra argumentos en la definicin de mtodos y tambin
en las llamadas de los mismos.
( )
{ }
[ ]
En esta seccin nos ocuparemos de los tipos de datos primitivos. Estos tipos
de datos manejan los tipos de informacin ms habituales.
En Java, los tipos primitivos se pueden dividir en cuatro categoras:
-
Cada tipo primitivo define un rango de valores que una variable puede
tener. Este rango de valores est definido por la cantidad de bits que ocupa
su almacenamiento en memoria:
Tipo
Bits
Contenido
boolean
false, true
char
16
Caracteres Unicode
byte
-128 a 127
short
16
-32768 a 32767
int
32
-231 a 231 -1
long
64
-9 * 1018 a 9 * 1018 -1
float
32
Hasta 6 7 decimales
double
64
Hasta 14 15 decimales
Unicode:
El Estndar Unicode es un
estndar de codificacin de
caracteres diseado para
facilitar el tratamiento
informtico, transmisin y
visualizacin de textos de
mltiples
lenguajes
y
disciplinas
tcnicas
adems de textos clsicos
de lenguas muertas. El
trmino Unicode proviene
de los tres objetivos
perseguidos:
universalidad,
uniformidad y unicidad.
(Wikipedia, 2013)
Y el resultado es:
Variables char
char: a
char: @
Ejemplo:
package principal;
public class TipoString
{
public static void main(String args[])
{
String variable_String1 = "En este ejemplo se
muestra\nuna cadena de caracteres con un salto de
lnea";
System.out.println(variable_String1);
String saltoDeLinea = "\n";
System.out.println(saltoDeLinea);
String variable_String2 = "Materia:\tProgramacin
Orientada a Objetos";
System.out.println(variable_String2);
String variable_String3 = "Ejemplo:\tCadena de
caracteres con tabulacin";
System.out.println(variable_String3);
}
}
El resultado es el siguiente:
En este ejemplo se muestra
una cadena de caracteres con un salto de lnea
Materia:
Ejemplo:
Operadores aritmticos
Los siguientes operadores son considerados aritmticos:
Suma (+)
Resta (-)
Multiplicacin (*)
Divisin (/)
Resto de la divisin (%)
Ejemplo:
package principal;
public class Aritmeticos {
public static void main(String[] args) {
int a = 10;
int b = 2;
int suma = a + b;
System.out.println("Suma: a + b = " + suma);
int resta = a - b;
System.out.println("Resta: a - b = " + resta);
int multiplicacion = a * b;
System.out.println("Multiplicacin: a * b = " +
multiplicacion);
int division = a / b;
System.out.println("Divisin: a / b = " +
division);
int resto = a % b;
System.out.println("Resto: a % b = " + resto);
}
}
El resultado es:
Suma: a + b = 12
Resta: a - b = 8
Multiplicacin: a * b = 20
Divisin: a / b = 5
Resto: a % b = 0
Operadores de asignacin
Asignan un valor a una variable. El operador por excelencia de
asignacin es el operador igual (=).
Existen otros operadores de asignacin que tienen por objetivo abreviar la
combinacin de operaciones y la asignacin del resultado en una variable.
Cualquier expresin de la forma
variable = variable operador expresin
es equivalente a
variable operador = expresin
a /= b; // Operacin equivalente: a = a / b;
System.out.println("a /= b. El valor de a es " + a);
a %= b; // Operacin equivalente: a = a % b;
System.out.println("a %= b. El valor de a es " + a);
}
}
El resultado es:
El valor de a es: 10
El valor de b es: 2
a += b. El valor de a
a -= b. El valor de a
a *= b. El valor de a
a /= b. El valor de a
a %= b. El valor de a
es
es
es
es
es
12
10
20
10
0
Operadores incrementales
Incremento (++): incrementa en una unidad el valor de una
variable.
Decremento (--): decrementa en una unidad el valor de una
variable.
Estos operadores se pueden usar de dos formas:
Precediendo a la variable: primero se incrementa o decrementa
en una unidad la variable, y el resultado es utilizado en la expresin.
Ejemplo:
package principal;
public class PreIncrementales {
public static void main(String[] args) {
int a = 5;
int b = ++a; // Operacin equivalente: b = a + 1
System.out.println("b = ++a. El valor de b es "
+ b);
int c = --a; // Operacin equivalente: b = a - 1
System.out.println("c = --a. El valor de c es "
+ c);
}
}
El resultado de la ejecucin es:
b = ++a. El valor de b es 6
c = --a. El valor de c es 5
Seguido a la variable: primero se utiliza el valor original de la
variable en la expresin y luego se realiza el incremento de la
variable.
Ejemplo:
package principal;
public class PostIncrementales {
public static void main(String[] args) {
int a = 5;
int b = a++; // Operacin equivalente: b = a;
a++;
System.out.println("b = a++. El valor de b es
" + b);
Operadores relacionales
Este tipo de operadores son utilizados para realizar comparaciones
entre expresiones. La aplicacin de estos operadores produce como
resultado un valor booleano que indica el cumplimiento o no de la
comparacin.
Ejemplo:
package principal;
public class Relacionales {
public static void main(String[] args) {
int a = 10;
int b = 5;
System.out.println("El valor de a es " + a);
System.out.println("El valor de b es " + b);
System.out.println("Operador
" + (a > b));
System.out.println("Operador
que b?: " + (a >= b));
System.out.println("Operador
" + (a < b));
System.out.println("Operador
que b?: " + (a < b));
System.out.println("Operador
+ (a == b));
System.out.println("Operador
b?: " + (a != b));
}
El resultado es:
El valor
El valor
Operador
Operador
Operador
Operador
Operador
Operador
de a es 10
de b es 5
> Es a mayor que b?: true
>= Es a mayor o igual que b?: true
< Es a menor que b?: false
<= Es a menor o igual que b?: false
== Es a igual a b?: false
!= Es a distinto a b?: true
Operadores lgicos
Estos operadores son utilizados para evaluar el valor lgico de una
expresin. Generalmente, estos tipos de operadores son utilizados cuando
es necesario evaluar una expresin para tomar una decisin.
Operador
Nombre
Utilizacin
&
AND
a&b
OR
a|b
&&
Short AND
a && b
||
Short OR
a|b
Negacin
!b
Resultado
Devuelve true si a y b
valen true.
Si a b valen false,
entonces el operador devuelve
false.
Devuelve true si a b
valen true.
Si a y b valen false,
entonces el operador devuelve
false.
Devuelve true si a y b
valen true.
Si a b valen false,
entonces el operador devuelve
false.
Si a vale false, entonces b
no es evaluado ya que
cualquiera sea el valor de b,
el resultado del operador es
false.
Devuelve true si a b
valen true.
Si a y b valen false,
entonces el operador devuelve
false.
Si a vale true, entonces b
no es evaluado ya que
cualquiera sea el valor de b,
el resultado del operador es
true.
Devuelve true si b es
false.
Devuelve false si b es
true.
package principal;
public class Logicos {
public static void main(String[] args) {
int a = 10;
int b = 5;
boolean c = true;
boolean d = false;
System.out.println("El
System.out.println("El
System.out.println("El
System.out.println("El
valor
valor
valor
valor
de
de
de
de
a
b
c
d
es:
es:
es:
es:
"
"
"
"
+
+
+
+
a);
b);
c);
d);
Operador instanceof
Este operador es utilizado para saber si un objeto es una instancia o no
de una determinada clase. En caso de que el objeto pertenezca a la
clase, el operador devuelve true. En caso contrario devuelve false.
Ejemplo:
package principal;
public class OperadorInstanceof {
public static void main(String[] args) {
String a = "Operador instanceof";
System.out.println("a instanceof String = " +
(a instanceof String));
}
}
El resultado es el siguiente:
a instanceof String = true
Operador condicional
Este operador es utilizado para realizar bifurcaciones condicionales de
acuerdo al valor de una expresin. Su formato es el siguiente:
expresin lgica ? sentencia true : sentencia false
Este operador evala el valor de la expresin lgica y si devuelve true,
entonces se ejecuta la primera sentencia (sentencia true) y en caso de que la
expresin lgica devuelva false, entonces se ejecuta la segunda sentencia
(sentencia false).
Ejemplo:
package principal;
public class OperadorCondicional {
public static void main(String[] args) {
int a = 10;
int b = 5;
String resultado = (a < b) ? "a es menor que b" :
"a es mayor que b";
System.out.println(resultado);
}
}
El resultado es el siguiente:
a es mayor que b
Tipo de
operador
Operador
Operadores
posfijos
Operadores
unarios
Creacin o
conversin
Multiplicacin
* / %
Suma
+ -
Desplazamiento
Comparacin
Igualdad
AND a nivel de
bit
&
OR a nivel de
bit
XOR a nivel de
bit
AND lgico
&&
OR lgico
||
Condicional
?:
Asignacin
resultado =
10 + 20 / 2 - 5 % 2
10
1
19
1
14
Sentencias condicionales
Las estructuras de control condicionales son utilizadas para ejecutar un
conjunto de sentencias si se cumple una condicin en particular. La
condicin que se evala debe devolver un resultado lgico (boolean).
Condicional simple
Tiene la siguiente estructura:
if (expresin lgica)
{
sentencias condicionales
}
Si el valor de la expresin lgica se es true, entonces se ejecuta el cdigo
que se encuentra entre llaves.
Si el valor de la expresin lgica se es false, entonces el cdigo que se
encuentra entre llaves no se ejecuta.
Ejemplo:
package principal;
public class CondicionalSimple {
public static void main(String[] args) {
int a = 10;
if (a > 5)
{
System.out.println("La variable a es mayor que 5");
}
}
}
El resultado de la ejecucin es:
La variable a es mayor que 5
Si el bloque de cdigo entre llaves se compone de una nica sentencia a
ejecutar entonces se pueden obviar las llaves del bloque de cdigo:
Ejemplo:
package principal;
public class CondicionalSimple {
public static void main(String[] args) {
int a = 10;
if (a > 5)
System.out.println("La variable a es mayor que
5");
}
}
El resultado de la ejecucin sigue siendo el mismo al del ejemplo anterior:
La variable a es mayor que 5
Condicional doble
El cumplimiento de una condicin simple permite ejecutar un conjunto de
secuencias, pero muchas veces puede ser deseable ejecutar otro conjunto de
sentencias en caso de que la condicin no se cumpla. En dichos casos se
aplica el condicional doble. Su estructura es la siguiente:
Ejemplo:
if (expresin lgica)
{
Condicional mltiple
Este tipo de condicional es utilizado cuando se desea evaluar varias
condiciones. Se evala la primera condicin, en caso de que no se cumpla,
se evala la siguiente y as sucesivamente hasta evaluar todas las
condiciones. Su estructura es la siguiente:
if (expresin lgica)
{
Sentencias condicionales a ejecutar en caso de que
la expresin lgica sea verdadera (true)
}
else if (expresin lgica)
{
Sentencias condicionales a ejecutar en caso de que
la expresin lgica sea verdadera (true)
}
else if (expresin lgica)
{
Sentencias condicionales a ejecutar en caso de que
la expresin lgica sea verdadera (true)
}
.
.
.
else
{
Sentencias condicionales a ejecutar en caso de que
ninguna de las condiciones anteriores se haya
cumplido.
}
El bloque de cdigo else es opcional. Se aplica en el caso de que se quiera
ejecutar un bloque de sentencias en el caso de que ninguna de las
condiciones se haya cumplido.
Ejemplo:
package principal;
public class CondicionalMultiple {
public static void main(String[] args) {
int a = 6;
if (a > 10)
{
System.out.println("La variable a es mayor que
10");
}
else if (a > 8)
{
System.out.println("La variable a es mayor que
que 8");
}
else if (a > 5)
{
System.out.println("La variable a es mayor que
5");
}
else
{
System.out.println("La variable a es menor o
igual que 5");
}
}
}
Switch
Las sentencias if y switch hacen referencia a sentencias que ayudan a
tomar una decisin. Cuando estamos usando estructuras condicionales de
control de flujo, lo que estamos haciendo es indicarle al compilador que
evale una condicin para determinar qu bloque de cdigo se debe
ejecutar.
El uso de la sentencia switch permite simular el uso de mltiples
condicionales. Analicemos el siguiente cdigo en donde se hace uso de
condicionales mltiples:
package principal;
public class CondicionalMultiple {
public static void main(String[] args) {
int a = 1;
if (a == 3)
{
System.out.println("El valor de a es 3");
}
else if (a == 2)
{
System.out.println("El valor de a es 2");
}
else if (a == 1)
{
System.out.println("El valor de a es 1");
}
else
{
System.out.println("La variable a tiene un valor
desconocido");
}
}
}
El uso de condicionales mltiples en el cdigo anterior podra ser reescrito
de la siguiente manera:
package principal;
public class CondicionalSwitch {
public static void main(String[] args) {
int a = 1;
switch (a)
{
case 3:
System.out.println("El valor de a es 3");
break;
case 2:
System.out.println("El valor de a es 2");
break;
case 1:
System.out.println("El valor de a es 1");
break;
default:
System.out.println("La variable a tiene
valor desconocido");
}
}
un
}
El resultado de la ejecucin es el siguiente:
El valor de a es 1
El uso de palabra clave break le indica al compilador que desestime el
resto de las condiciones case. Si no hiciramos uso de la sentencia break
el compilador ejecutara el resto de las condiciones en cascada. Lo veamos
en el siguiente ejemplo:
package principal;
public class CondicionalSwitch {
public static void main(String[] args) {
int a = 2;
switch (a)
{
case 3:
System.out.println("El valor de a es 3");
case 2:
System.out.println("El valor de a es 2");
case 1:
System.out.println("El valor de a es 1");
default:
System.out.println("La variable a tiene
valor desconocido");
}
}
un
}
El resultado de la ejecucin es el siguiente:
El valor de a es 2
El valor de a es 1
La variable a tiene un valor desconocido
Como podemos ver, la condicin en la que la variable a es igual a 2 se
cumpli, razn por la cual se ejecut la sentencia correspondiente a dicha
condicin. Pero tambin se ejecutaron el resto de las condiciones que se
encuentran por debajo de sta en cascada, motivo por el cual es importante
saber cundo incluir la sentencia break en el uso del condicional switch.
La sentencia switch es utilizada para seleccionar entre varias sentencias
de acuerdo al valor de cierta expresin.
La sentencia default es opcional y la misma se aplica en el caso de que
ninguna de las condiciones anteriores se haya cumplido.
Sentencias iterativas
Las sentencias iterativas son utilizadas para ejecutar un proceso o un
conjunto de sentencias repetidas veces.
While
La sentencia while es utilizada para ejecutar un bloque de cdigo en
forma sucesiva mientras se cumpla una condicin. Esta sentencia tiene la
siguiente estructura:
while (expresin booleana)
{
Sentencias que se ejecutan mientras se cumpla la
condicin
}
Ejemplo:
package principal;
public class IteracionWhile {
For
Este ciclo es similar al ciclo while pero puede resultar ms sencillo de
utilizar en aquellos escenarios en donde estemos realizando conteos o
indexaciones. Este ciclo combina inicializacin de variables,
evaluacin de condiciones e incremento de las variables. Su
estructura es la siguiente:
for (inicializacin; condicin; incremento)
{
Sentencias
}
Veamos un ejemplo para entender mejor esta sentencia iterativa:
package principal;
public class IteracionFor {
public static void main(String[] args) {
for (int a=1 ; a<3 ; a++) {
System.out.println("El valor de a es: " + a);
}
}
}
El resultado de la ejecucin es:
El valor de a es: 1
El valor de a es: 2
En el momento que el compilador lee la sentencia for esto es lo que
sucede:
-
Estos pasos son repetidos hasta que la condicin del ciclo (a < 3) no
se cumpla.
un
nmero
para
Aplicacin 3:
La siguiente aplicacin integra las aplicaciones 1 y 2. El usuario debe
seleccionar qu operacin desea ejecutar de acuerdo a un listado de
operaciones.
package principal;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class SeleccionOperacion {
public static void main(String[] args) throws
IOException {
System.out.println("PROGRAMACIN ORIENTADA A
OBJETOS");
System.out.println("Operaciones");
System.out.println("A. Recoleccin de
datos");
System.out.println("B. Clculo de
potencias");
System.out.println("C. Salir");
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
char opcion;
do
{
System.out.println("Seleccione una
opcin (A, B, C): ");
opcion = (char) System.in.read();
System.out.println("Opcin seleccionada:
" + opcion);
System.in.read(); // Se elimina del
buffer de entrada el caracter <Enter>
switch (opcion)
{
case 'A':
System.out.println("INGRESO DE
DATOS");
System.out.println("Ingrese su
nombre: ");
String nombre = br.readLine();
System.out.println("Ingrese su
apellido: ");
String apellido = br.readLine();
System.out.println("Ingrese su
edad: ");
String edad = br.readLine();
System.out.println("Usted ha
ingresado los siguientes datos:");
System.out.println("Nombre: " +
nombre);
System.out.println("Apellido: "
+ apellido);
System.out.println("Edad: " +
edad);
break;
case 'B':
System.out.println("CLCULO DE
POTENCIAS");
System.out.println("Ingrese un
nmero para calcular su potencia: ");
int base =
Integer.parseInt(br.readLine());
System.out.println("Ingrese el
lmite mximo de potencia: ");
int limite =
Integer.parseInt(br.readLine());
System.out.println("Potencias
sucesivas del nmero " + base +
" hasta alcanzar el lmite "
+ limite);
int potencia = base;
while (potencia <= limite) {
System.out.println("\t" +
potencia);
potencia = potencia * base;
}
break;
case 'C':
System.out.println("Saliendo de
la aplicacin");
break;
default:
System.out.println("Opcin
ingresada incorrecta.");
}
}
while (opcion != 'A' && opcion != 'B' &&
opcion != 'C');
}
}
Bibliografa Lectura 3
Sierra Kathy, Bates Bert, (2008), SCJP Sun Certified Programmer for Java 6
Study Guide (Exam 310-065), EE.UU, Editorial McGraw-Hill.
Gosling James, McGilton Henry, (1996), The Java Language Environment,
EE.UU.
Bruce Eckel, (2006), Thinking in Java (4a ed.), EE.UU, Editorial Prentice Hall.
Wikipedia, (2013), Plataforma (informtica), Recuperado el 14/06/2011 de
http://es.wikipedia.org/wiki/Plataforma_%28inform%C3%A1tica%29
Wikipedia, (2013), Mquina virtual Java, Recuperado el 14/06/2011 de
http://es.wikipedia.org/wiki/M%C3%A1quina_virtual_Java
Wikipedia, (2013), Unicode, Recuperado el 14/06/2011 de
http://es.wikipedia.org/wiki/Unicode
The Java Tutorials (Oracle), (2011), Learning the Java Language,
Recuperado el 14/06/2011 de
http://download.oracle.com/javase/tutorial/java/TOC.html