G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 3: Elementos básicos del lenguaje tema_siguiente
  1. Introducción.
  2. Tipos de datos, identificadores y literales.
  3. Operadores.
  4. Sentencias.[ejercicios]

3.2- Tipos de datos, identificadores y literales

Palabras reservadas en Java
abstractbooleanbreakbytecasecatch
charclassconst*continuedefaultdo
doubleelseextendsfinalfinallyfloat
forgoto*ifimplementsimportinstanceof
intinterfacelongnativenewpackage
privateprotectedpublicreturnshortstatic
strictfp**superswitchsynchronizedthisthrow
throwstransienttryvoidvolatilewhile

Tipos

Entre los lenguajes orientados a objetos se distinguen los "puros" y los "hibridos". Los primeros presentan sólo características propias de la orientación a objetos, mientras que los segundos incluyen tambien alguna característica propia de los lenguajes "tradicionales" no orientados a objetos. Java es un lenguaje orientado a objetos "casi" puro. El único aspecto que el lenguaje conserva de los no orientados a objeto es su capacidad para manejar tipos de datos básicos (llamados en Java tipos primitivos), es decir, enteros, reales, caracteres y booleanos. La razón de esta inclusión de características no orientadas a objeto se encuentra en el hecho de que la adecuación de los elementos clásicos a las estructuras propias de la orientación a objeto es computacionalmente costosa y en el caso de los tipos de datos utilizados frecuentemente en expresiones resultaría altamente ineficaz.

Esta capacidad de manejo de datos primitivos es una capacidad propia de JVM, dado que los tipos disponibles en el lenguaje son los que maneja el procesador de la JVM. De hecho, la JVM sólo maneja dos tipos más denominados returnAddress y reference. El primero de estos no tiene reflejo en el lenguaje sino que es generado en la compilación, y el segundo es utilizado para referirse a cualquier elemento no primitivo (objetos, clases y arrays, como veremos).

Concretando, deciamos que disponemos de enteros, reales, caracteres y booleanos. Dentro de las categorías entero y real, estan disponibles variantes con distintas capacidades, de modo que disponemos de cuatro tamaños de enteros: byte, short, int y long y dos de reales: float y double. A estos tipos hay que añadir un elemento más que sirve para especificar la ausencia de tipo (utilizado en funciones que no son tal en en el sentido de que no devuelven un valor). La palabra reservada correspondiente es void

Tipos primitivos
Enteros
[complemento a dos con signo]
byte8 bits
short16 bits
int32 bits
long64 bits
Reales
[IEEE 754]
float32 bits
double64 bits
Caracteres
[Unicode]
char16 bits
Booleanos
[dpte. implementación]
boolean
no-tipo
void

Para quien conoce "C":
A excepción del tipo boolean que no existe en el lenguaje C, el resto de los tipos coinciden, pero hay que mencionar que en Java cada tipo tiene su especificación estricta, a diferencia de lo que sucede en C con el tipo int, que en ciertas máquinas coincide con short y en otras con long lo que supone un problema gravísimo a la hora de portar código de una plataforma a otra.
Otra importante diferencia consiste en que Java implementa los caracteres con 16 bits siguiendo el estándar Unicode, de modo que da cabida a todo tipo de caracteres de una forma natural.

Una vez vistos los tipos de datos primitivos, todo lo que nos queda por ver es orientado a objeto. El nexo de unión entre los dos "mundos" (el orientado de objetos y el que no lo es) viene dado por la existencia de unas clases paralelas a los tipos primitivos y que permiten la transferencia de valores de un "mundo" a otro entre otras cosas. El siguiente código ilustra esto con una declaración de una clase que incluye una variable de cada tipo primitivo y las inicializa utilizando elementos de las correspondientes clases asociadas.


 1-
 2-
 3-
 4-
 5-
 6-
 7-
 8-
 9-
10-
11-
12-
13-
14-
15-
16-
17-
18-
19
20-


public class MaxVariablesDemo {
    public static void main(String args[]) {

        // enteros
        byte maximoByte = Byte.MAX_VALUE;
        short maximoShort = Short.MAX_VALUE;
        int maximoInteger = Integer.MAX_VALUE;
        long maximoLong = Long.MAX_VALUE;

        // reales
	float maximoFloat = Float.MAX_VALUE;
        double maximoDouble = Double.MAX_VALUE;

        // otros tipos primitivos
        char unChar = 'S';                 //existe Character
        boolean unBoolean = Boolean.TRUE;  //tambien válido: boolean unBooleano=true

        // (aquí continuará la definición de la clase)
    }
}

Como puede verse, cada variable se inicializa con un valor que se encuentra en una clase de igual nombre que el tipo pero con la primera letra en mayuscula. Una excepción es la que se da con char ya que la clase correspondiente se denomina Characacter y en el ejemplo no se ha utilizado por no tener predefinido ninguno significativo. Tambien puede observarse cómo se asigna el valor "True" a la variable booleana a través de una definición existente en su clase asociada, si bien es posible asignar directamente la palabra predefinida "true"

Conversiones de tipos primitivos

Las conversiones de datos entre los distintos tipos primitivos, a excepción del booleano, estan permitidas teniendo en cuenta que los caracteres se tratan como "shorts" sin signo. En todo caso las conversiones a formatos mayores pueden realizarse sin restricciones, mientras que las conversiones inversas, que pueden recortar un valor y alterar su interpretación pueden llevarse a cabo mediante "casting" (especificando el tipo de destino entre paréntesis) como declaración del conocimiento de la reducción de la representación.


Conversiones entre tipos primitivos. El sentido de la flecha indica las conversiones "directas". Las "inversas" tambien se permiten con la utilización de "casting".

Los siguientes son ejemplos de conversiones válidas:


 1-
 2-
 3-
 4-
 5-
 6-


float f;
double g=3.14159;   
f=(float)g;

long l=32;           //la constate 32 es int y se convierte automáticamente a long
char c=(char)l;

Identificadores y literales

Los identificadores en Java estan formados por cadenas de caracteres de longitud no limitada en las que el primero puede ser cualquier letra o bien "_" o "$", y el resto puede ser también numérico. Hay que tener en cuenta que, al utilizarse UNICODE en todos los sentidos (no solo para almacenar valores en variables de tipo char) al indicar aquí que se admiten letras, se hace en sentido amplio, de modo que son válidas las letras acentuadas, con dieresis, de alfabetos no latinos, etc.

Los literales se forman básicamente como en cualquier otro lenguaje de programación en lo que se refiere a enteros y reales. En particular la similitud es total con el lenguaje C, por lo que nos remitiremos sin más explicaciones a las siguientes figuras y ejemplos. Los booleanos admiten dos palabras prefedinidas como literales para indicar veracidad (true) o falsedad (false). Los caracteres se especifican entre comillas, pudiendose dar directamente en el caso de los que son "imprimibles" (p.ej. 'a', '#'), o mediante "secuencias de escape". Estas secuencias se forman con el caracter "\" seguido bien de otro (p.ej. '\n', '\r') que tendrá un significado especifico tabulado más abajo, o bien de una "u" seguida a su vez por un valor en hexadecimal de 4 cifras que determina el código del carácter (p.ej. '\u0020', '\u1A3F').


Identificadores y literales en Java.

Como puede verse, la figura indica dos tipos de literales más de los mencionados hasta el momento. En primer lugar tenemos las cadenas de caracteres. En Java el tipo "cadena de caracteres" no es primitivo sino que se trata de una clase denominada "String". No obstante, es posible asignar valores a los objetos de dicha clase mediante literales, y su formación se lleva a cabo indicandolos entre comillas dobles y encadenando caracteres con las mismas posibilidades indicadas anteriormente (véase la figura). El último literal aconsiderar es el "null". Sirve para dar un valor a una variable que se declare para referirse a objetos o arrays indicando la ausencia de tal objeto o array (p.ej. String s=null;).

Siguiente punto: 3.3- Operadores


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.