Tutorial de Java

Introducción al Lenguaje Java

Anterior | Siguiente
  1. Comentarios
  2. Identificadores
  3. Literales
  4. Separadores
  5. Operadores
  6. Variables
  7. Expresiones
  8. Arrays
  9. Strings
  10. Control de Flujo
  11. Almacenamiento de Datos

Ahora que ya se ha visto a grandes rasgos lo que Java puede ofrecer, y tras la generación del primer código Java, se supone que el gusanillo de comenzar con Java ya estará muerto, así que ahora se trata de echar un vistazo al lenguaje en sí. En el aprendizaje de todo lenguaje de programación, el primer paso suele ser entrar en conocimiento de los conceptos fundamentales, como son las variables, los tipos de datos, expresiones, flujo de control, etc. Por ello, durante varias secciones se estudiarán de estos conceptos. Lo básico resultará muy familiar a quienes tengan conocimientos de C/C++. Los programadores con experiencia en otros lenguajes procedurales reconocerán la mayor parte de las construcciones. Es de esperar que este capítulo no resulte muy intenso, no obstante, sí debe estar presente, porque más de una vez habrá que recurrir a él como referencia. En posteriores capítulos se profundizará sobre aspectos por los que aquí se pasa de puntillas y se presentarán ejemplos de código de cada uno de esos aspectos de la programación en Java.

Cuando se programa en Java, se coloca todo el código en métodos, de la misma forma que se escriben funciones en lenguajes como C.

Comentarios

En Java hay tres tipos de comentarios:

// comentarios para una sola línea 

/* 
 comentarios de una o más líneas 
*/ 

/** comentario de documentación, de una o más líneas 
 */

Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentación, colocados inmediatamente antes de una declaración (de variable o función), indican que ese comentario ha de ser colocado en la documentación que se genera automáticamente cuando se utiliza la herramienta de Java, javadoc, no disponible en otros lenguajes de programación. Dichos comentarios sirven como descripción del elemento declarado permitiendo generar una documentación de las clases que se va construyendo al mismo tiempo que se genera el código de la aplicación.

En este tipo de comentario para documentación, se permite la introducción de algunos tokens o palabras clave, que harán que la información que les sigue aparezca de forma diferente al resto, permitiendo la incorporación de información útil, que luego se podrá ver en formato html sobre cualquier navegador. Aunque posteriormente se verán en detalle las palabras clave que soporta javadoc, hay que tener en cuenta a la hora de utilizar este tipo de comentarios, que javadoc solamente procesará la documentación para miembros public y protected, los comentarios para miembros private y friendly, que se verán en secciones posteriores, serán ignorados (aunque se puede utilizar el parámetro -private para incluir los miembros privados en la salida). Esto tiene bastante sentido, ya que solamente los miembros public y protected están disponibles fuera del fichero, que es el punto de vista del programador externo que utiliza la documentación. Sin embargo, todos los comentarios que se incluyan en class figurarán en la salida.

El JDK 1.2 permite la creación de doclets, que son pequeñas aplicaciones que la herramienta javadoc puede ejecutar para generar cualquier tipo de documentación especial que se desee. No obstante, la salida estándar es un fichero html con el mismo formato que el resto de la documentación de Java, por lo que resulta muy fácil navegar a través de las clases. Y quizá sea el momento de ver algunos de los tokens que se pueden introducir en estos comentarios de documentación para que javadoc pueda generar la documentación del código que se está construyendo, porque la herramienta en sí no se va a estudiar en profundidad.

javadoc permite también colocar códigos o tags de html embebidos en los comentarios. Estos códigos son procesados también a la hora de generar el documento html. Esta característica permite utilizar todo el poder del lenguaje html, aunque su utilización principal es solamente para formatear un poco la salida que se genera, como por ejemplo:

/**
 * <pre>
 * System.out.println( new Date() );
 * </pre>
 */

También se puede utilizar html como en cualquier otro documento Web para formatear el texto en descripciones, como por ejemplo:

/**
 * Aquí <em>debes</em> introducir la lista:
 * <ol>
 * <li> Primer Elemento
 * <li> Segundo Elemento
 * <li> Tercer Elemento
 * </ol>
 */

Dentro de los comentarios de documentación, los asteriscos al comienzo de las líneas y los espacios hasta la primera letra no se tienen en cuenta. La salida del ejemplo anterior sería:

Aqui debes introducir la lista: 
  1. Primer Elemento 
  2. Segundo Elemento 
  3. Tercer Elemento 

javadoc lo reformatea todo para acomodarlo a las normas html. No se debería utilizar cabeceras como <h1> o separadores como <hr> ya que javadoc inserta los suyos propios y se podría interferir con ellos. Todos los tipos de documentación, sean de clases, variables o métodos, pueden soportar html embebido. Además se pueden colocar tokens específicos de javadoc, que son los que van precedidos por el símbolo @, y a continuación se van a ver los más interesantes.

@see: Referencia a otras clases

Permite referenciar a la documentación de otras clases. Se puede colocar en los tres tipos de documentación. javadoc convertirá estos tags en enlaces a la otra documentación. Las formas que se permiten colocar como referencia son:

   @see nombre-de-clase
   @see nombre-de-clase-completo
   @see nombre-de-clase-completo#nombre-de-método

Cada una de ellas añade un enlace en la entrada "See Also" de la documentación generada. Hay que tener en cuenta que javadoc no chequea los enlaces para comprobar que sean válidos.

@version: Información de la versión

Como parámetro se puede indicar cualquier información que sea relevante para la versión que se está generando. Cuando el flag -version se indica en la lista de argumentos de llamada de javadoc, esta información aparecerá especialmente resaltada en la documentación html. Se utiliza en la documentación de clases e interfaces (que se verán en secciones posteriores de este Tutorial).

@author: Información del autor

Normalmente se suele indicar el nombre del autor y su dirección de correo electrónico, aunque se puede incluir cualquier otra información relevante. Cuando se utiliza -author como argumento de javadoc, esta información aparecerá especialmente resaltada en la documentación html. Se utiliza en la documentación de clases e interfaces.

Se pueden colocar múltiples tags de este tipo para indicar una lista de autores, en cuyo caso deben estar colocados consecutivamente, ya que toda la información sobre la autoría del código se colocará en un solo párrafo de la documentación html generada.

@param: Parámetro y descripción

Se utiliza en la documentación de métodos y permite la documentación de los parámetros. El formato consiste en indicar un parámetro y en las líneas siguientes colocar la descripción, que se considera concluida cuando aparece otro tag de documentación. Se suele colocar un tag @param por cada parámetro.

@return: Descripción

Se utiliza en la documentación de métodos para indicar el significado del valor de retorno del método. La descripción se puede extender las líneas que sean necesarias.

@exception: Nombre de la clase y descripción

Las excepciones, que se verán en un capítulo posterior, son objetos que pueden ser generados por un método cuando este método falla. Aunque solamente se puede producir una excepción cuando se llama a un método, un método puede generar cualquier número de excepciones diferentes.

El nombre de la clase debe ser completo para que no haya ninguna ambigüedad con ninguna otra excepción y en la descripción se debería indicar el porqué puede aparecer esa excepción cuando se llama al método. Se utiliza en la documentación de métodos.

@deprecated

Se utiliza en la documentación de métodos para anunciar que la característica que indica el método está obsoleta. Este tag es un estímulo para que la característica sobre la que se coloca no se utilice más, ya que en un futuro puede desaparecer. Los métodos marcados con este tag hacen que el compilador genere avisos, aunque se produzca código perfectamente ejecutable.

El ejemplo java400.java, muestra la fecha del sistema cuando se ejecuta y se han colocado tags de documentación, para ser utilizados posteriormente con javadoc.

import java.util.*;

/**
 * java400.java: Ejemplo de documentacion.
 * Presenta la fecha y hora del Sistema
 * @author Agustin Froufe
 * @author froufe@arrakis.es
 * @version 1.0
 */
    
public class java400 {
   /**
    * Método principal de la aplicacion
    * @param args cadena de argumentos de llamada
    * @return No devuelve ningun valor
    * @exception excepciones No lanza ninguna
    */
    public static void main( String args[] ) {
        System.out.println( new Date() );
        }
    }

Si ahora se ejecuta javadoc sobre este fichero con el comando:

    % javadoc -version -author java400.java

se generan varios ficheros de documentación, o se actualizan si ya existían, como son los ficheros AllNames.html y packages.html, y se genera el fichero de documentación de la clase, java400.html, cuyo contenido visualizado mediante el navegador Netscape Communicator es el que reproduce la figura siguiente.

Identificadores

Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar.

En Java, un identificador comienza con una letra, un subrayado (_) o un símbolo de dólar ($). Los siguientes caracteres pueden ser letras o dígitos. Se distinguen las mayúsculas de las minúsculas y no hay una longitud máxima establecida para el identificador. La forma básica de una declaración de variable, por ejemplo, sería:

tipo identificador [ = valor][,identificador [= valor] ...];

Serían identificadores válidos:

    identificador
    nombre_usuario
    Nombre_Usuario
    _variable_del_sistema
    $transaccion

y su uso sería, por ejemplo:

    int contador_principal;
    char _lista_de_ficheros;
    float $cantidad_en_Ptas;

Palabras Clave

Las siguientes son las palabras clave que están definidas en Java y que no se pueden utilizar como identificadores:

   abstract   continue   for          new         switch
   boolean    default    goto         null        synchronized
   break      do         if           package     this
   byte       double     implements   private     threadsafe
   byvalue    else       import       protected   throw
   case       extends    instanceof   public      transient
   catch      false      int          return      true
   char       final      interface    short       try
   class      finally    long         static      void
   const      float      native       super       while

Palabras Reservadas

Además, el lenguaje se reserva unas cuantas palabras más, pero que hasta ahora no tienen un cometido específico. Son:

   cast       future     generic      inner
   operator   outer      rest         var

Literales

Un valor constante en Java se crea utilizando una representación literal de él. Java utiliza cinco tipos de elementos: enteros, reales en coma flotante, booleanos, caracteres y cadenas, que se pueden poner en cualquier lugar del código fuente de Java. Cada uno de estos literales tiene un tipo correspondiente asociado con él.

Enteros:

byte

8 bits complemento a dos

short

16 bits complemento a dos

int

32 bits complemento a dos

long

64 bits complemento a dos
Por ejemplo: 2 21 077 0xDC00
Reales en coma flotante:

float

32 bits IEEE 754

double

64 bits IEEE 754
Por ejemplo: 3.14 2e12 3.1E12
Booleanos:

true

false

Caracteres:
Por ejemplo: a \t \u???? [????] número unicode
Cadenas:
Por ejemplo: "Esto es una cadena literal"

Cuando se inserta un literal en un programa, el compilador normalmente sabe exactamente de qué tipo se trata. Sin embargo, hay ocasiones en la que el tipo es ambiguo y hay que guiar al compilador proporcionándole información adicional para indicarle exactamente de qué tipo son los caracteres que componen el literal que se va a encontrar. En el ejemplo siguiente se muestran algunos casos en que resulta imprescindible indicar al compilador el tipo de información que se le está proporcionando:

class literales {
    char c = 0xffff;    // mayor valor de char en hexadecimal
    byte b = 0x7f;      // mayor valor de byte en hexadecimal
    short s = 0x7fff;   // mayor valor de short en hexadecimal
    int i1 = 0x2f;      // hexadecimal en minúsculas
    int i2 = 0X2F;      // hexadecimal en mayúsculas
    int i3 = 0177;      // octal (un cero al principio)
    long l1 = 100L;
    long l2 = 100l;
    long l3 = 200;
    // long l4(200);    // no está permitido
    float f1 = 1;
    float f2 = 1F;
    float f3 = 1f;
    float f4 = 1e-45f;  // en base 10
    float f5 = 1e+9f;
    double d1 = 1d;
    double d2 = 1D;
    double d3 = 47e47d; // en base 10
    }

Un valor hexadecimal (base 16), que funciona con todos los tipos enteros de datos, se indica mediante un 0x o 0X seguido por 0-9 y a-f, bien en mayúsculas o minúsculas. Si se intenta inicializar una variable con un valor mayor que el que puede almacenar, el compilador generará un error. Por ejemplo, si se exceden los valores para char, byte y short que se indican en el ejemplo, el compilador automáticamente convertirá el valor a un int e indicará que se necesita un moldeo estrecho para la asignación.

Los números octales (base 8), se indican colocando un cero a la izquierda del número que se desee. No hay representación para números binarios ni en en C, ni en C++, ni en Java.

Se puede colocar un carácter al final del literal para indicar su tipo, ya sea una letra mayúscula o minúscula. L se usa para indicar un long, F significa float y una D mayúscula o minúscula es lo que se emplea para indicar que el literal es un double.

La exponenciación se indica con la letra e, tomando como referente la base 10. Es decir, que hay que realizar una traslación mental al ver estos números de tal forma que 1.3e-45f en Java, en la realidad es 1.3 x 10-45.

No es necesario indicarle nada al compilador cuando se puede conocer el tipo sin ambiguedades. Por ejemplo, en

    long l3 = 200;

no es necesario colocar la L después de 200 porque resultaría superflua. Sin embargo, en el caso:

    float f4 = 1e-45f; // en base 10

sí es necesario indicar el tipo, porque el compilador trata normalmente los números exponenciales como double, por lo tanto, si no se coloca la f final, el compilador generará un error indicando que se debe colocar un moldeador para convertir el double en float.

Cuando se realizan operaciones matemáticas o a nivel de bits con tipos de datos básicos más pequeños que int (char, byte o short), esos valores son promocionados a int antes de realizar las operaciones y el resultado es de tipo int. Si se quiere seguir teniendo el tipo de dato original, hay que colocar un moldeo, teniendo en cuenta que al pasar de un tipo de dato mayor a uno menor, es decir, al hacer un moldeo estrecho, se puede perder información. En general, el tipo más grande en una expresión es el que determina el tamaño del resultado de la expresión; si se multiplica un float por un double, el resultado será un double, y si se suma un int y un long, el resultado será un long.

Separadores

Sólo hay un par de secuencias con otros caracteres que pueden aparecer en el código Java; son los separadores simples, que van a definir la forma y función del código. Los separadores admitidos en Java son:

() - paréntesis. Para contener listas de parámetros en la definición y llamada a métodos. También se utiliza para definir precedencia en expresiones, contener expresiones para control de flujo y rodear las conversiones de tipo.

{} - llaves. Para contener los valores de matrices inicializadas automáticamente. También se utiliza para definir un bloque de código, para clases, métodos y ámbitos locales.

[] - corchetes. Para declarar tipos matriz. También se utiliza cuando se referencian valores de matriz.

; - punto y coma. Separa sentencias.

, - coma. Separa identificadores consecutivos en una declaración de variables. También se utiliza para encadenar sentencias dentro de una sentencia for.

. - punto. Para separar nombres de paquete de subpaquetes y clases. También se utiliza para separar una variable o método de una variable de referencia.

Navegador

Home | Anterior | Siguiente | Indice | Correo