Unidad 2 Elementos Basicos Del Lenguaje Java

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 76

TÉCNICAS DE PROGRAMACIÓN

2 Unidad 2: INTRODUCCIÓN A LAS


APLICACIONES EN JAVA

“Editar programas simples en Java, compilarlos y ejecutarlos”.

1
ORIENTACIÓN DEL APRENDIZAJE

Comenzamos familiarizándonos con un entorno de programación Java, que contiene


un editor, un compilador, un sistema para ejecutar programas compilados y un
depurador, en un sólo programa. También analizamos las reglas de sintaxis que se
deben seguir siempre que se escriba un programa en Java. Posteriormente editará,
compilará y ejecutará programas sencillos en Java.
Los programas procesan diferentes tipos de datos de diferentes modos. Por ejemplo,
calcular el crecimiento de una población de bacterias requiere operaciones
matemáticas con datos numéricos, mientras que ordenar una lista de nombres requiere
operaciones de comparación usando datos alfabéticos. Java tiene dos tipos
fundamentales de datos conocidos como: tipos primitivos y tipos de referencia. Más
adelante, introducimos los tipos de datos primitivos y las operaciones que se pueden
realizar con ellos.
En este momento iniciamos la formalización de las estructuras de datos simples y en la
siguiente unidad tratamos las estructuras de control. Con lo cual, contaremos con todos
los elementos necesarios para el desarrollo de los algoritmos y programas.
Constantes y variables se utilizarán poniendo de manifiesto los tipos elementales de
datos: tipo numérico (reales o enteros), tipo carácter y tipo lógico, dentro de un contexto
de programación orientada a objetos, como se desarrolló en la unidad 1.

Al finalizar esta unidad, usted estará en condiciones de alcanzar los siguientes objetivos:

 Identificar los tipos básicos de datos en Java.

 Conocer los operadores aritméticos, relacionales y lógicos.

 Realizar las distintas operaciones posibles entre datos.

 Realizar operaciones de entrada y salida de datos.

 Operar en un entorno de programación Java desarrollando programas


sencillos.

Los contenidos que analizamos son:

 Estructura general de un programa en Java. Creación, ejecución, depuración y prueba


de un programa en Java.
 Elementos de un programa Java.
 Tipos de datos en Java.Constantes y variables.
 Entradas y salidas.
 Clases correspondientes a los tipos básicos.
 Operadores y expresiones.

2
A continuación incluimos un esquema conceptual de esta unidad:

Reales Reales
Numéricas Numéricas
Enteras Enteras
Carácter Carácter

Lógicas Lógicas

Constantes Variables

(Clase = datos + métodos) + objetos = Programa

Expresiones Predicados

Aritméticas

Relacionales

Lógicas

3
Tema 1. Estructura general de un programa en Java. Creación, ejecución,

depuración y prueba de un programa en Java

Un programa Java se compone de una o más clases. Uno de los métodos de la clase
principal debe ser obligatoriamente main( ). Un método en Java es un grupo de instrucciones
que realizan una o más acciones. Asimismo, un programa contendrá una serie de
declaraciones import que permitirán incluir en el mismo, archivos que a su vez incluyen
clases y datos predefinidos.

import java.io* ; // archivo de clases de entrada / salida

public class NombrePrograma // nombre de la clase principal


{
public static void main (String [ ] ar) // cabecera del método
{
// nombre del método
… // sentencias
}

}

De un modo más explícito, un programa Java puede incluir:

 Declaraciones para importar clases de paquetes.

 Declaraciones de clases.

 El método main ( ).

 Métodos definidos por el usuario dentro de las clases.

 Comentarios del programa (utilizados en su totalidad).

La estructura típica completa de un programa Java se muestra en la figura 2.1.

4
Nombre del Programa
El nombre del archivo fuente ha de coincidir con el nombre de la
clase principal (clase que contiene al método main ( )). Así se
puede tener: nombrePrograma.java.

Import declaración para importar clases desde paquetes.

Public static void main ( ) método por el que empieza la


ejecución. Java sigue esta sintaxis

Método principal main

public static void main (String [ ] ar)


{
declaraciones locales
sentencias
}

Definiciones de otros métodos de la clase


Static tipo func1 (…)
{

}

Figura 2.1 Estructura típica de un programa Java

Como ejemplo veamos un programa simple en Java:

import java.io.* ;
// Listado DemoUno.java. Programa de saludo
// Este programa imprime “Bienvenido a la programación en Java ”

class DemoUno
{
public static void main (String [ ] ar)
{
System.out.print.ln (“ Bienvenido a la programación en Java\n ”) ;
}
}

5
La declaración import de la primera línea es necesaria para que el programa pueda utilizar
las clases de entrada y salida. Se refiere a un archivo externo. En Java, en un paquete
denominado java.io se almacenan clases y objetos relativos a la entrada y salida. Obsérvese
que * se utiliza para indicar que importe todos los elementos del paquete java.io.
La segunda y tercera línea son de comentario, identificado por dobles barras inclinadas ( // ).
Los comentarios se incluyen en programas para proporcionar explicaciones a los lectores de
los mismos. Son ignorados por el compilador.
La cuarta línea contiene la cabecera de la clase DemoUno. Un programa Java se puede
considerar como una colección de clases. Debe haber al menos una que tenga el mismo
nombre que el del archivo fuente (DemoUno.java) y contener al método main( ), obligatorio
en cada programa Java. Indica el comienzo del programa y requiere la sintaxis:

public static void main (String [ ] ar)

El argumento de main ( ) es un array de cadenas de caracteres para poder recoger datos de


la línea donde se ejecuta el programa.
La línea a continuación de main ( ) contiene sólo la llave {que encierra el cuerpo del método
y que es necesaria en todos los programas Java. Sigue la sentencia:

System.out.print.ln (“ Bienvenido a la programación en Java\n ”) ;

Bienvenido a la programación en Java

El símbolo ‘ \n ’ es el símbolo de nueva línea. Poniendo este símbolo al final de la cadena


entre comillas indica al sistema que comience una nueva línea después de imprimir los
caracteres precedentes, terminando, por consiguiente, la línea actual.
Obsérvese el punto y coma (;) al final de la línea que nos ocupa. Java requiere que cada
sentencia termine con un punto y coma. No es necesario que esté al final de una línea. Se
pueden poner varias sentencias en la misma línea y se puede hacer que una sentencia se
extienda sobre varias líneas.
Por último la llave } cierra un bloque abierto previamente con la llave {. Se abrió el bloque del
método main ( ) y el bloque del cuerpo de la clase; ambos se cierran con }.

Advertencia

 El programa más corto de Java es el «programa vacío», que no hace nada.


 Puede que no haya argumentos en la línea de órdenes; en cualquier caso es
obligatorio especificar String [ ].

- Declaración import

Las clases de Java se agrupan en paquetes (package), a su vez éstos definen utilidades o
grupos temáticos. Los paquetes se encuentran en directorios del disco que tienen el mismo
nombre que el paquete. Para incorporar y utilizar las clases de un paquete en un programa

6
se utiliza la declaración import. Por ejemplo, para indicar al compilador que incorpore la clase
Graphics del paquete awt:

import java.awt.Graphics ;

La sintaxis de la declaración import es:


import java.nombrePaquete.nombreClase ;

nombreClase es el identificador de una clase del paquete.

Pueden incorporarse varias clases de un paquete con una secuencia de sentencias import.
Por ejemplo, para incorporar las clases Random, Date y Vector del paquete util :

import java.util.Random ;
import java.util.Date ;
import java.util.Vector ;

De un paquete se puede especificar que se incorporen todas las clases públicas, en


ese caso, nombreClase se sustituye por *. Así, para que un programa pueda utilizar
cualquier clase del paquete java.io:

import java.io.* ;

El paquete java.lang contiene los elementos básicos para construir un programa Java,
como objetos definidos para la entrada y salida básica, excepciones predefinidas, tipos de
datos y en general elementos o utilidades para la construcción de programas. Por su
importancia, el compilador siempre incorpora este paquete, por lo que no es necesario
escribir la declaración import java.lang*.

Advertencia

Se recomienda incorporar sólo las clases de los paquetes que el programa utiliza.
Incorporar sólo lo necesario da mayor claridad al programa, además la compilación
será tanto más lenta cuantas más clases se incorporen.
Incorporar clases de paquetes no utilizadas hace que la compilación se ralentice,
aunque el compilador no añade las clases no usadas a lo largo del programa.

El programador puede definir sus propios paquetes para agrupar clases que pudiera crear.
Los paquetes se deben ubicar en subdirectorios con el mismo nombre que el paquete. Para
incorporar clases de un paquete creado por el programador se realizan declaraciones import
de igual forma. Si suponemos que se ha definido el paquete casa con las clases
Climatizador, Computadora, Heladera, Microondas; se pueden hacer las declaraciones:

import casa.Computadora ;

7
import casa.Heladera ;

o bien, para todas las clases:

import casa.* ;

Las declaraciones import se acostumbra a escribirlas en la cabecera de los programas; el


ámbito o punto donde se pueden utilizar es a lo largo de todo el archivo donde se encuentra
el programa.
El paquete java.io (Java input/output) proporciona clases que permiten a los programas
realizar operaciones de entrada y salida. Como casi todos los programas que escriba
imprimirán información en pantalla y leerán datos desde el teclado, necesitarán incluir clases
referentes a los mismos. Para ello será preciso que cada programa contenga la línea
siguiente:

import java.io.* ;

- Declaraciones de clases

Un programa en Java está organizado como una colección de clases. El programa debe
tener al menos una clase, que puede ser considerada como la clase principal, con el método
main ( ), y si es necesario otros métodos y variables. La declaración de una clase puede
empezar con una palabra clave, que generalmente indica el acceso y es opcional; a
continuación sigue el indicador de clase, la palabra reservada class, a la que le sigue el
nombre de la clase y los miembros de la clase: variables y métodos. Por ejemplo:

class Potencia
{
public static void main (String [ ] ar)
{
int r, e ;
int numero, p ;
numero = 4;
e = 3;
r = 1;
for (p=3 ; p > 0; p = p-1)
r = r*numero ;
System.out.println (“La potencia de ” + numero + “^” + e + “=” + r) ;
}
}

El archivo donde se guarde el programa anterior debe tener como nombre Potencia.java.
Siempre el nombre del archivo fuente ha de ser el nombre de la clase principal ( clase
que contiene a main ( ) ) y la extensión java.

8
class Sumatoria
{
int n, p ;
public int sumar( )
{
int k, e ;
n = k = 71 ;
p=e =5;
return n+k+e+p ;
}
}

Las declaraciones dentro de una clase indican al compilador que los métodos definidos por
el usuario o variables así declaradas son comunes a todos los miembros de su clase. En la
clase Sumatoria las variables n, p se pueden utilizar en cualquier método de la clase. Sin
embargo, k, e situados en el método sumar( ) sólo se pueden utilizar dentro del método.

- El método main ( )

Cada programa Java tiene un método main ( ) que es un punto inicial de entrada al
programa. Su estructura es:

public static void main (String [ ] ar)


{
… bloque de sentencias
}

Las sentencias incluidas entre las llaves { …} se denominan bloque. Un programa debe tener
solamente un método main ( ). Si se intenta hacer dos métodos main ( ), se produce un error,
aunque estén escritas en diferentes clases.
El argumento de main( ) es un array de cadenas de caracteres (una lista de cadenas de
caracteres) que posibilitan poder introducir datos en forma de cadenas de caracteres en la
línea de ejecución del programa Java. Supongamos que se tiene el programa Nombres, la
ejecución puede ser:

Java Nombres Jorge Alberto Carlos

En esta ejecución las cadenas Jorge Alberto Carlos están asignadas a ar[0], ar [1] y ar[2].
Las sentencias de main( ) pueden hacer referencia a esas cadenas a través del argumento
ar[ ]. El lenguaje Java exige que el método main( ) se declare como public static void. Más
adelante se describen las características de static. Conviene citar que desde un método

9
static sólo se puede llamar a otro método static y hacer referencias a variables de clase
static.
Además del método main( ), un programa Java consta de una colección de clases, y en
cada clase tantos métodos como se desee.

Un método en Java es un subprograma que devuelve un único valor, un conjunto


de valores o realiza alguna tarea específica tal como E/S, debe estar dentro de una
clase.

Un programa de pocas líneas se puede incluir totalmente en una clase, e incluso tener sólo
el método main( ). Un programa largo, sin embargo, aunque tenga una sola clase tiene
demasiado código para incluirlo en este método. En un programa largo, el main( ) consta
prácticamente de llamadas a otros métodos definidos por el usuario, o métodos de clases
incorporadas con la declaración import. El programa siguiente se compone de tres métodos:
obtenerdatos( ), alfabetizar( ) y verpalabras( ) que se invocan sucesivamente.

/ / declaraciones import
class Programa
{
public static void main (String [ ] ar)
{
obtenerdatos( );
alfabetizar( );
verpalabras( );
}

}

Las sentencias situadas en el interior del cuerpo del método main ( ), o cualquier otro
método, deben terminar en punto y coma.

- Métodos definidos por el usuario

Todos los programas se construyen a partir de una o más clases, y a su vez éstas con una
serie de variables y métodos que se integran para crear una aplicación. Todos los métodos
contienen una o más sentencias Java y se crean generalmente para realizar una única tarea,
tales como imprimir en la pantalla, escribir un archivo o cambiar el color de la pantalla. Se
pueden declarar un número de métodos casi ilimitado en una clase de Java.
Los métodos definidos por el usuario se invocan, dentro de la clase donde se definen, por su
nombre y los parámetros que puedan tener. Después de que el método se invoca, el código
que tiene asociado se ejecuta y, a continuación, se retorna al método llamador. Si la llamada
es desde un objeto de la clase, se invoca al método precedido del objeto y el selector punto
(.). Más adelante se profundiza. A título de ejemplo, se crea un objeto de la clase Sumatoria
y se invoca el método sumar( ):

Sumatoria sr = new Sumatoria( );

10
sr.sumar( );

Todos los métodos tienen nombre y una lista de valores que reciben, también llamados
parámetros o argumentos. Se puede asignar cualquier nombre a un método, pero
normalmente se procura que dicho nombre describa el propósito del método.
Los métodos en Java se definen en la clase a la que pertenecen. La definición de un método
es la estructura del mismo:

tipo_retorno nombreMetodo (lista_de_parámetros) principio del método


{
sentencias cuerpo del método
return expresión valor que devuelve
} fin del método

tipo_retorno : Es el tipo de valor, o void, devuelto por la función.

nombreMetodo : Nombre del método

lista_de_parámetros : Lista de parámetros, o void, pasados al método. Se


conoce también como argumentos o argumentos formales.

A veces, para referirse a un método, se hace mención al prototipo que tiene. El prototipo es
simplemente la cabecera del método:

tipo_retorno nombreMetodo (lista_de_parámetros) ;

Así se puede tener el siguiente prototipo:

void contarArriba (int valor) ;

La palabra reservada void significa que el método no devuelve un valor. El nombre del
método es contarArriba y tiene un argumento de tipo entero, int valor.
Java proporciona también clases con métodos predefinidos, que se denominan clases de
biblioteca, a su vez organizadas en paquetes (package). Los métodos de estas clases de
bibliotecas están listos para ser llamados en todo momento por un programa Java.
Requieren la incorporación del paquete donde se encuentran, o bien sólo la clase del
paquete. La invocación de uno de estos métodos se ha de hacer precediendo de la clase a la
que pertenecen o del objeto. Así, por ejemplo, para llamar al método que calcula la raíz
cuadrada y escribir el resultado:

double r = 18.7 ;
System.out.println (Math.sqrt(r)) ;

11
El método sqrt se invoca precedido de la clase Math y el selector punto (.); lo mismo ocurre
con println( ), que es llamado precedido del objeto out, que a su vez está definido en la clase
System.

Ejemplo 2.1
Se escribe un programa formado por una clase que contiene el método main ( ) y
otros dos métodos: calcula ( ) y mostrar ( ). El primero determina el valor de una
función para un valor dado de x; el segundo muestra el resultado.
El método main ( ) llama a cada uno de los métodos auxiliares, estos se
especifican como static por las restricciones del método main ( ); la evaluación de
la función se hace utilizando el seno de la clase Math. El paquete java.lang
contiene a la clase Math; este paquete se incorpora automáticamente, por lo que
no es necesaria la declaración import.

class Evaluar
{
public static void main (String [ ] ar)
{
double f ;

f = calcula ( );
2.1.1 Comentarios mostrar (f) ;
}

static double calcula ( )


{
double x = 3.14159/4.0 ;
return x*Math.sin(x) + 0.5 ;
}
static void mostrar (double r)
{
System.out.println (“ Valor de la función: ” + r) ;
}
/ / termina la declaración de la clase
}

- Comentarios

Un comentario es cualquier información que se añade en las líneas del programa para
proporcionar información de cualquier tipo. El compilador ignora los comentarios, no realiza
ninguna tarea concreta. El uso de comentarios es totalmente opcional, aunque dicho uso es
muy recomendable.
Generalmente se considera buena práctica de programación comentar sus programas tanto
como sea posible, con el objeto de que usted mismo y otros programadores puedan leer

12
fácilmente el programa con el paso del tiempo. Es buena práctica de programación comentar
su programa en la parte superior de cada archivo fuente. La información que se suele incluir,
es el nombre del archivo, el nombre del programador, una breve descripción, la fecha en que
se creó la versión y la información de la revisión.
En Java, los comentarios de un programa se pueden introducir de dos formas:

Con los caracteres / * … */ para más de una línea;

Con la secuencia de dos barras, / /, para comentarios en línea.

Comentarios con / * * /

Los comentarios comienzan con la secuencia / * y terminan con la secuencia* /. Todo el texto
situado entre las dos secuencias es ignorado por el compilador:

/ * Saludo Java. Primer programa Java * /

Si se necesitan varias líneas de programa se puede hacer lo siguiente:

/*
Programa : Saludo.java
Programador : Alberto Fort
Descripción : Primer programa Java
Fecha creación : 17 de Agosto 2004
Revisión : Ninguna
*/

También se pueden situar comentarios de la forma siguiente:

System.out.println (“Programa Demo”) ; / * sentencia de salida * /

Se aconseja esta forma de construir comentarios cuando estos ocupen más de una línea.

Comentarios en línea: //

Todo lo que viene después de la doble barra inclinada (//) es un comentario y el compilador
lo ignora. Se define una línea comentario comenzando con una doble barra inclinada (//):

// Saludo.java - Primer programa Java

Si se necesitan varias líneas de comentario se puede hacer lo siguiente:

//
// Programa : Saludo.java
// Programador : Alberto Fort

// Descripción : Primer programa Java


// Fecha creación : 17 de junio 1994

13
// Revisión : Ninguna
//

Aunque para comentarios de más de una línea se prefieren los delimitadores / * * /.


No se pueden anidar comentarios, lo que implica que no es posible escribir un comentario
dentro de otro; por otro lado, tampoco tiene sentido hacerlo. Si se anidan comentarios, el
compilador produce errores, ya que no puede discernir entre los comentarios.
El comentario puede comenzar en cualquier parte de la línea, incluso después de una
sentencia del programa. Por ejemplo:

// Saludo.java - Primer programa Java


import java.io.* ; // incorpora todas las clases del paquete io
class Principal // el archivo fuente debe ser Principal.java
{
public static void main(String [ ] ar) // método inicial
{
System.out.println (“Hola mundo Java ”); // visualiza en pantalla
}
}

Ejemplo 2.2

El siguiente programa crea una cadena de caracteres con un mensaje y lo imprime


en la pantalla seguido de un nombre que se escribe en la línea donde se llama al
programa para ejecutarlo.
El programa consta sólo de la clase Mensaje, con el método main ( ), que es por
donde un programa Java empieza siempre la ejecución. Java dispone de la clase
String para crear cadenas, y por ello se declara una variable del tipo String para
referenciar al mensaje. El argumento ar en su posición inicial, ar [ 0 ], de main ( )
contiene Angela.
Por último, se escriben cadenas mensaje y ar [ 0 ] con el método println ( ). La
clase System, disponible en todo programa Java, tiene un miembro, un objeto, out,
desde el que se puede invocar a print ( ) y a println ( ).

/*
nombre de archivo: Mensaje.java
El nombre de la clase principal ha de coincidir con el archivo
*/
class Mensaje
{
public static void main (String [ ] ar)
{
String mensaje = “ Tardes del Domingo con ” ;
System.out.println (mensaje +ar [ 0 ] ) ;
}
}
Los archivos fuente deben tener el mismo nombre que la clase principal (clase que
contiene a main ( ) y la extensión .java.

14
- Creación de un programa en JAVA

Una vez creado un programa en Java como el anterior, se debe ejecutar. ¿Cómo realizar
esta tarea? Los pasos a dar dependerán del compilador Java que utilice. Sin embargo serán
similares a los mostrados en la Figura 2.2. En general, los pasos serían:

 Utilizar un editor de texto para escribir el programa y grabarlo en un archivo.


Este archivo constituye el código fuente de un programa.
 Compilar el código fuente. Se traduce el código fuente en un código entendible
por el computador, en lenguaje máquina. El compilador Java traduce el código
fuente de un programa no exactamente en código máquina, sino en un código
intermedio llamado Byte Code, y lo guarda con el mismo nombre del programa
y la extensión class (.class). Un archivo .class con código Byte Code es
independiente de la arquitectura del computador y contiene instrucciones del
programa en forma empaquetada, para que pueda ser ejecutado en una
máquina que tenga un intérprete Java, en lo que se denomina Máquina Virtual
de Java.
 Ejecución. La Máquina Virtual interpreta el archivo .class con código Byte
Code. Primero carga en memoria el archivo .class. En segundo lugar se
encarga de verificar que el código cargado no va a violar las restricciones de
seguridad de Java (violación de memoria…). Por último, ejecuta cada una de
las instrucciones generadas en Byte Code.

Código fuente Editor

Código Byte Code Compilador

Carga en memoria Byte Code

Máquina
Verifica Byte Code Virtual Java

Interpreta y ejecuta Byte Code

Figura 2.2. Etapas de creación y ejecución de un programa Java.

15
Para crear un programa se utilizan las siguientes etapas:

1. Especificar la clase o clases de su programa.


2. Indicar las clases de los paquetes ya definidos a utilizar.
3. Definir la clase que va a contener al método main ( ).
4. Crear main( ).
5. Crear el cuerpo del programa.
6. Crear sus propias clases, métodos definidos por el usuario.
7. Compilar, ejecutar y comprobar su programa.
8. Utilizar comentarios.

- Ejecución de un programa en Java

Un programa de computadora escrito en un lenguaje de programación (por ejemplo, Java)


tiene forma de un texto ordinario. Se escribe el programa en una hoja de papel y a este
programa se le denomina programa texto o código fuente. Considérese el ejemplo sencillo:

class OtroSaludo
{
public static void main (String [ ] ar)
{
System.out.println (“Hola Anita ” + ar [ 0 ] ) ;
}
}

La primera operación en el proceso de ejecución de un programa es introducir las sentencias


(instrucciones) del programa en un editor de texto. El editor almacena el texto y debe
proporcionarle un nombre igual que el de la clase: OtroSaludo.java. A continuación se debe
guardar el texto en disco para su conservación y uso posterior, ya que en caso contrario el
editor sólo almacena el texto en memoria central (RAM) y cuando se apague la
computadora, o bien ocurra alguna anomalía, se perderá el texto de su programa. Sin
embargo, si el texto del programa se almacena en un disquete, en un disco duro, o bien en
un CD-ROM, el programa se guardará de modo permanente, incluso después de apagar la
computadora y siempre que esta se vuelva a arrancar.
La figura 2.3 muestra el método de edición de un programa y la creación del programa en un
disco, en un archivo que se denomina archivo de texto. Con la ayuda de un editor de texto se
puede editar el texto fácilmente, es decir, cambiar, mover, cortar, pegar, borrar texto. Se
puede ver, normalmente, una parte de texto en la pantalla y se pueden marcar partes del
texto a editar con la ayuda de un ratón o el teclado. El modo de funcionamiento de un editor
de texto y las órdenes de edición asociadas varían de un sistema a otro. Una vez editado un
programa, se le proporciona un nombre y extensión: .java.

16
Teclado Editor de Texto del
Ratón Texto programa
Archivo
fuente

Figura 2.3. Proceso de edición de un archivo fuente.

La siguiente etapa es la de compilación. En ella se importan las clases de los packages


indicados, se analiza la sintaxis del programa y se traduce el código fuente escrito en
lenguaje Java a un código especial de Java, se denomina Byte Code y el archivo donde se
guarda tiene el mismo nombre que el del programa y la extensión .class. Este código todavía
no es código ejecutable; tiene la gran ventaja de que es un código neutral, no dependiente
de la máquina o arquitectura del ordenador. El programa que realiza esta traducción se llama
compilador. Cada compilador se construye para un determinado lenguaje de programación
(por ejemplo, Java); un compilador puede ser un programa independiente (como suele ser el
caso de los sistemas operativos VMS, UNIX, etc.) o bien formar parte de un programa
entorno integrado de desarrollo (EID). Los programas EID contienen todos los recursos que
se necesitan para desarrollar y ejecutar un programa, por ejemplo, editores de texto,
compiladores, navegadores y depuradores. Últimamente han salido versiones de Java para
entornos integrados de desarrollo, dependientes de la máquina en que se realiza el proceso
de creación.
Una vez compilado, la ejecución se realiza en la Máquina Virtual Java, una estructura lógica
que realiza básicamente tres tareas:

 Cargar el archivo Byte Code en memoria del ordenador.

Java OtroSaludo

El procesador busca el archivo indicado en el disco y lo carga en memoria principal.

 Verificar que el código cargado no va a violar las restricciones que impone


Java: violación de memoria… De esta forma se asegura que la ejecución del
programa no va a afectar negativamente, por ejemplo, a la red.

 Ejecutar cada instrucción del archivo Byte Code. Aunque puede parecer un
proceso lento, al ser un intérprete quien ejecuta, hay que tener en cuenta
que no se interpretan sentencias de código fuente, sino instrucciones ya
compactadas por el compilador. Actualmente se han desarrollado
procesadores para crear código máquina o nativo a partir del Byte Code.

Cada lenguaje de programación tiene unas reglas especiales para la construcción de


programas que se denominan sintaxis. El compilador lee el programa del archivo de texto
creado anteriormente y comprueba que el programa sigue las reglas de sintaxis del lenguaje

17
de programación. Cuando se compila un programa en un lenguaje de programación, el
programador traduce el código fuente (las sentencias del programa) en un código máquina
(código objeto); en el caso de un compilador de un programa Java, este no genera código
objeto, sino el código de las instrucciones empaquetado dispuesto para ser ejecutado por el
intérprete de Java. Si el compilador encuentra errores, los presentará en la pantalla. Una vez
corregidos los errores con ayuda del editor, se vuelve a compilar sucesivamente hasta que
se no produzcan errores.
El código así obtenido se almacena en un archivo independiente, que en Java tiene la
extensión .class. Por ejemplo, el programa cartas.java se almacena automáticamente con el
nombre cartas.class.

Compilador Archivo
Archivo fuente
Byte Code

Figura 2.4. Proceso se compilación de un programa Java.

Código Byte Máquina


Compilador Ejecución
Fuente Code Virtual Java

Paquetes-clases

Figura 2.5. Proceso de conversión de código fuente a código ejecutable.

El archivo Byte Code contiene sólo la traducción del código fuente. Esto no es suficiente para
ejecutar realmente un programa. La ejecución de un programa Java en un computador
requiere que este tenga un intérprete Java, que es lo que se conoce como Máquina Virtual
Java. Esta estructura lógica toma como entrada el archivo Byte Code, que tiene la extensión
.class. El comando java es el que realiza el proceso de ejecución; esto permite que un
programa Java pueda ser ejecutado, desde cualquier computador, desde cualquier
arquitectura del ordenador; los compiladores de otros lenguajes, como C, C ++, generan
código ejecutable (. exe), que es más eficiente, pero dependiente de la arquitectura del
ordenador.
El archivo con el Byte Code se puede poner en un disquete, o en un CD-ROM, o en un
servidor, de modo que esté disponible después de salir del entorno del compilador a
cualquier usuario que tenga la Máquina Virtual Java para su ejecución.

18
El proceso de ejecución de un programa no suele funcionar a la primera vez; es decir,
siempre hay errores de sintaxis o errores en tiempo de ejecución. El proceso de detectar y
corregir errores se denomina depuración o puesta a punto de un programa.
La Figura 2.6 muestra el proceso completo de puesta a punto de un programa.

Inicio

Editar programa

Compilar programa


Errores de
sintaxis

No
Comprobar errores

Errores e Sí
tiempo de
ejecución

No

Fin

Figura 2.6. Proceso completo de depuración de un programa.

Se comienza escribiendo el archivo fuente. Con el compilador se compila el archivo fuente y


se comprueban mensajes de errores. Se retorna el editor y se fijan los errores de sintaxis.
Cuando el compilador tiene éxito, este construye el archivo con Byte Code. La Máquina
Virtual Java ejecuta el archivo Byte Code. Si encuentra un error, se puede activar el
depurador para ejecutar sentencia a sentencia, o bien el programador ha podido establecer
un adecuado tratamiento de las excepciones o errores en tiempo de ejecución. Una vez que
se encuentra la causa del error, se vuelve al editor y se fija. El proceso de compilar y ejecutar
el programa se repetirá hasta que no se produzcan errores.

Etapas del Proceso

 El código fuente (archivo del programa) se crea con la ayuda del editor de
texto.
 El compilador traduce el archivo de texto en un archivo con código Byte
Code.
 La Máquina Virtual Java pone el archivo con código Byte Code en la
memoria central y ejecuta el programa.
19
- Depuración de un programa en Java

Rara vez los programas funcionan bien la primera vez que se ejecutan. Los errores que se
producen en los programas han de ser detectados, asilados (fijados) y corregidos. El proceso
de encontrar errores se denomina depuración del programa. La corrección del error es
probablemente la etapa más fácil, siendo la detección y el aislamiento del error las tareas
más difíciles.
Existen diferentes situaciones en las cuales se suelen introducir errores en un programa. Dos
de las más frecuentes son:

1. Violación (no cumplimiento) de las reglas gramaticales del lenguaje de alto


nivel en el que se escribe el programa.
2. Los errores en el diseño de clases y del algoritmo en el que está basado el
programa.

Cuando el compilador detecta un error, visualiza un mensaje de error indicando que se ha


cometido un error y posible causa del error. Desgraciadamente, los mensajes de error son
difíciles de interpretar y a veces se llega a conclusiones erróneas. A medida que se gana en
experiencia, el proceso de puesta a punto de un programa se mejora considerablemente.
Nuestro objetivo es describir los errores que ocurren más frecuentemente y sugerir las
posibles causas de error, junto con reglas de estilo de escritura de programas. Desde el
punto de vista conceptual existen tres tipos de errores: de sintaxis, lógicos y de regresión.

- Errores de sintaxis

Los errores de sintaxis son aquellos que se producen cuando el programa viola la sintaxis,
es decir, las reglas de gramática del lenguaje. Errores de sintaxis típicos son: escritura
incorrecta de palabras reservadas, omisión de signos de puntuación (comillas, punto y coma
…). Los errores de sintaxis son los más fáciles de fijar, ya que ellos son detectados y
aislados por el compilador.
Estos errores se suelen detectar por el compilador durante el proceso de compilación. A
medida que se produce el proceso de traducción del código fuente (por ejemplo, programa
escrito en Java) a Byte Code, el compilador verifica si el programa que se está traduciendo
cumple las reglas de sintaxis del lenguaje. Si el programa viola alguna de estas reglas, el
compilador genera un mensaje de error (o diagnóstico) que explica el problema (aparente).
Algunos errores típicos (ya citados anteriormente):

 Punto y coma después de la cabecera main ( ).


 Omisión de punto y coma al final de una sentencia.
 Olvido de la doble barra inclinada antes de un comentario.
 Olvido de las dobles comillas al cerrar una cadena.
 Utilización de palabras reservadas como identificadores.
 ...

Si una sentencia tiene un error de sintaxis no se traducirá completamente y el programa no


se podrá ejecutar. Así, por ejemplo, si una línea de programa es:

20
double radio

se producirá un error, ya que falta el punto y coma (;) después de la letra última “o”.
Posteriormente se explicará el proceso de corrección por parte del programador.

- Errores lógicos

Un segundo tipo de error importante es el error lógico, ya que tal error representa errores
del programador en el diseño del algoritmo que se implementa con un método y
posteriormente el programa. Los errores lógicos son más difíciles de encontrar y aislar, ya
que no suelen ser detectados por el compilador. Suponga, por ejemplo, que una línea de
programa contiene la sentencia:

double peso = densidad * 5.25 * Math.PI * Math.pow (longitud, 5) / 4.0

pero resulta que el tercer asterisco (operador de multiplicación) es en realidad un signo +


(operador suma). El compilador no produce ningún mensaje de error de sintaxis, ya que no
se ha violado ninguna regla de sintaxis y por tanto el compilador no detecta error y el
programa se compilará y ejecutará bien, aunque producirá resultados de valores incorrectos,
ya que la fórmula utilizada para calcular el peso contiene un error lógico.
Una vez que se ha determinado que un programa contiene un error lógico – si es que se
encuentra en la primera ejecución y no pasa desapercibida al programador –, encontrar el
error es una de las tareas más difíciles de la programación. El depurador (debugger), un
programa de software diseñado específicamente para la detección, verificación y corrección
de errores, ayudará a las tareas de depuración.
Los errores lógicos ocurren cuando un programa es la implementación de un algoritmo
defectuoso. Dado que los errores lógicos no producen normalmente errores en tiempo de
ejecución y no visualizan mensajes de error, son más difíciles de detectar por que el
programa puede ejecutarse sin contratiempos. El único signo de un error lógico puede ser la
salida incorrecta de un programa. La sentencia:

TotalGradosCentigrados = FahrenheitAcentigrados * TemperaturaCen;

es una sentencia perfectamente legal en Java, pero la ecuación no responde a ningún


cálculo válido para obtener el total de grados centígrados en una sala. Se pueden detectar
errores lógicos comprobando el programa en su totalidad, comprobando su salida con los
resultados previstos. Se pueden prevenir errores lógicos con un estudio minucioso y
detallado del algoritmo antes de que el programa se ejecute, pero resultará fácil cometer
errores lógicos, y es el conocimiento de Java, de las técnicas algorítmicas y la experiencia lo
que permitirá la detección de los errores lógicos.

- Errores de regresión

Los errores de regresión son aquellos que se crean accidentalmente cuando se intenta
corregir un error lógico. Siempre que se corrige un error se debe comprobar totalmente la
exactitud (corrección) para asegurarse que se fija el error que se está tratando y no produce
otro error. Los errores de regresión son comunes, pero son fáciles de leer y corregir. Una ley

21
no escrita es que: «un error se ha producido, probablemente, por el último código
modificado».

- Mensajes de error
Los compiladores emiten mensajes de error o de advertencia durante las fases de
compilación o de ejecución de un programa.
Los mensajes de error producidos durante la compilación se suelen producir, normalmente,
por errores de sintaxis, y suelen variar según los compiladores; pero, en general, se agrupan
en tres grandes bloques:

 Errores fatales. Son raros. Algunos de ellos indican un error interno del
compilador. Cuando ocurre un error fatal, la compilación se detiene
inmediatamente, se debe tomar la acción apropiada y a continuación se vuelve a
iniciar la compilación.
 Errores de sintaxis. Son los errores típicos de sintaxis, errores de línea de
órdenes y errores de acceso a memoria o disco. El compilador terminará la fase
actual de compilación y se detiene.
 Advertencias (warning). No impiden la compilación. Indican condiciones que son
sospechosas, pero son legítimas como parte del lenguaje.

- Errores en tiempo de ejecución: excepciones

Existen dos tipos de errores en tiempo de ejecución: aquellos que son detectados por el
sistema en tiempo de ejecución de Java y aquellos que permiten la terminación del programa
pero producen resultados incorrectos.
Un error en tiempo de ejecución puede ocurrir como resultado de que una sentencia obliga a
la computadora a realizar una operación ilegal, tal como dividir un número por cero o
manipular datos no válidos o no definidos. Cuando ocurre este tipo de error, el programa
lanza una excepción, Java proporciona un mecanismo para tratar estos errores o
excepciones que ocurren durante la ejecución; si no se trata la excepción, la computadora
detendrá la ejecución de su programa y emitirá (visualizará) un mensaje de diagnóstico tal
como:

Divide error, line number * * *

Si se intenta manipular datos no válidos o indefinidos, su salida puede contener resultados


extraños. Por ejemplo, se puede producir un desbordamiento aritmético cuando un programa
intenta almacenar un número que es mayor que el tamaño máximo que puede manipular su
computadora.
El programa Depurar.java se compila con éxito, pero contiene una sentencia que asigna un
valor a la variable y para el cual el logaritmo no tiene definición.

22
/ / archivo Depurar.java
class Depurar
{
public static void main (String [ ] ars)
{
/ / Datos locales
double y, z;
int k;
y = 10.0 ;
z = 0.0 ;
for (k = 0; k <= 10; k + +)
{
z = z + Math.log (y) ;
y = y – 1.0 ;
}
}
}

En el programa anterior, su ejecución va a terminar con un resultado no esperado, ya que el


logaritmo de valores negativos no está definido, en este caso no se detiene la ejecución, sino
que log ( ) devuelve NaN, que puede ser tomado como indicación de error en ejecución.
Otra fuente de errores en tiempo de ejecución se suele producir por errores en la entrada de
datos producidos por la lectura del dato incorrecto en una variable u objeto de entrada.

- Prueba

Los errores de ejecución ocurren después de que el programa se ha compilado con éxito y
aún se está ejecutando. Existen ciertos errores que la computadora sólo puede detectar
cuando se ejecuta el programa. La mayoría de los sistemas informáticos detectarán ciertos
errores en tiempo de ejecución y presentarán un mensaje de error apropiado. Muchos
errores en tiempo de ejecución tienen que ver con los cálculos numéricos. Por ejemplo, si la
computadora intenta dividir un número por cero, se produce un error en tiempo de ejecución.
Es preciso tener presente que el compilador puede no emitir ningún mensaje de error
durante la ejecución y eso no garantiza que el programa sea correcto. Recuerde que el
compilador sólo le indica si se escribió bien la sintaxis del programa en Java. No indica si el
programa hace lo que realmente desea que haga. Los errores lógicos pueden aparecer – y
de hecho aparecerán – por un mal diseño de la aplicación o de los algoritmos y posterior
programa.
Para determinar si un programa contiene un error lógico se debe ejecutar utilizando datos de
muestra y comprobar la salida verificando su exactitud. Esta prueba (testing) se debe hacer
varias veces utilizando diferentes entradas, preparadas – en el caso ideal – por personas
diferentes al programador, que puedan indicar suposiciones no evidentes en la elección de
los datos de prueba. Si cualquier combinación de entradas produce salida incorrecta,
entonces el programa contiene error lógico.
Una vez que se ha determinado que un programa contiene un error lógico, la localización del
error es una de las partes más difíciles de la programación. La ejecución se debe realizar
paso a paso (seguir la traza), hasta el punto en que se observe que un valor calculado difiere
del valor esperado. Para simplificar este seguimiento o traza, la mayoría de los compiladores

23
de Java proporcionan un depurador, que permite al programador ejecutar realmente un
programa, línea a línea, observando los efectos de la ejecución de cada línea en los valores
de los objetos del programa. Una vez que se ha localizado el error, se utilizará el editor de
texto para corregir dicho error.
Es preciso hacer constar que casi nunca será posible comprobar un programa para todos los
posibles conjuntos de datos de prueba. Existen casos en desarrollos profesionales en los
que, aparentemente, los programas han estado siendo utilizados sin problemas durante
años, hasta que se utilizó una combinación específica de entradas y ésta produjo una salida
incorrecta debida a un error lógico. El conjunto de datos específicos que produjo el error
nunca se había introducido.
A medida que los programas crecen en tamaño y complejidad, el problema de las pruebas se
convierte en un problema de dificultad cada vez más creciente. No importa cuántas pruebas
se hagan: «las pruebas nunca se terminan, sólo se detienen y no existen garantías de que
se han encontrado y corregido todos los errores de un programa». Dijkstra ya predijo a
principios de los setenta una máxima que siempre se ha de tener presente en la construcción
de un programa: «Las pruebas sólo muestran la presencia de errores, no su ausencia.
No se puede probar que un programa es correcto (exacto), sólo se puede mostrar que
es incorrecto».

Actividad de proceso Nº 1

Haga una síntesis de la creación, ejecución, depuración y prueba de un programa


en Java.

Tema 2. Elementos de un programa en Java

Un programa Java consta de un archivo donde se encuentran las clases y métodos que
escribe el programador, y posiblemente otros archivos en los que se encuentran los
packages con las clases incorporadas. Un archivo con un programa Java es traducido por el
compilador; este incorpora al programa las clases solicitadas y analiza la secuencia de
tokens de que consta el programa.

- Tokens (elementos léxicos de los programas)

Existen cinco clases de tokens: identificadores, palabras reservadas, literales, operadores y


otros separadores.

24
- Identificadores

Un identificador es una secuencia de caracteres, letras, dígitos, subrayados (_) y $. El primer


carácter puede ser una letra, un _ o $. Las letras mayúsculas y minúsculas son diferentes.

nombre_clase Indice Dia_Mes_Año


elemento_mayor Cantidad_Total Fecha_Compra_Casa
a Habitacion120 i
Suma$ Valor_Inicial LongCuerda

En Java, el identificador puede ser de cualquier longitud; no hay límite en cuanto al número
de caracteres de los identificadores de variables, métodos, y demás elementos del lenguaje.
Java es sensible a las mayúsculas. Por consiguiente, Java reconoce como distintos los
identificadores ALFA y alfa.(Le recomendamos que utilice siempre el mismo estilo al escribir
sus identificadores.) Un consejo que puede servir de posible regla puede ser:

1. Escribir identificadores de variables en letras minúsculas.


2. Constantes en mayúsculas.
3. Métodos con tipo de letra mixto: mayúscula/minúscula.
4. Clases con el primer carácter en mayúsculas.

Reglas básicas de formación de identificadores

1. Secuencia de letras, dígitos o símbolos _ $. Empiezan por letra, _ o $.


2. Los identificadores son sensibles a las mayúsculas:

minum es distinto de MiNum

3. Los identificadores pueden tener cualquier longitud.


4. Los identificadores no pueden ser palabras reservadas, tales como if, switch
o else.

- Palabras reservadas

Una palabra reservada (keyword o reserved word), tal como void, es una característica del
lenguaje Java asociada con algún significado especial. Una palabra reservada no se puede
utilizar como nombre de identificador, clase, objeto o método.

//…
void void ( ) / / error

25
{
//…
int char ; / / error
//…
}

Los siguientes identificadores están reservados para usarlos como palabras reservadas, y no
se deben emplear para otros propósitos.

abstract else int static


boolean extends interface strictfp
break false long super
byte final native switch
byvalue finally new synchronized
case float null this
cast for operator throw
catch future outer throws
char generic package transient
class goto private true
const if protected try
continue implements public var
default import return void
do inner rest volatile
double instanceof short while
widefp

- Comentarios

En Java hay dos formatos para escribir los comentarios en los programas:

//…
/*…*/

Un comentario que empieza con / / termina al final de la línea en que se encuentre el


símbolo. Los comentarios encerrados entre / * y * / pueden extenderse a lo largo de varias
líneas.

/ * Titulo: DemoUno por Mr. Cebollero * /


/ / version 2.0
/ * Cabecera del programa TextUno
Autor: J.R. Bravo
*/
/ / Cabecera del programa TextUno

26
- Signos de puntuación y separadores

Todas las sentencias deben terminar con un punto y coma. Otros signos de puntuación son:

! % $ & ( ) - + = { } ~ ^ I
[ ] \ ; ´ _ < > ? , . / “

Los separadores son espacios en blanco, tabulaciones, retornos de carro y avances de línea.

- Paquetes

Los paquetes (package) es la forma que tiene Java de agrupar clases e interfases que tienen
cierta relación. Un paquete es un archivo especial que contiene las declaraciones de clases
con sus métodos. Java proporciona una serie de paquetes predefinidos, los más
importantes: java.lang, java.applet, java.awt, java.io y java.util.
El paquete java.lang contiene las clases que son el núcleo de Java; la clase System, String,
Integer, Math y otras más que aparecerán en sucesivos capítulos. El compilador siempre
incorpora este paquete.
El paquete java.io contiene clases utilizadas para entrada y salida; BufferedReader,
InputStreamReader, FileInputStream, FileOutputStream son algunas de las clases que se
encuentran en este paquete.
El paquete java.util guarda diversas clases de utilidad, como la clase Date para tratar fechas,
la clase Random para generar números aleatorios, StringTockenizer, que permite
descomponer una cadena en subcadenas separadas por un determinado símbolo.
Los paquetes java.applet y java.awt suministran clases para crear applets e interfases
gráficos.
No sólo están los paquetes predefinidos, el programador puede almacenar clases creadas
en paquetes y después utilizarlas en las aplicaciones que desee. Por ejemplo, se tiene la
clase Libro y se quiere almacenar en el paquete biblioteca:

package biblioteca ;
public class Libro
{
double precio ;
public static void leerLibro ( )
{
}

}

A partir del directorio que se tenga creado para Java se crea un subdirectorio con el mismo
nombre que el paquete (biblioteca en el ejemplo) y en él se guarda el archivo con la clase
(Libro.java).

27
Un programa Java puede utilizar la clase del paquete biblioteca precediendo al nombre de la
clase el nombre del paquete; el compilador buscará el archivo de la clase en el subdirectorio
de nombre el del paquete: biblioteca.Libro.leerLibro ( ) ;

- La declaración import

Con esta declaración se especifican las clases de paquetes que se van a utilizar en un
programa. Esta declaración permite al programa referirse a la clase escribiendo sólo su
nombre. Por ejemplo:

import biblioteca.Libro ;

con esta declaración la llamada el método leer.Libro ( ) es más simple: Libro.leerLibro ( ) ;.

La declaración import tiene dos formatos:

import nombrePaquete.nombreClase ;
import nombrePaquete.* ;

El primer formato especifica la clase que se va a utilizar. Con el segundo formato se


especifica que estén disponibles todas las clases del paquete:

import java.util.StringTockenizer ;
import java.awt.* ;

Al incorporar las clases de más de un paquete puede ocurrir que haya nombres de clases
iguales; para que no haya ambigüedad en este caso hay que preceder del nombre del
paquete al nombre de la clase. Si por ejemplo hubiera alguna colisión con el nombre de la
clase Random, para crear un objeto se escribirá:

java.util.Random g = new java.util.Random ( ) ;

Actividad de proceso Nº 2

Haga una síntesis de los elementos de un programa Java.

28
Tema 3. Tipos de datos y variables en Java

Un tipo de datos es el conjunto de valores que puede tomar una variable; así el tipo de datos
carácter representa en Java la secuencia de caracteres Unicode y una variable de tipo char
podrá tener uno de esos caracteres. Los tipos de datos simples representan valores
escalares, valores individuales, como puede ser el char o los enteros. Java no soporta un
gran número de tipos de datos predefinidos, pero tiene la capacidad para crear sus propios
tipos de datos a partir de la construcción class. Todos los tipos de datos simples o básicos
en Java son, esencialmente, números. Los tipos de datos básicos son:
 Enteros.
 Números de coma flotante (reales).
 Caracteres.
 Lógicos (boolean).

La tabla 2.1 recoge los principales tipos de datos básicos, sus tamaños en bytes y
el rango de valores que puede almacenar.

Tabla 2.1. Tipos de datos simples de Java

Tipo Ejemplo Tamaño en Rango


bytes Mínimo..Máximo
char ´C´ 2 ´\ 000´ .. ´\ FFFF´
byte -15 1 -128 .. 127
short 1024 2 -32768 ..32767
int 42325 4 -2147483648 .. 2147483647
long 262144 8 -9223372036854775808
..
+9223372036854775807

float 10.5 f 4 3.4*10-38.. 3.4*1038

double 0.00045 8 1.7*10-308.. 1.7*10308


boolean true 1 bit false, true

29
Los tipos fundamentales de datos en Java son:

 Enteros números enteros: de tipo int.


 Variantes de enteros: tipos byte, short y long.
 Reales: números decimales: tipos float, double.
 Caracteres: letras, dígitos, símbolos y signos de puntuación.
 Boolean: true o false.

char, byte, short, int, long, float, double y boolean son palabras reservadas, o más
específicamente, especificadores de tipos.

- Enteros: int, byte, short, long

Probablemente el tipo de dato más familiar es el entero, o tipo int. Los enteros son
adecuados para aplicaciones que trabajen con datos numéricos. En Java se puede
considerar que hay cuatro tipos de datos enteros, estos son: byte, short, int y long,
enumerados de menor a mayor rango. El tipo más utilizado, por semejanza de nombre, es
int. Los valores de este tipo entero se almacenan internamente en cuatro bytes ( o 32 bits) de
memoria. La tabla 2.2 resume los cuatros tipos enteros básicos, junto con el rango de
valores y uso recomendado.

Tabla 2.2. Tipos de datos enteros


Tipo Java Rango de valores Uso recomendado

byte -128 .. 127 Bucles, for, índices.


short -32768 ..32767 Conteo, aritmética de enteros.
int -2147483648 .. Aritmética de enteros en
2147483647 general.
long -9223372036854775808
.. Cálculos con enteros grandes
+9223372036854775807 (factorial …).

- Declaración de variables

La forma más simple de una declaración de variable en Java es poner primero el tipo de dato
y a continuación el nombre de la variable. Si se desea dar un valor inicial a la variable, este
se pone a continuación. El formato de la declaración es:

<tipo de dato> <nombre de variable> = <valor inicial>


Se pueden también declarar múltiples variables en la misma línea:

<tipo de dato> <nom_var1>, <nom_var2>… <nom_varn>

30
Así, por ejemplo:

int valor; int valor = 99 ;


int valor1; valor2; int num_parte = 1141, num_items = 45;
long sim, jila = 999111444222 ;

Java siempre realiza la aritmética de enteros con 32 bits (tipo int), a no ser que en la
operación intervenga un entero long. Por ello conviene utilizar variables de tipo int o long
cuando se realicen operaciones aritméticas. En el siguiente ejemplo se generan errores por
el tipo de las variables:

short x, a, b;
x=a+b

al devolver a +b un valor de tipo int, no se puede asignar a x que es de tipo short. Se podría
resolver forzando una conversión de tipo de datos:

x = (short) (a + b) ;

aunque es mejor, en este caso, declarar las variables de tipo int. Las constantes enteras,
como -1211100, 2700 o 42250 siempre se consideran de tipo int; para que el compilador
considere a una constante entera de tipo long se utiliza el sufijo l o L. Por ejemplo, -
2312367L.
También hay que considerar que si el resultado de la operación sobrepasa el máximo valor
entero, no se genera un error de ejecución, sino que se pierden los bits de mayor peso en la
representación del resultado.
En aplicaciones generales, las constantes enteras se pueden escribir en decimal o base 10;
por ejemplo, 100, 200 o 450; en octal (base 8) o hexadecimal (base 16). Una constante octal
es cualquier número que comienza con un 0 y contiene dígitos en el rango de 1 a 7. Por
ejemplo, 0377 es un número octal. Una constante hexadecimal comienza con 0x y va
seguida de los dígitos de 0 a 9, o las letras A a F (o bien a a f). Por ejemplo, 0xFF16 es una
constante hexadecimal. La tabla 2.3 muestra ejemplos de constantes enteras representadas
en sus notaciones (bases) decimal, hexadecimal y octal.
Cuando el rango del tipo int no es suficientemente grande para sus necesidades, se
consideran tipos enteros largos. Un ejemplo de uso de enteros largos:

long medidaMmilimetros ;
long distanciaMmedia ;
long numerosGrandes = 40000L ;

Tabla 2.3. Constantes enteras en tres bases diferentes.


Base 10 Base 16 Base 8
Decimal Hexadecimal (Hex) Octal

8 0x08 010
10 0x0A 012
16 0x10 020
65536 0x10000 0200000
24 0x18 030
17 0x11 021 31
- Tipos de coma flotante (float / double)

Los tipos de datos de coma (punto) flotante representan números reales que contienen una
coma (un punto) decimal, tal como 3.14159, o números muy grandes, tales como 1.85*1015 .
La declaración de las variables de coma flotante, es igual que la de variables enteras. Así, un
ejemplo:

float valor ; / / declara una variable real


float valor1, valor2 ; / / declara varios valores de coma flotante
float valor = 99.99f ; / / asigna el valor 99.99 a la variable valor
double prod ;

Java soporta dos formatos de coma flotante (Tabla 2.4). El tipo float requiere cuatro bytes de
memoria, double requiere ocho bytes.

Tabla 2.4. Tipos de datos de coma flotante.


Tipo Java Rango de valores Precisión

......
float 3.4 x 10-38 3.4 x 1038 7 dígitos
-308 ......
double 1.7 x 10 1.7 x 10308 15 dígitos

Ejemplos
double d ; / / definición de d
d = 5.65 ; / / asignación
float x = -1.5F ; / / definición e inicialización
System.out.println (“d : ” + d); / / visualización
System.out.println (“x : ” + x);

Las constantes que representan números reales, coma flotante, Java las considera por
defecto de tipo double; para que una constante sea considerada de tipo float se añade el
sufijo f o F. También se puede expresar que una constante es de tipo double con el sufijo d o
D. Es importante tener en cuenta el tipo por defecto, ya que puede dar lugar a errores; así:

float t = 2.5 ;

Se comete un error al inicializar la variable t, ésta es de tipo float y la constante de tipo


double. La solución es sencilla: float t = 2.5F;.

32
- Caracteres (char)

Un carácter es cualquier elemento de un conjunto caracteres predefinido o alfabeto. Java fue


diseñado con el objetivo de poder ser utilizado en cualquier país, con independencia del tipo
de alfabeto. Para poder reconocer cualquier tipo de carácter, los elementos de este tipo
utilizan 16 bits, dos bytes, en vez de los ocho bits que utilizan la mayoría de los lenguajes de
programación. De esta forma Java puede representar el estándar Unicode, que recoge más
de 30000 caracteres distintos procedentes de las distintas lenguas escritas. La mayoría de
las computadoras utilizan el conjunto de caracteres ASCII, que se almacenan en el byte de
menor peso de un char; el valor inicial de los caracteres ASCII y también Unicode es
´\u0000´ y el último carácter ASCII, ´\u00FF´.
Java procesa datos carácter (tales como texto) utilizando el tipo de dato char. En unión con
la clase String, que se verá posteriormente, se puede utilizar para almacenar cadenas de
caracteres (grupos de caracteres). Se puede definir una variable de carácter escribiendo

char datoCar ;
char letra = ´A´;
char respuesta = ´S´ ;

Internamente, los caracteres se almacenan como números. La letra A, por ejemplo, se


almacena internamente como el número 65, la letra B es 66, la letra C es 67, etc.
Puesto que los caracteres se almacenan internamente como números, se pueden realizar
operaciones aritméticas con datos tipo char. Por ejemplo, se puede convertir una letra
minúscula a a una letra mayúscula A, restando 32 del código ASCII y convirtiendo el entero a
char. Así, para realizar la conversión, restar 32 del tipo de dato char, como sigue:

Char carUno = ´a´;



carUno = (char) (carUno – 32) ;

Esto convierte a (código ASCII 97) a A (código ASCII 65). De modo similar, añadiendo 32
convierte el carácter de letra mayúscula a minúscula:

carUno = (char) (carUno + 32) ;

Existen caracteres que tienen un propósito especial y no se pueden describir utilizando el


método normal. Java proporciona secuencias de escape. Por ejemplo, el literal carácter de
un apóstrofe se puede escribir como

´ \ ´´

y el carácter de nueva línea

´ \n ´

33
La tabla 2.5 enumera las diferentes secuencias de escape Java.

- El tipo de dato boolean

Los compiladores de Java incorporan el tipo de dato boolean cuyos valores son
«verdadero» (true) y «falso» (false). Las expresiones lógicas devuelven valores de este tipo.

Ejemplo
boolean bisiesto;
bisiesto = true ;
boolean encontrado, bandera ;

Dadas estas declaraciones, las siguientes asignaciones son todas válidas:

encontrado = true / / encontrado toma el valor verdadero


indicador = false / / indicador toma el valor falso
encontrado = indicador / / encontrado toma el valor de indicador

Las expresiones lógicas dan como resultado true o false; se forman con operandos
y operadores racionales o lógicos. Así, se pueden hacer estas asignaciones:

encontrado = (x > 2) && (x < 10) ; / /encontrado toma el valor de verdadero


/ /si x está comprendido entre 2 y 10

Las variables de tipo boolean se pueden inicializar a la vez que se definen, como el
resto de las variables. Así, se puede definir boolean sw = true ;
La mayoría de las expresiones lógicas aparecen en estructuras de control que
sirven para determinar la secuencia en que se ejecutan las sentencias Java.
Raramente se tiene la necesidad de leer valores boolean como dato de entrada o
de visualizar valores boolean como resultados de programa. Si es necesario, se
puede visualizar el valor de la variable boolean utilizando el método print ( ):

Int y = 9 ;
Boolean estaEnRango ;
estaEnRango = (y < -1) I I (y > 15) ;
System.out.println (“El valor de estaEnRango es ” + estaEnRango) ;

visualizará

El valor de estaEnRango es false

34
- El tipo void

void es una palabra reservada que se utiliza como tipo de retorno de un método. Ya se ha
utilizado para el método main ( ):

public static void main (String [ ] ars) ;

Los métodos devuelven un valor de un tipo de datos determinado, int, double … Por ejemplo:
int suma (int a, int b); se dice que es de tipo entero. Un método puede implementarse de tal
manera que no devuelva valor alguno, es en este caso cuando se utiliza void. Estos métodos
no devuelven valores:

void mostrar ( ) ;
void pantalla ( ) ;

En Java, la utilización de void es únicamente para el tipo de retorno de un método; no se


pueden definir variables de tipo void, es un error que el compilador le detecta. Así la
siguiente declaración:

void pntel ;

el compilador genera el error: Instance variables can`t be void: pntel

Actividad de proceso Nº 3

Haga una síntesis de los tipos de datos en Java, que se presentaron


precedentemente.

Tema 4. Constantes y variables

- Constantes

En Java pueden distinguirse dos tipos de constantes:

 Constantes literales.

35
 Constantes declaradas.

Las constantes literales son las más usuales; toman valores tales como 45.32564,222 o bien
“Introduzca sus datos ” que se escriben directamente en el texto del programa. Las
constantes declaradas son como variables: sus valores se almacenan en la memoria pero no
se pueden modificar.

- Constantes literales

Las constantes literales o constantes, en general, se clasifican también en cuatro grupos,


cada uno de los cuales puede ser de cualquiera de los tipos:

 Constantes enteras.
 Constantes caracteres.
 Constantes de coma flotante.
 Constantes de cadena.

- Constantes enteras

La escritura de constantes enteras requiere seguir unas determinadas reglas:

 No utilizar nunca comas ni otros signos de puntuación en números enteros


o completos.

123456 en lugar de 123.456

- Para forzar un valor al tipo long, terminar con una letra L mayúscula o minúscula (no
recomendable por confusión con el 1). Por ejemplo:

1024 es un tipo entero 1024L es un tipo largo (long)

- Una constante entera que empieza por 0 se considera en base 8, octal.

Formato decimal 123


Formato octal 0777 (están precedidas de la cifra 0)

- Para escribir una constante entera en hexadecimal, base 16, se utiliza el prefijo 0x, o
bien 0X. Constantes hexadecimales constan de dígitos y de las letras A, B, C, D, E, F,
tanto en mayúsculas como en minúsculas.

Formato hexadecimal 0XFF3A (están precedidas de 0x, o bien


0X).

36
- Constantes reales

Una constante en coma flotante representa un número real; siempre tienen signo y
representan aproximaciones en lugar de valores exactos.

82.347 .63 83. 47e-4 1.25E7

La notación científica se representa con un exponente positivo o negativo.

2.5E4 equivale a 25000


5.435E-3 equivale a 0.005435

Existen dos tipos de constantes:

float 4 bytes
double 8 bytes

Java asume las constantes reales de tipo double por defecto, así las constantes -12.5, 1E3
se guardan en tipo double. Si se tiene la inicialización de una variable de tipo float:

float x = 10.0 ;

el compilador genera un error debido a que 10.0 es de tipo double y x de tipo float.
Para que una constate real se considere de tipo float se añade el sufijo F o f : 11.5F, -1.44e-
2F; 2e8f. La inicialización float x = 10.0F; ahora es correcta.

- NaN e infinito

Infinito, tanto en positivo como en negativo, es una constante real que es el resultado de
ciertas funciones matemáticas; en muchos lenguajes de programación no se reconoce ese
valor, en Java sí. Por ejemplo:

System.out.println (“Log (0) = ” + Math.log (0.0)) ;

En pantalla sale:

Log (0) = - infinito

Hay funciones matemáticas que no está definidas para todos los números reales; de igual
forma, ciertas operaciones matemáticas no están definidas para ciertos valores (por ejemplo,
división por cero). El resultado de estas funciones matemáticas o de estas expresiones es
Not a Number o NaN. Así, siguiendo con la función logarítmica:

System.out.println (“Log (-1.0) = ” + Math.log (-1.0)) ;

37
En pantalla sale:

Log (-1.0) = NaN

Cuando en una expresión un operando sea NaN, toda la expresión será NaN. Esta clave es
un indicativo de que la expresión o la función matemática evaluada da un resultado que no
es un número. Es mejor que se obtenga NaN a obtener resultados numéricos incorrectos.

- Constantes de caracteres

Una constante carácter (char) es un carácter del conjunto universal de caracteres


denominado Unicode. Hay diversas formas de escribir un carácter, la más sencilla es
encerrado entre apóstrofes.

‘A’ ‘b’ ‘c’

Además de los caracteres ASCII estándar, una constante carácter soporta caracteres
especiales que no se pueden representar utilizando su teclado, como por ejemplo los
códigos ASCII altos y las secuencias de escape.
Así, por ejemplo, el carácter sigma (Σ) – código ASCII 228, en octal 344– se representa
mediante la secuencia de escape ‘\nnn’, siendo nnn el número octal del código ASCII. Por
ejemplo:

char sigma = ‘\344’ ;

Este método se utiliza para almacenar o imprimir cualquier carácter de la tabla ASCII por su
número octal. En el ejemplo anterior, la variable sigma no contiene cuatro caracteres, sino
únicamente el símbolo sigma. Con este formato ‘\nnn’ se representan todos los caracteres
ASCII, éstos están en el rango de 0 a 377 (0 a 255 en decimal), por tanto ocupan el byte de
menor peso de los dos bytes que utilizan las constantes carácter.
Ciertos caracteres especiales se representan utilizando una barra oblicua (\) y un código
entre simples apóstrofes, que se llama secuencia o código de escape. La tabla 2.5 muestra
diferentes secuencias de escape y su significado.

/ / Programa: Pruebas códigos de escape


class Codigo
{
public static void main (String [ ] ar)
{
char nuevaLinea = ‘\n’;
char bs = ‘\ \’;
System.out.println (“Salto: ” + nuevaLinea + “Secuencia escape ”) ;
System.out.println (“Back Slash: ” + bs) ;
}
}

38
Tabla 2.5. Caracteres secuencias (códigos) de escape.

Código de Escape Significado Códigos ASCII


Dec Hex

‘ \ n’ Nueva línea 13 10 OD OA
‘ \ r’ Retorno de carro 13 OD
‘ \ t’ Tabulación 9 09
‘ \ b’ Retroceso de espacio 8 08
‘ \ f’ Avance página 12 OC
‘ \ \’ Barra inclinada inversa 92 5C
‘ \’’ Comilla simple 39 27
‘ \" ‘ Doble comilla 44 22
‘ \ 000’ Número octal Todos Todos
‘ \ uhhhh’ Número hexadecimal Todos Todos

Otra forma de representar un carácter es con un formato hexadecimal: ´ \ uhhhh´, donde


hhhh son dígitos hexadecimales. Es denominado formato Unicode porque se puede escribir
cualquier carácter del conjunto universal. Por ejemplo:

Char hl = ‘ \ u000F’ ;
Char bs = ‘ \ u1111’ ;

- Aritmética con caracteres Java

Dada la correspondencia entre un carácter y su código Unicode, es posible realizar


operaciones aritméticas sobre datos de caracteres. Observe el siguiente segmento de
código:

char c;
c = ‘T’+ 5 ; / / suma 5 al carácter ASCII (Unicode)

en caso de compilar esas dos sentencias, la suma daría error. No por estar sumando un
carácter con un entero, sino por asignar un dato entero (32 bits) a una variable carácter (16
bits). Con una conversión se soluciona el problema:

c = (char) (‘T’ + 5) ;

Realmente lo que sucede es que se almacena Y en c. El valor ASCII de la letra T es 84, y al


sumarle 5 produce 89, que es el código de la letra Y. A la inversa, se pueden almacenar
constantes de carácter en variables enteras. Así:

39
int j = ‘p’

no pone una letra p en j, sino que asigna el valor 80 – código ASCII de p – a la variable j.

- Constantes cadena

Una constante cadena (o también llamada literal cadena o simplemente cadena) es una
secuencia de caracteres encerrados entre dobles comillas. Algunos ejemplos de constantes
de cadena son:

““ / / cadena vacía
“123”
“12 de octubre 1492”
“esto es una cadena”

Se pueden concatenar cadenas, escribiendo

“ABC” + “DEF” + “GHI” +


“JKL”

que equivale a

“ABCDEFGHIJKL”

Entre los caracteres de una cadena se puede incluir cualquier carácter, incluyendo los de la
secuencia de escape. La siguiente cadena contiene un tabulador y un fin de línea:

“\ tEl día de la apertura es: \ n \ t15 de octubre 2001 ”

Una cadena no puede escribirse en más de una línea, tampoco es problema, ya que se parte
en cadenas más cortas y se concatena con el operador +.
Las cadenas en Java son objetos, no es un tipo básico como por ejemplo el tipo int; el tipo de
una cadena es String, clase que se encuentra en el paquete java.lang. Son, como todos los
objetos, constantes o inmutables; una vez creado no puede cambiarse. Se pueden formar
tantas cadenas como sean necesarias en nuestros programas, cada cadena será un nuevo
objeto (objeto sin nombre).
Recuerde que una constante de caracteres se encierra entre comillas simples, y las
constantes de cadena encierran caracteres entre dobles comillas. Por ejemplo:

‘Z’ “Z”

El primer ‘Z’ es una constante carácter simple con una longitud de 1, y el segundo “Z” es una
constante de cadena de caracteres también con la longitud 1. La diferencia es que la
constante de cadena es un objeto String, y el carácter es un dato de tipo simple, char, que se
almacena en dos bytes de memoria. Por consiguiente, no puede mezclar constantes
caracteres y cadenas de caracteres en su programa.

40
- Constantes declaradas final

El cualificador final permite dar nombres simbólicos a constantes de otros lenguajes,


como C++, Pascal… El formato general para crear una constante es:

finaltipo nombre = valor ;

final int MESES = 12; / / Meses es una constante simbólica valor 12


final char CARACTER = ´@´;
final int OCTAL = 0233 ;
final String CADENA = “Curso de Java” ;

Java soporta el calificador de tipo variable final. Especifica que el valor de una
variable no se puede modificar durante el programa, se puede decir que el valor
asociado es el valor «final» y por tanto no puede ser cambiado. Cualquier intento de
modificar el valor de la variable definida con final producirá un mensaje de error.

Final int SEMANA = 7


Final char CAD [ ] = { ‘J’, ‘a’, ‘v’, ‘a’, ‘ ‘, ‘o’, ‘r’, ‘b’, ‘i’} ;

Sintaxis de final

final tipoDato nombreConstante = valorConstante ;


final long TOPE = 07777777;
final char CH = ´S´;

Recomendación

Los identificadores de valores constantes, identificadores de variables final, se


acostumbra a escribirlos en mayúsculas.

- Variables

En Java, una variable es una posición con nombre en memoria donde se almacena un valor
de un cierto tipo de dato. Las variables de tipos de datos básicos, tipos primitivos, almacenan
datos correspondientes con el tipo. Las variables de clases, variables de objeto, son
referencias al objeto. Una constante, por el contrario, es una variable cuyo valor no puede
ser modificado.
Una variable típicamente tiene un nombre (un identificador) que describe su propósito. Toda
variable utilizada en un programa debe ser declarada previamente. La definición en Java
puede situarse en cualquier parte del programa. Una definición reserva un espacio de

41
almacenamiento en memoria. El procedimiento para definir (crear) una variable de tipo
primitivo, como int, double, …, es escribir el tipo de dato, el identificador o nombre de la
variable, y en ocasiones, el valor inicial que tomará. Por ejemplo,

char respuesta ;

significa que se reserva espacio en memoria para respuesta, un carácter ocupa dos bytes.
El nombre de una variable ha de ser un identificador válido. Es frecuente, en la actualidad,
utilizar subrayados o carácter $ en los nombres, bien al principio o en su interior, con objeto
de obtener mayor legibilidad y una correspondencia mayor con el elemento del mundo real
que representa.

salario dias_de_semana edad_alumno _fax $doblon

- Declaración

Una declaración de una variable es una sentencia que proporciona información de la variable
al compilador Java. Su sintaxis es:

tipo variable

tipo es el nombre de un tipo de dato conocido por Java,


variable es un identificador (nombre) válido en Java.

Ejemplo
long dNumero ;
double HorasAcumuladas,
HorasPorSemana,
NotaMedia
Es preciso declarar ;
las variables antes de utilizarlas. Se puede declarar una variab le
short DiaSemana;
en tres lugares:
 En una clase, como miembro de la clase.
 Al principio de un método o bloque de código.
 En el punto de utilización.

- En una clase como miembro de la clase

La variable se declara como un miembro de la clase, al mismo nivel que los métodos de la
clase. Estas variables están disponibles por todos los métodos de la clase.

class Suerte

42
{
int miNumero ;
void entrada ( )
{
miNumero = 29 ;
}
void salida ( )
{
System.out.println (“Mi número de la suerte es ” + miNumero);
}
}

En esta clase la variable miNumero puede utilizarse en cualquier método, así como se ha
hecho en los métodos entrada y salida ( ).

- Al principio de un bloque de código

Este es el medio para declarar una variable en método o en un bloque de código dentro de
un método.
Long factor (int n)
{
int k ;
long f ;
f = 1L ;
for (k = 1; k<n; k++)
{
long aux = 10;

}
}
En este método las variables k y f está definidas en el método; son variables locales del
método y se pueden utilizar en el ámbito del método; la variable aux está definida en l bloque
del bucle for, y por tanto su ámbito es el bloque.

- En el punto de utilización

Java proporciona gran flexibilidad en la declaración de variables, ya que es posible declarar


una variable en el punto donde se vaya a utilizar. Esta propiedad se utiliza mucho en el
diseño de bucles, es posible declarar la variable en el momento de su utilización.

for (int j = 0; j < 10; j ++)


{
/ /…
}

En otros lenguajes, las declaraciones se han de situar siempre al principio del programa,
mientras que en Java, las declaraciones se pueden mezclar con sentencias ejecutables. Su
ámbito es el bloque en el que están declaradas.

43
Ejemplo
/ / Distancia a la luna en kilómetros
class LaLuna
{ public static void main (String [ ] ar)
{
final int Luna = 238857; / / distancia en millas
System.out.println (“Distancia a la Luna” + Luna + “millas”) ;
double lunaKilo ;
lunaKilo = LUNA*1.609; / / una milla = 1.609 kilómetros
System.out.println (“En kilómetros es” + lunaKilo + “Km”) ;
}
}

Ejemplo 2.3
Este ejemplo muestra como una variable puede ser declarada en cualquier parte
de un programa Java.
class Declaracion

{ public static void main (String [ ] ar)


{
int x, y1 ; / / declarar a las variables x e y1
x = 75 ;
y1 = 89 ;
int y2 = 50 ; / / declarar a variable y2 inicializándola en 50
System.out.println (x + “,” + y1 + “,” + y2) ;
}
}

- Inicialización de variables

En algunos programas anteriores se ha proporcionado un valor denominado valor inicial a


una variable cuando se declara. El formato general de una declaración de inicialización es:

tipo nombre_variable = expresión

expresión es cualquier expresión válida cuyo valor es del mismo tipo que tipo.
Nota. Esta sentencia declara y proporciona un valor inicial a una variable.

Las variables se pueden inicializar a la vez que se declaran, o bien inicializarse después de
la declaración. El primer método es probablemente el mejor en la mayoría de los casos, ya
que se combina la definición de la varible con la asignación de su valor inicial.

char respuesta = ´S´;


int contador = 1 ;
float peso = 156.45F ;

44
int anyo = 1992 ;

Estas acciones crean variables respuesta, contador, peso y anyo, que almacenan en
memoria los valores respectivos situados a su derecha.
El segundo método consiste en utilizar sentencias de asignación diferentes después de
definir la variable, como en el siguiente caso:

char barra ;
barra = ´\ ´;

- Declaración o definición

La diferencia entre declaración y definición es sutil. Una declaración introduce un nombre de


un objeto o de una variable y asocia un tipo con la variable /objeto. Una definición es una
declaración que asigna simultáneamente memoria al objeto/variable.

double x ; / / declara y define la variable x de tipo double


char cvar ; / / declara y define cvar de tipo char
int i ; / / definido pero no inicializado
int i = 0 ; / / definido e inicializado a cero
String s ; / / declara s como referencia a un objeto

- Duración de una variable

Dependiendo del lugar donde se definan las variables de Java, estas se pueden utilizar en la
totalidad del programa, dentro de un método, o pueden existir sólo temporalmente dentro de
un bloque de un método. La zona de un programa en la que una variable está activa se
denomina, normalmente, ámbito o alcance («scope»).
En general, el ámbito (alcance) de una variable se extiende desde la sentencia que la define
hasta los límites del bloque que la contiene o la liberación del objeto al que pertenece. Según
el ámbito, los tipos básicos de variables en Java son:

 Variables locales.
 Variables de clases.

- Variables locales

Las variables locales son aquellas definidas en el interior de un método y son visibles sólo en
ese método específico. Las reglas por las que se rigen las variables locales son:

1. En el interior de un método, una variable local no puede ser modificada por


ninguna sentencia externa al método.
2. Los nombres de las variables locales no han de ser únicos. Dos, tres o más
métodos – por ejemplo – pueden definir variables de nombre interruptor. Cada
variable es distinta y pertenece al método en que está declarada.

45
3. Las variables locales de los métodos no existen en memoria hasta que se
ejecuta el método. Esta propiedad permite ahorrar memoria, ya que permite que
varios métodos compartan la misma memoria para sus variables locales (pero
no a la vez).

Por la razón dada en el punto 3, las variables locales también se llaman automáticas o auto,
ya que dichas variables se crean automáticamente en la entrada al método y se liberan
también automáticamente cuando se termina la ejecución del método.

void sumar ( )
{
int a, b, c ; / / variables locales
int numero ; / / variable local
a = (int) Math.Random ( ) *999 ;
b = (int) Math.Random ( ) *999 ;
c = (int) Math.Random ( ) *999 ;
numero = a + b + c ;
System.out.println (“Suma de tres números aleatorios ” + numero) ;
}

- Variables de clase

Los miembros de una clase son métodos o variables; las variables de clases se declaran en
una clase fuera de los métodos; al menos son visibles desde cualquier método de la clase y
se referencian simplemente con su nombre.

class Panel
{
int a, b, c ; / / declaración de variables miembro de la clase
double betas ( )
{
double x ; / / declaración local

a = 21 ; / / esta variable es visible por ser de la clase
}
int valor ; / / declaración de variable de clase
double alfas ( )
{
float x ; / / declaración local

b = 19 ; / / esta variable es visible por ser de la clase
valor = 0 ; / /desde un método de una clase se puede / /acceder a
cualquier variable
valor = valor + a + b ;

46
}
//…
}

Nota

Todas las variables locales desaparecen cuando termina su bloque. Una


variable de clase por defecto es visible en toda la clase, en todos los métodos de
las clases del mismo paquete y en todas las clases declaradas en el mismo
programa. En este sentido se puede decir que una variable de clase es global
(visible) desde el punto en que se define hasta el final del programa (archivo
fuente).

A una variable declarada en una clase se le asigna memoria cuando se crea un objeto de la
clase; la memoria asignada permanece a través de la ejecución del programa, hasta que el
objeto es liberado automáticamente, o bien liberado por terminar la ejecución del programa.

Actividad de proceso Nº 4

Haga un ejemplo de cada tipo de constante y de variable en Java

Tema 5. Entradas y salidas

En java, la entrada y salida se lee y se escribe en flujos (streams). La fuente básica de


entrada de datos es el teclado y la fuente de salida de datos es la pantalla. La clase System
define dos referencias a objetos static para la gestión de la entrada y de la salida por
consola:

System.in para entrada por teclado.


System.out para salida por pantalla.

El primero es una referencia a un objeto de la clase BufferedInputStream en la cual hay


diversos métodos para poder captar caracteres tecleados. El segundo es una referencia a un
objeto de la clase PrintStrem con métodos, como print ( ), para la salida por pantalla.

47
- Salida (System out)

El objeto out definido en la clase System está asociado con el flujo de salida, que dirige los
datos a consola y permite visualizarlos en la pantalla de su equipo. Así, por ejemplo:

System.out.println (“Esto es una cadena ”) ;

Visualiza: Esto es una cadena

System.out es una referencia a un objeto de la clase PrintStream, tiene métodos que se


utilizarán con mucha frecuencia.

print ( ) transfiere una cadena de caracteres al buffer de la pantalla.


println ( ) transfiere una cadena de caracteres y el carácter de fin de línea al
buffer de la pantalla.
flush ( ) el buffer con las cadenas almacenadas se vuelca en la pantalla.

Con estos métodos se puede describir cualquier cadena o dato de los tipos básicos.

System.out.println (“Viaje relámpago a ” + “ la comarca de las Hurdes ”) ;

Con el operador + se concatenan las dos cadenas, la cadena formada se envía al buffer de
pantalla para visualizarla cuando termine el programa o bien se fuerce con el método flush (
).
Como argumento de print ( ) o println ( ) no sólo se ponen cadenas, sino también constantes
o variables de los tipos básicos, int, double, char …; el método se encarga de convertir a
cadena esos datos. Así:

Int x = 500 ;
System.out.print (x) ;

De igual modo, se pueden concatenar cadenas con caracteres, enteros… Se utiliza el


operador +, que internamente realiza la conversión:

double r = 2.0 ;
double area = Math.PI*r*r ;
System.out.println (“Radio = ” + r + “,” + “area: ” + area) ;

Java utiliza secuencias de escape para visualizar caracteres que no están representados por
símbolos tradicionales, tales como \ n, \ t, etc. Las secuencias de escape proporcionan
flexibilidad en las aplicaciones mediante efectos especiales; en la Tabla 2.5 se muestran las
secuencias de escape.

System.out.print (“ \n Error – Pulsar una tecla para continuar \n ”) ;


System.out.print (“ Yo estoy preocupado \ n ” +
“no por el funcionamiento \ n ” +

48
“sino por la claridad . \ n ”) ;

la última sentencia visualiza

Yo estoy preocupado
no por el funcionamiento
sino por la claridad.

Debido a que la secuencia de escape ´ \ n ´ significa nueva línea o salto de línea.

- Entrada (System.in)

La clase System define un objeto de la clase BufferedInputStream, cuya referencia viene


dada por in. El objeto está asociado al flujo estándar de entrada, que por defecto es el
teclado. Los elementos básicos de este fluyo son caracteres individuales, no cadenas como
ocurre con el objeto out. Entre los métodos de la clase se encuentra read ( ), que devuelve el
carácter actual en el buffer de entrada. Por ejemplo:

char c ;
c = (char) System.in.read ( ) ;

No resulta práctico captar la entrada carácter a carácter, es preferible hacer línea a línea.
Para ello se utiliza primero la clase InputStreamReader, de la que se crea un objeto
inicializado con System.in:

InputStreamReader en = new InputStreamReader (System.in) ;

Este objeto que se crea se utiliza a su vez como argumento para inicializar otro objeto de la
clase BufferedReader, que ya permite captar líneas de caracteres del teclado con el método
readLine ( ):

String cd ;
BufferedReader entrada = new BufferedReader (en) ;
System.out.print (“Introduzca una línea por teclado: ”) ;
System.out.flush ( );
cd = entrada.readLine ( );
System.out.println (“Línea de entrada: ” + cd) ;

El método readLine devuelve, crea, un objeto cadena (tipo String) con la línea la leída; la
referencia a ese objeto se asigna, en el fragmento de código anterior, a cd, que es una
variable de tipo String. También se ha utilizado el método flush ( ) para que la cadena
enviada al buffer de salida de la pantalla se escriba en ese momento y no espere a que
termine la ejecución del programa.
El objeto de la clase BufferedReader se puede crear de una sola tacada, de una sola
sentencia, es la forma habitual en que aparece en los programas.

BufferedReader entrada = new BufferedReader

49
new InputStreamReader (System.in) ) ;

Nota

System.out y System.in son referencias a objetos asociados a flujos de datos de


salida por pantalla y de entrada por teclado respectivamente.

Nota

readLine ( ) «lanza» la excepción IOException. Para evitar error en tiempo de


compilación, en main ( ) se añade throws IOException.

Nota

readLine ( ) devuelve una cadena de tipo String con la línea actual tecleada.
Además:
 Se ha de asignar a una variable String.
 Devuelve null si se ha terminado el texto, fin de fichero.

Ejemplo 2.4
¿Cuál es la salida del siguiente programa, si se introducen por teclado las letras
LJ?

class Letras
{
public static void main (String [ ] ar)
{
char primero, ultimo;
System.out.print (“Introduzca su primera y última inicial: ”) ;
System.out.flush ( ) ;
primero = (char) System.in.read ( ) ;
ultimo = (char) System.in.read ( ) ;
System.out.print (“Hola, ” + primero + “,” + ultimo + “.! \ n ”) ;
}
}

Actividad de proceso Nº 5

Desarrolle un programa en Java que permita ingresar desde el teclado las


iniciales correspondientes a un nombre y un apellido.

50
Tema 6. Clases correspondientes a los tipos básicos

Java incorpora unos tipos básicos como int, long, char …, además proporciona la
declaración de una clase para cada uno de los tipos básicos, denominadas clases
envoltorios.
Estas clases están en el paquete java.lang, este se incorpora automáticamente en todo
programa de Java. Resultan útiles para entrada de datos desde el teclado, ya que tienen
métodos que convierten una cadena al tipo básico que se corresponde con la clase. A
continuación se describen las más utilizadas para entrada de datos desde consola.

- Clase Integer

Esta clase se corresponde con el tipo básico entero, cada objeto de esta clase contiene un
entero de tipo int. Ahora las variables de tipo clase Integer son referencias a objetos que se
crean con el operador new. El constructor que se aplica al crear un objeto de esta clase tiene
como argumento un número entero:

Integer n ;
n = new Integer (15) ;

n es una referencia al objeto creado que se ha inicializado en el valor 15.

Nota

Para crear un objeto Integer:

int valor ;
Integer n = new Integer (valor)

Además del constructor, la clase tiene diversos métodos, algunos de los cuales se describen
a continuación.

parseInt ( )
Es un método static que tiene como argumento una cadena y devuelve el valor entero
correspondiente a la conversión de los dígitos de la cadena. Si la conversión no es posible
genera un error, una excepción, en tiempo de ejecución.

static int parseInt (String cad) ;

El ser un método static implica que se llama desde la clase y no desde un objeto de la clase,
por ejemplo:

int k ;
k = Integer.parseInt (“145”) ;
int h = Integer.parseInt (“- 86”) ;

51
los valores de k y h son 145, - 86 respectivamente.
Este método se utiliza con mucha frecuencia para entrada de datos enteros desde el teclado.
Primero se crea un objeto asociado con el teclado, se lee a continuación una línea con el
número entero tecleado y con parseInt ( ) se convierte a dato int.

BufferedReader entrada = new BufferedReader (


new InputStreamReader (System.in)) ;
String cd ;
int dato ;
System.out.print (“Introduzca un dato entero: ”) ;
System.out.flush ( ) ;
cd = entrada.readLine ( ) ;
dato = Integer.parseInt (cd) ;

Se puede simplificar concatenando llamadas:

dato = Integer.parseInt (entrada.readLine ( )) ;

Entradas válidas que se pueden introducir:

234
-33

Sin embargo, si se teclea la cadena:

-22 45

resulta un error al ejecutarse, sólo se puede introducir un dato entero.

intValue ( )
Este método devuelve el valor entero que tiene almacenado el objeto.

int intValue ( ) ;

Por ejemplo:

int k ;
Integer n = new Integer (27) ;
k = n.intValue ( ) ; / / el valor de k es 27

toString

Este método devuelve el dato entero en forma de cadena de dígitos. Este método lo tienen
todos los objetos y transforma el objeto en su representación en forma de cadena.

String toString ( ) ;

52
- Clase Long

Esta clase se corresponde con el tipo entero largo, un objeto de esta clase contiene
(envuelve) un entero tipo long. Una variable declarada de tipo Long son referencias a objetos
que se crean con el operador new. El constructor que se llama al crear un objeto de esta
clase tiene como argumento un número entero largo:

Long k ;
k = new Long (1988815L) ;
k es una referencia al objeto creado que se ha inicializado al argumento 1988815L.
Los métodos de la clase Long son similares a los de la clase Integer, permiten convertir una
cadena a entero largo, devolver el entero almacenado, longValue ( )…

- Clases float y double

Estas clases se corresponden con el tipo float y double respectivamente; resultan útiles para
entrada de datos desde el teclado y también para colecciones de elementos de tipo float y
double, con la clase Vector. Como todas las clases envoltorio, el constructor de objetos de
estas clases tiene como argumento un dato del tipo básico con el que se corresponden. Por
ejemplo:

Float g ;
g = new Float (1.59E3F) ;
Double d = new Double (1.5) ;
g es una referencia al objeto creado que se ha inicializado a 1.59E3F y d una referencia al
objeto Double inicializado con el valor 1.5.

Nota

Para crear un objeto Float: Para crear un objeto Double:


float x ; double z ;
Float f = new Float (x) ; Double d = new Double (z) ;

Estas clases no tienen un método similar a parseInt ( ) que convierte una cadena a entero,
por lo que resulta un poco más complicada la entrada de datos en como flotante desde el
teclado. Los pasos a seguir para entrada de un tipo de dato double:

1. Crear el objeto para entrada asociado con el dispositivo estándar de entrada, el


teclado. Este objeto se utiliza para cualquier entrada.

BufferedReader entrada = new BufferedReader (


New InputStreamReader (System.in));

2. Crear un objeto Double con el método de la clase valueOf ( ).

Double d ;
String cd ;

53
cd = entrada.readLine ( ) ;
d = Double.valueOf (cd) ;

se pueden concatenar las llamadas:

d = Double.valueOf (entrada.readLine ( )) ;

3. Obtener el dato Double del objeto con el método doubleValue ( ).

double x ;
x = d.doubleValue ( ) ;

Para entrada de un número de tipo float se siguen los mismos pasos, utilizando un objeto
Float y en vez de doubleValue() el método floatValue(), ya que se utilizan clases del paquete
para la entrada.
Ejemplo 2.5
Dada la base y la altura de un triángulo, calcular su área.

Se supone que los datos para calcular el área se obtienen del dispositivo de
entrada, el teclado. De forma interactiva se piden al usuario para que los introduzca
uno por línea. Se convierten a datos de tipo double y por último se escribe el área.
Es necesario incorporar el paquete java.io, ya se utilizan clases del paquete para la
entrada.
import java.io.* ;
class Area
{ public static void main (String [ ] ar) throws IOException
{ double base, altura ;
Double d ;
String cd ;
BufferedReader entrada = new BufferedReader (
new InputStreamReader (System.in))
System.out.print (“Base del Triángulo: ”) ;
System.out.flush ( ) ;
cd = entrada readLine ( ) ;
d = Double.valueOf (cd) ;
base = d.doubleValue ( ) ;
/ / ahora se pide la altura; se concatenan llamadas.
System.out.print (“Altura del Triángulo: ”) ;
System.out.flush ( ) ;
d = Double.valueOf (entrada.readLine ( )) ;
altura = d.doubleValue ( ) ;
//
System.out.println (“El área = ” + base*altura / 2) ;
}
}

54
Actividad de proceso Nº 6

Desarrollar un programa Java que permita el ingreso del radio de un círculo,


calcule su área y la muestre en pantalla.

Tema 7. Operadores y expresiones

Los programas Java incluyen datos, sentencias de programas y expresiones. Una expresión
es, normalmente, una ecuación matemática, tal como 3*x+5*z. En esta expresión, los
símbolos más y producto ( + , * ) son los operadores de suma y producto, los números 3 y 5,
y las variables x, y se llaman operandos. En síntesis, una expresión es una secuencia de
operaciones y operandos que especifica un cálculo.
Cuando se utiliza + entre números (o variables) se denomina operador binario, debido a que
el operador + suma dos números. Otro tipo de operador de Java es el operador unitario
(«unario»), que actúa sobre un único valor. Si la variable x contiene el valor 5, - x es el valor -
5. El signo menos (-) es el operador unitario menos.
Java soporta un conjunto potente de operadores unitarios, binarios y de otros tipos.
Sintaxis

variable = expresión
variable identificador válido Java declarado como variable.
expresión una constante, otra variable a la que se ha asignado previamente un
valor o una fórmula que se ha evaluado y cuyo tipo es el de variable.

Una expresión es un elemento de un programa que toma un valor. En algunos


casos puede también realizar una operación.
Las expresiones pueden ser valores constantes o variables simples, tales
como 25 o ´Z´; pueden ser valores o variables combinadas con operadores (a ++,
m == n, etc.) ; o bien pueden ser valores combinados con métodos tales como
Math.cos (1.5).

55
- Operador de asignación

El operador = asigna el valor de la expresión derecha a la variable situada a su izquierda.

codigo = 3467 ;
fahrenheit = 123.456 ;
coordX = 525 ;
coordY = 725 ;

Este operador es asociativo por la derecha, eso permite realizar asignaciones múltiples. Así:

a = b = c = 45 ;

equivale a

a = (b = (c = 45)) ;

o dicho de otro modo, a las variables a, b y c se les asigna el valor 45. Esta propiedad
permite inicializar varias variables con una sola sentencia:

int a, b, c ;
a = b = c = 5; / / se asigna 5 a las variables a, b y c.

Además del operador de asignación =, Java proporciona cinco operadores de asignación


adicionales. En la Tabla 2.6 aparecen los seis operadores de asignación.
Estos operadores de asignación actúan como una notación abreviada para expresiones
utilizadas con frecuencia. Así, por ejemplo, si se desea multiplicar 10 por i, se puede escribir

i = i * 10 ;

Tabla 2.6 Operadores de asignación de Java

Símbolo Uso Descripción


= a = b Asigna el valor de b a a.
*= a *= b Multiplica a por b y asigna el resultado a la variable a.
/= a /= b Divide a entre b y asigna el resultado a la variable a.
%= a %= b Fija a al resto de a/b.
+= a += b Suma b y a y lo asigna a la variable a.
-= a -= b Resta b de a y asigna el resultado a la variable a.

Java proporciona un operador abreviado de asignación (*=) que realiza una asignación
equivalente

i *= 10 ; equivale a i = i * 10 ;

56
Tabla 2. 7 Equivalencia de operadores de asignación
Operador Sentencia abreviada Sentencia no abreviada

+= m += n m =m +n;
-= m-= n m =m –n;
*= m*= n m =m *n;
/= m/=n m =m /n;
%= m %= n m =m %n;

Estos operadores de asignación no siempre se utilizan, aunque los programadores en Java


se acostumbran a su empleo por el ahorro de escritura que suponen.

- Operadores aritméticos

Los operadores aritméticos sirven para realizar operaciones aritméticas básicas. Los
operadores aritméticos Java siguen las reglas algebraicas típicas de jerarquía o prioridad.
Estas reglas especifican la precedencia de las operaciones aritméticas.

Considere la expresión

x+ t *2

De acuerdo a las citadas reglas, la multiplicación se realiza antes que la suma. Por
consiguiente, la expresión anterior equivale a:

x + (t * 2)

En Java, como en la mayoría de los lenguajes, las expresiones interiores a paréntesis se


evalúan primero; a continuación, se realizan los operadores unitarios, seguidos por los
operadores de multiplicación, división, resto, suma y resta.

Tabla 2.8 Operadores aritméticos


Operador Tipos enteros Tipos reales Ejemplo
+ Suma Suma 4+5
– Resta Resta 7–3
* Producto Producto 4*5
/ División entera: conciente División en coma flotante 8/5
% División entera: resto 12 % 5

57
Tabla 2.9 Precedencia de operadores matemáticos básicos
Operador Operación Nivel de Precedencia
+, – (unarios) + 25, - 6.745 1

*, /, % 5 * 5 es 25 2
25 / 6 es 4
25%6 es 1

+, – 2 + 3 es 5 3
2 – 3 es –1

Obsérvese que los operadores + y –, cuando se utilizan delante de un operador, actúan


como operadores unitarios + y –.

+ 75 / / 75 significa que es positivo


– 154 / / 154 significa que es negativo
Ejemplo 2.6

1. ¿Cúal es el resultado de la expresión: 6 + 2 * 3 – 4/2?

6+ 2*3 –4/2

6+6 –4/2

6+6 –2

12 – 2

10

2. ¿ Cuál es el resultado de la expresión: 5 * (5+ (6 – 2)+ 1)?

5 * (5 + (6 – 2) + 1)

5 * ( 5 + 4 + 1)

5 * 10
50

- Asociatividad

En una expresión tal como

r= 3

58
r* 4+5

el compilador realiza primero la multiplicación – por tener el operador * prioridad más alta – y
luego la suma, por tanto, produce 17. para forzar un orden en las operaciones se debe
utilizar paréntesis

r * (4 + 5)

produce 27, que 4 +5 se realiza en primer lugar.

La asociatividad determina el orden en que se agrupan los operadores de igual prioridad; es


decir, de izquierda a derecha o de derecha a izquierda. Por ejemplo:

h–5+w se agrupa como (h – 5) + w

ya que – y +, que tienen igual prioridad, tienen asociatividad de izquierda a derecha. Sin
embargo,

x= y = z

se agrupa como

x = (y = z)

ya que su asociatividad es de derecha a izquierda.

Tabla 2.10 Prioridad y asociatividad


Prioridad (mayor a menor) Asociatividad
+, – (unarios) izquierda – derecha

*, /, % izquierda – derecha

+, – izquierda – derecha

59
Ejemplo 2.7 ¿Cuál es el resultado de la expresión: 7 * 10 – 5 % 3 * 4 + 9 ?

Existen tres operadores de prioridad más alta (*, % y *)

70 – 5 % 3 * 4 + 9

La asociatividad es a izquierda, por consiguiente se ejecuta a continuación %

70 – 2 * 4 + 9

y la segunda multiplicación se realiza a continuación, produciendo

70 – 8 + 9

Las dos operaciones restantes son de igual prioridad, y como la asociatividad


es a izquierda, se realizará la resta primero y se obtiene el resultado

62 + 9

y por último se realiza la suma y se obtiene el resultado final de

71

- Uso de paréntesis

Los paréntesis se pueden usar para cambiar el orden usual de evaluación de una expresión
determinada por su prioridad y asociatividad. Las subexpresiones entre paréntesis se
evalúan en primer lugar según el modo estándar y los resultados se combinan para evaluar
la expresión completa. Si los paréntesis están «anidados» - es decir, un conjunto de
paréntesis contenido en otro – se ejecutan en primer lugar los paréntesis más internos. Por
ejemplo, considérese la expresión

(7 * (10 – 5) % 3) * 4 + 9

La subexpresión (10 – 5) se evalúa primero, produciendo

(7 * 5 % 3) * 4 + 9

A continuación se evalúa de izquierda a derecha la subexpresión (7 * 5 % 3)

( 35 % 3) * 4 + 9

seguida de

60
2*4+9

Se realiza a continuación la multiplicación obteniendo

8+9

y la suma produce el resultado final

17

Precaución

Se debe tener cuidado en la escritura de expresiones que contengan dos o más


operaciones para asegurarse que se evalúan en el orden previsto. Incluso aunque
no se requieran paréntesis, deben utilizarse para clarificar el orden concebido de
evaluación y escribir expresiones complicadas en términos de expresiones más
simples. Es importante, sin embargo, que los paréntesis estén equilibrados – cada
paréntesis a la izquierda tiene un correspondiente paréntesis a la derecha que
aparece posteriormente en la expresión –, ya que si existen paréntesis
desequilibrados se producirá un error de compilación.

((8 – 5) + 4 – (3 + 7) error de compilación, falta paréntesis final a la


derecha.

- Operadores de incrementación y decrementación

De las muchas características de Java heredadas de C ++ y de C, una de las más útiles son
los operadores de incremento ++ y decremento --. Los operadores ++ y -- , de nominados de
incrementación y decrementación, suman o restan 1 a su argumento, respectivamente, cada
vez que se aplican a una variable.

Tabla 2.11 Operadores de incrementación (++) y decrementación (--)


Incrementación Decrementación
++ n --n
n+=1 n-=1
n = n+1 n = n-1

Por consiguiente, a ++ es igual que a = a + 1. Las sentencias

++ n ;
n ++ ;

61
tienen el mismo efecto; así como

--n;
n--;

Sin embargo, cuando se utilizan como expresiones tales como

m = n ++ ;

o bien,

System.out.print ( - - n) ;

++ n produce un valor que es mayor en uno que el de n ++, y - - n produce un valor que es
menor en uno que el valor de n - -.

int a = 1, b ;
b = a ++ ; / / b vale 1 y a vale 2

int a = 1, b ;
b = ++ a ; / / b vale 2 y a vale 2

Nota

Si los operadores ++ y - - están de prefijos, la operación de incremento se efectúa


antes que la operación de asignación; si lo operadores ++ y - - están de sufijos, la
asignación se efectúa en primer lugar y la incrementación o decrementación a
continuación.

Ejemplo

int i = 10 ;
int j ;

j = i ++ ; / / primero asigna 10 a j, después incrementa i en 1

62
Ejemplo 2.8 Demostración del funcionamiento de los operadores de
incremento/decremento.

Se escribe un programa y se visualiza el contenido de expresiones enteras con los


operadores ++ y - -.

class Incremento
{
public static void main (String [ ] a)
{
int m = 45, n = 75 ;
System.out.println (“m = ” + m + “n = ” + n) ;
++ m ;
--n;
System.out.println (“m = ” + m + “n = ” + n) ;
m ++ ;
n--;
System.out.println (“m = ” + m + “n = ” + n) ;
}
}

Ejecución

m = 45, n = 75
m = 46, n = 74
m = 47, n = 73

Ejemplo 2.9 Diferencias entre operadores de preincremento y posincremento.

El programa que se escribe es un sencillo test de los operadores de incremento y


decremento.

class Decremento
{
public static void main (String [ ] arg)
{
int m = 99, n ;
n = ++ m ;
System.out.println (“m = ” + m + “n = ” + n) ;
n = m ++ ;
System.out.println (“m = ” + m ++) ;
System.out.println (“m = ” + m ++) ;
}
}
63
Ejecución

m = 100, n = 100
m = 101, n = 100
m = 101
m = 103
Ejemplo 2.10 Orden de evaluación no predecible en expresiones.

El programa visualiza el resultado de aplicar los operadores de incremento y


decremento en una sola llamada println ( ).

class OrdenOut
{
public static void main (String [ ] a)
{
int n = 5, t ;
t = ++ n * - - n ;
System.out.println (“n = ” + n + “t = ” + t) ;
System.out.println (++ n + “ ” + ++ n + “ ” + ++n ) ;
System.out.println (“m = ” + m ++) ;
}
}

Ejecución

n = 5, t = 30
6 7 8

El resultado de la expresión será 30, debido a que en la asignación de t, n se incrementa a 6


(primer operando) y a continuación se decrementa a 5 (segundo operando) antes de que se
evalúe el operador producto, calculando 6 * 5. Por último, las tres subexpresiones se evalúan
de izquierda a derecha y el resultado será de 6 7 8.

- Operadores relacionales

En Java, el tipo de datos boolean tiene dos valores: true y false. Una expresión booleana es
por consiguiente una secuencia de operandos y operadores que se combinan para producir
uno de los valores true y false.

Nota

En Java es erróneo utilizar el valor entero 0 como false y distinto de cero como true.

64
Operadores tales como > = y == que comprueban una relación entre dos operandos se
llaman operadores relacionales y se utilizan en expresiones de la forma

expresión 1 operador_relacional expresión 2


expresión 1 y expresión 2 expresiones compatibles Java
operador_relacional un operador de la Tabla 5.7

Los operadores relacionales se usan normalmente en sentencias de selección (if) o de


iteración (while, for), que sirven para comprobar una condición. Utilizando operadores
relacionales se realizan operaciones de igualdad, desigualdad y diferencias relativas. La
tabla 2.12 muestra los operadores relaciones que se pueden aplicar a operandos de
cualquier tipo de dato estándar: char, int, float, double, etc.
Cuando se utilizan los operadores relacionales en una expresión, la evaluación produce
como resultado true o false, dependiendo del resultado de la condición. Por ejemplo, si se
escribe:

boolean c ;
c = 3<7;

la variable c pone a true, dado que 3 es menor que 7, entonces la operación < devuelve un
valor de true, que asigna a c.

Tabla 2.12 Operadores relacionales de Java


Operador Significado Ejemplo
== Igual a a == b
!= No igual a a != b
> Mayor que a > b
< Menor que a < b
>= Mayor o igual que a >= b
<= Menor o igual que a <= b

Precaución

Un error típico entre programadores experimentados, es confundir el operador de


asignación (=) con el operador de igualdad (==).

65
Ejemplos
 Si x, a, b y c son de tipo double, número es int e inicial es de tipo char, las
siguientes expresiones booleanas son válidas:
x > 5.75
b * b >= 5.0 * a * c
numero == 100
inicial != ´S´
 En datos numéricos, los operadores relacionales se utilizan normalmente para
comparar. Así, si x = 3.1, la expresión x < 7.5 produce el valor true.
De modo similar, si número = 27, la expresión numero == 100 produce el valor
false.
 Los caracteres se comparan utilizando los códigos numéricos (código
UNICODE).
´A´ < ´C´ es verdadera (true), ya que A es el código 65 y es menor que
el código 67 de C.
´a´ < ´c´ es verdadera (true): a (código 97) y b (código 99)
´b´ < ´B´ es falsa (false), ya que b (código 98) no es menor que B
(código 66).
Los operadores relacionales tienen menor prioridad que los operadores
aritméticos, y asociatividad de izquierda a derecha. Por ejemplo,
m + 5 <= 2 * n equivale a (m + 5) <= (2 * n)

Los operadores relacionales permiten comparar dos valores. Así, por ejemplo
con if significa sí, se verá más adelante.
if (notaAsignatura < 9)

comprueba si notaAsignatura es menor que 9. En caso de desear comprobar


si la variable y el número son iguales, entonces utilizar la expresión
if (notaAsignatura == 9)

Si por el contrario se desea comprobar si la variable y el número no son


iguales, entonces utilice la expresión
- Operadores lógicos
if (notaAsignatura != 9)

66
Además de los matemáticos, Java tiene también operadores lógicos. Estos operadores se
utilizan con expresiones para devolver un valor verdadero (true) o un valor falso (false). Los
operadores lógicos se denominan también operadores booleanos, en honor de George
Boole, creador del álgebra de Boole.
Los operadores lógicos de Java son: not (!), and (&&), or (I I) y or exclusivo (^). El
operador lógico ! (not, no) produce falso si operando es verdadero y viceversa. El operador
lógico && (and, y) produce verdadero sólo si ambos operandos son verdadero; si cualquiera
de los operandos es falso, produce falso. El operador lógico I I (or, o) produce verdadero si
cualquiera de los operandos es verdadero y produce falso sólo si ambos operandos son
falsos. El operador lógico ^ (or exclusivo) produce verdadero si ambos operandos son
distintos (verdadero-falso, falso-verdadero) y produce falso sólo si ambos operandos son
iguales (verdadero-verdadero, falso-falso). Además, hay que considerar que Java permite
utilizar &, I como operadores and y or respectivamente, con el mismo significado que el ya
expuesto, salvo en lo relativo a la evaluación en cortocircuito. La Tabla 2.13 muestra los
operadores lógicos de Java.

Tabla 2.13 Operadores lógicos


Operador Operación lógica Ejemplo
Negación (!) no lógica ! ( x >= y)
O exclusiva (^) operando_1^ operando_2 x<n^n>9
Y lógica operando_1 && operando_2 m < n && i > j
O lógica II operando_1 II operando_2 m = 5 I I n != 10

Tabla 2.14 Tabla de verdad del operador lógico NOT (!)


Operando (a) !a
Verdadero Falso
Falso Verdadero

Tabla 2.15 Tabla de verdad del operador lógico or exclusivo (^)


Operandos
a b a^b
Verdadero Verdadero Falso
Verdadero Falso Verdadero
Falso Verdadero Verdadero
Falso Falso Falso

Tabla 2.16 Tabla de verdad del operador lógico AND (&&)


Operandos
a b a && b
Verdadero Verdadero Verdadero
Verdadero Falso Falso
Falso Verdadero Falso
Falso Falso Falso 67
Tabla 2.17 Tabla de verdad del operador lógico OR ( I I )
Operandos
a b aIIb
Verdadero Verdadero Verdadero
Verdadero Falso Verdadero
Falso Verdadero Verdadero
Falso Falso Falso

Al igual que los operandos matemáticos, el valor de una expresión formada con operadores
lógicos, depende de: a) el operador, b) sus argumentos. Con operadores lógicos existen sólo
dos valores posibles para expresiones: verdadero y falso. La forma más usual de mostrar los
resultados de operaciones lógicas es mediante las denominadas tablas de verdad, que
muestran como funcionan cada uno de los operadores lógicos.

Ejemplos

1. !( x == 5)
(a > 5) && (ch == ´S´)
(b > 3) I I (ch == ´N´)

Los operadores lógicos se utilizan en expresiones condicionales y mediante


sentencias if, while o for, que se analizarán posteriormente. Así, por
ejemplo, la sentencia if (si la condición es verdadera/falsa) se utiliza para
evaluar operadores lógicos.

2. if (( a < b) && (c > d))


{
System.out.println (“Los resultados no son válidos”) ;
}

Si la variable a es menor que b y, al mismo tiempo, c es mayor que d,


entonces visualizar el mensaje: Los resultados no son válidos.

3. if ((ventas > 50000) I I (horas < 100))


{
prima = 100000 ;
}

Si la variable ventas es mayor que 50000 o bien la variable horas es menor


que 100, entonces asignar a la variable prima el valor 100000.

4. if (!(ventas < 2500))


{
prima = 12500 ;
}

En este ejemplo, si ventas no es menor que 2500, se inicializará prima al


valor 12500.

5. if ((x < 5) ^ (b < 19)


{ 68
System.out.println (“Par de valores no válidos”) ;
}
Se visualiza el mensaje Par de valores no válidos para valores de x
menores que 5 y de b mayores o igual que 19; o bien, para valores de x
mayores o igual que 5 y de b menores que 19.

Nota

El operador ^ tiene mayor prioridad que !, que a su vez tiene prioridad más alta que
&&, y éste a su vez tiene mayor prioridad que I I. La asociatividad es de izquierda a
derecha.
La precedencia de los operadores es: los operadores matemáticos tienen precedencia sobre
los operadores relacionales, y los operadores relacionales tienen precedencia sobre los
operadores lógicos.
La siguiente sentencia:

if (ventas < salMin * 3 && anyos > 10 * iva) …

equivale a

if ((ventas < (salMin * 3)) && (anyos > (10 * iva)))…

- Evaluación en cortocircuito

En Java, los operandos de la izquierda de && y I I se evalúan siempre en primer lugar; si el


valor del operando de la izquierda determina de forma inequívoca el valor de la expresión, el
operando derecho no se evalúa. Esto significa que si el operando de la izquierda es && es
falso o el de I I es verdadero, el operando de la derecha no se evalúa. Esta propiedad se
denomina evaluación en cortocircuito y se debe a que si p es falso, la condición p && q es
falsa, con independencia del valor de q, y de este modo Java no evalúa q. De modo similar,
si p es verdadera la condición p I I q es verdadera, con independencia del valor de q, y Java
no evalúa q.

Ejemplo 2.11 Supongamos que se evalúa la expresión

( x > 0.0) && (Math.log (x) >= 2.)

Dado que en una operación lógica Y (&&) si el operando de la izquierda ( x > 0.0)
es falso (x es negativo o cero), la expresión lógica se evalúa a falso y, en
consecuencia, no es necesario evaluar el segundo operando. En el ejemplo
anterior, la expresión evita calcular el logaritmo de números (x) para los cuales no
está definida la función log ( ).

La evaluación en cortocircuito tiene dos beneficios importantes:

1. Una expresión booleana se puede utilizar para guardar una operación


potencialmente insegura en una segunda expresión booleana.
2. Se puede ahorrar una considerable cantidad de tiempo en la evaluación
de condiciones complejas.

69
Ejemplo 2.12 Los beneficios anteriores se aprecian en la expresión booleana

( n != 0) && (x < 1.0 / n)

ya que no se puede producir un error de división por cero al evaluar esta expresión,
pues si n es 0, entonces la primera expresión

n != 0

es falsa y la segunda expresión

(x < 1.0 / n)

no se evalúa. De modo similar, tampoco se producirá un error de división por cero


al evaluar la condición

( n == 0) I I (x > 5.0 / n)

ya que si n es 0, la primera expresión

n == 0

es verdadera y entonces no se evalúa la segunda expresión

x > 5.0 / n

- Operador coma

El operador coma permite combinar dos o más expresiones separadas por comas en una
sola línea. Se evalúa primero la expresión de la izquierda y luego las restantes expresiones
de izquierda a derecha. El uso del operador como es como sigue:

expresión 1 , expresión 2 , expresión 3 , …, expresión n

Cada expresión se evalúa comenzando desde la izquierda y continuando hacia la derecha.


Por ejemplo, en
int i = 10, j = 25 ;

dado que el operador coma se asocia de izquierda a derecha, la primera variable está
declarada e inicializada antes que la segunda variable j. Se utiliza en algunas ocasiones en
los bucles for para anidar expresiones. Por ejemplo:

double z ;
int j ;

for (j = 0, z = 1.0; j <= 99; j += 2, z += j) ;

70
Nota

El operador coma tiene la menor prioridad de todos los operadores Java, y se asocia
de izquierda a derecha.

- Operadores ., ( ), [ ]

Java utiliza como operadores la selección de elementos de un objeto, la llamada a un


método y el acceso a un elemento de un array.

- El operador .

El operador punto (.) permite acceder a un miembro de un objeto, siempre que la visibilidad
del miembro lo permita. La sintaxis:

objeto.miembro

- El operador ( )

El operador ( ) es el operador de llamada a métodos. Sirve para encerrar los argumentos del
método o función, efectuar conversiones explícitas de tipo, indicar en el seno de una
declaración que un identificador corresponde a un método, resolver los conflictos de
prioridad entre operadores.

- El operador [ ]

Sirve para dimensionar los arrays y designar un elemento de un array.


Ejemplos de ello:

double v [ ] ; / / declara un array de elementos de tipo double


System.out.println (“v [2] = ” + v [2] ) ; / / escribe el elemento 2 de v
return v [ i-INFERIOR] ; / / devuelve el elemento i-INFERIOR

- Conversiones de tipos

Con frecuencia se necesita convertir un valor de un tipo u otro sin cambiar el valor que
representa. Las conversiones de tipo pueden ser implícitas (ejecutadas automáticamente) o
explícitas (solicitadas específicamente por el programador). Java en algunas circunstancias
hace conversiones de tipos automáticamente:

 Java convierte valores cuando se asigna un valor de tipo numérico a una variable
de otro tipo numérico siempre que no haya pérdida de información (precisión …).
 Java convierte valores cuando se combinan tipos mixtos en expresiones.

71
 Java convierte valores cuando se pasan argumentos a métodos siempre que no
supongo pérdida de precisión.

- Conversión implícita

Los tipos fundamentales (básicos) pueden ser mezclados libremente mediante


expresiones. Las conversiones se ejecutan automáticamente: los operandos de tipo
más bajo se convierten en los de tipo más alto.

int i = 12 ;
double x = 4.0 ;
x=x+i; / / valor de i se convierte en double antes de sumar

En las asignaciones, la expresión a la derecha del operador = se convierte al tipo de la


varible de la izquierda siempre que ésta sea de un tipo más alto.

long ht ;
int m ;
double x ;
float z ;
x = z*m + ht*2 / * la expresión z*m es de tipo float; ht*2 de tipo long, y
toda la expresión de tipo float. Hay una conversión
automática a tipo double. * /
m = ht*5 / / asignación incorrecta, tipo long más alto que int
z = 5.0*x + 7.0 ; / / asignación incorrecta, double más alto que float

Reglas

 Si cualquier operando es de tipo char, short o byte se convierte en tipo int.


 Las constantes enteras se consideran de tipo int. Las constantes reales se
consideran de tipo double. Así, float x = 1.0 ; es erróneo debido a que 1.0 es
de tipo double, se debería escribir: float x = (float) 1.0 ;
 Si los operandos tienen diferentes tipos, la siguiente lista determina a qué tipo
se convertirá. Esta operación se llama promoción integral.

int
long
float
double

El tipo que viene primero es esta lista se convierte en el que viene segundo. Por
ejemplo si los tipos operandos son int y long, el operando int se convierte en long.

72
- Conversiones explícitas

Java fuerza la conversión explícita de tipos mediante el operador molde (cast). El operador
molde tiene el formato:
(tiponombre) valor / / convierte valor a tiponombre
(float) i ; / / convierte i a float

El operador molde (tipo) tiene la misma prioridad que otros operadores unitarios tales como
+, - y !
short f ;
int precios ;
precios = (int) 19.99 + (int) 11.99 ;
f = (short) 25 ; / / convierte 25 a entero corto.

- Operador + con cadenas de caracteres

Para facilitar el manejo de cadenas, y sobre todo para que la salida de datos por un
dispositivo sea más amigable, Java ha redefinido el operador suma (+) para concatenar
cadenas. Así, por ejemplo, la expresión:
“Hola ” + “amigo ” + “Luis ”

da lugar a la cadena:
“Hola amigo Luis ”

Esta sobrecarga o redefinición del operador + con cadenas permite conversiones


automáticas de datos de tipo simple a cadena. Así, por ejemplo:
int x ;
x = 91 ;
String cad = “Valor de x = ” + x ;

La cadena referenciada por cad: “Valor de x = 91”. La conversión ha sido automática, no es


necesario llamar a métodos de conversión. Esta propiedad se usa con mucha frecuencia
para salida de datos con el método print ( ), o bien println ( ). Ambos tienen como argumento
una cadena, por tanto se puede hacer muy amigable la salida de datos de tipo simple
utilizando el operador + junto a una cadena. Por ejemplo:
double z ;
int annos = 9 ;
System.out.println (“Años transcurridos: ” + annos +
“ \ n Capital generado: ” + z) ;

Hay que tener precaución, ya que el operador + con dos operandos numéricos realiza la
suma de ellos y no escribe ambos. Así, por ejemplo:
int x = 9 ;
int y = 10 ;
System.out.println ( x + y ) ;

La operación realizada en println ( )es x + y, que en este ejemplo es 19, y a continuación,


transmitir ese valor a println ( ), internamente 19 se convierte en cadena y se imprime.

73
- Prioridad y Asociatividad

La prioridad o precedencia de operadores determina el orden en el que se aplican los


operadores a un valor. Los operadores Java vienen en una tabla con dieciocho grupos. Los
operadores del grupo 1 tienen mayor prioridad que los del grupo 2, y así sucesivamente:
 Si dos operadores se aplican al mismo operando, el operador con mayor prioridad
se aplica primero.
 Todos los operadores del mismo grupo tienen igual prioridad y asociatividad.
 Si dos operandos tienen igual prioridad, el operador con prioridad más alta se
aplica primero.
 La asociatividad izquierda-derecha significa aplicar el operador más a la izquierda
primero, y en la asociatividad derecha-izquierda se aplica primero el operador más
a la derecha.
 Los paréntesis tienen la máxima prioridad.

Prioridad Operadores Asociatividad


1 new (creación objetos) I-D
2 .[] () I–D
++ -- (prefijo) D–I
3 ++ -- (postfijo) I–D
4 ~!-+ D–I
5 (type) D–I
6 */ % I–D
7 << >> >>> I–D
8 < <= > >= I–D
9 == != I–D
10 & I–D
11 ^ I–D
12 I I–D
13 && I–D
14 II I–D
16 = *= /= %= + = -= D–I
17 , (operador coma) I–D

I – D: Izquierda – Derecha
D – I: Derecha – Izquierda

74
Actividad de proceso Nº 7

Haga una síntesis de los operadores mencionados en este punto, con un


ejemplo de cada uno de ellos.

Respuestas a las Actividades de Proceso

5. Desarrolle un programa en Java que permita ingresar desde el teclado las iniciales
correspondientes a un nombre y un apellido.

class Letras
{
public static void main (String [ ] ar)
{
char nombre, apellido;
System.out.print (“Introduzca las iniciales de su nombre y su apellido: ”) ;
System.out.flush ( ) ;
nombre = (char) System.in.read ( ) ;
apellido = (char) System.in.read ( ) ;
System.out.print (“Inicial nombre: ” + nombre + “,” +” Inicial apellido: “+
apellido) ;
}
}

6. Desarrollar un programa Java que permita el ingreso del radio de un círculo, calcule su
área y la muestre en pantalla.

/*
Desarrollar un programa Java que permita el ingreso del radio
de un círculo, calcule su área y la muestre en pantalla.
*/

import java.io.*;
class Circulo
{public static void main(String []arg) throws IOException
{BufferedReader entrada=new BufferedReader(new InputStreamReader(System.in));
String cadena;
Double D;
double radio,area;

75
System.out.print(" Ingrese el radio : ");
cadena =entrada.readLine();
D=Double.valueOf(cadena);
radio=D.doubleValue();
area=3.1416*radio*radio;
System.out.println(" El area del circulo es :"+area);
}
}

Actividades de Autoevaluación

1. Escribir un programa Java que solicite al usuario el largo y el ancho de una


habitación, y que calcule y muestre el área y perímetro de la misma.

2. Ingrese desde el teclado un tiempo en segundos y expréselo en minutos y


segundos.

76

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy