Unidad 2 Elementos Basicos Del Lenguaje Java
Unidad 2 Elementos Basicos Del Lenguaje Java
Unidad 2 Elementos Basicos Del Lenguaje Java
1
ORIENTACIÓN DEL APRENDIZAJE
Al finalizar esta unidad, usted estará en condiciones de alcanzar los siguientes objetivos:
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
Expresiones Predicados
Aritméticas
Relacionales
Lógicas
3
Tema 1. Estructura general de un programa en Java. Creación, ejecución,
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.
Declaraciones de clases.
El método main ( ).
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 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:
Advertencia
- 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 ;
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 ;
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 ;
import casa.* ;
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:
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:
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 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.
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( ):
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:
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:
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) ;
}
- 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:
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:
/*
Programa : Saludo.java
Programador : Alberto Fort
Descripción : Primer programa Java
Fecha creación : 17 de Agosto 2004
Revisión : Ninguna
*/
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 (//):
//
// Programa : Saludo.java
// Programador : Alberto Fort
13
// Revisión : Ninguna
//
Ejemplo 2.2
/*
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:
Máquina
Verifica Byte Code Virtual Java
15
Para crear un programa se utilizan las siguientes etapas:
class OtroSaludo
{
public static void main (String [ ] ar)
{
System.out.println (“Hola Anita ” + ar [ 0 ] ) ;
}
}
16
Teclado Editor de Texto del
Ratón Texto programa
Archivo
fuente
Java OtroSaludo
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.
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
Paquetes-clases
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
Sí
Errores de
sintaxis
No
Comprobar errores
Errores e Sí
tiempo de
ejecución
No
Fin
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:
- 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):
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:
- 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.
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:
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 ;
}
}
}
- 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
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.
24
- Identificadores
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:
- 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.
- Comentarios
En Java hay dos formatos para escribir los comentarios en los programas:
//…
/*…*/
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 ;
import nombrePaquete.nombreClase ;
import nombrePaquete.* ;
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á:
Actividad de proceso Nº 2
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.
29
Los tipos fundamentales de datos en Java son:
char, byte, short, int, long, float, double y boolean son palabras reservadas, o más
específicamente, especificadores de tipos.
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.
- 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:
30
Así, por ejemplo:
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 ;
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:
Java soporta dos formatos de coma flotante (Tabla 2.4). El tipo float requiere cuatro bytes de
memoria, double requiere ocho bytes.
......
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 ;
32
- Caracteres (char)
char datoCar ;
char letra = ´A´;
char respuesta = ´S´ ;
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:
´ \ ´´
´ \n ´
33
La tabla 2.5 enumera las diferentes secuencias de escape Java.
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 ;
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:
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á
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 ( ):
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 ( ) ;
void pntel ;
Actividad de proceso Nº 3
- 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
Constantes enteras.
Constantes caracteres.
Constantes de coma flotante.
Constantes de cadena.
- Constantes enteras
- 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:
- 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.
36
- Constantes reales
Una constante en coma flotante representa un número real; siempre tienen signo y
representan aproximaciones en lugar de valores exactos.
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:
En pantalla sale:
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:
37
En pantalla sale:
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
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:
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.
38
Tabla 2.5. Caracteres secuencias (códigos) de escape.
‘ \ 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
Char hl = ‘ \ u000F’ ;
Char bs = ‘ \ u1111’ ;
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) ;
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”
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:
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
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.
Sintaxis de final
Recomendación
- 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.
- 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
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.
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 ( ).
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
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
- Inicialización de variables
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.
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
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:
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
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
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:
Con estos métodos se puede describir cualquier cadena o dato de los tipos básicos.
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) ;
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.
48
“sino por la claridad . \ n ”) ;
Yo estoy preocupado
no por el funcionamiento
sino por la claridad.
- Entrada (System.in)
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:
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.
49
new InputStreamReader (System.in) ) ;
Nota
Nota
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
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) ;
Nota
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.
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.
234
-33
-22 45
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 ( )…
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
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:
Double d ;
String cd ;
53
cd = entrada.readLine ( ) ;
d = Double.valueOf (cd) ;
d = Double.valueOf (entrada.readLine ( )) ;
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
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.
55
- Operador de asignación
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.
i = i * 10 ;
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;
- 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)
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
6+ 2*3 –4/2
6+6 –4/2
6+6 –2
12 – 2
10
5 * (5 + (6 – 2) + 1)
5 * ( 5 + 4 + 1)
5 * 10
50
- Asociatividad
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)
ya que – y +, que tienen igual prioridad, tienen asociatividad de izquierda a derecha. Sin
embargo,
x= y = z
se agrupa como
x = (y = z)
*, /, % izquierda – derecha
+, – izquierda – derecha
59
Ejemplo 2.7 ¿Cuál es el resultado de la expresión: 7 * 10 – 5 % 3 * 4 + 9 ?
70 – 5 % 3 * 4 + 9
70 – 2 * 4 + 9
70 – 8 + 9
62 + 9
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
(7 * 5 % 3) * 4 + 9
( 35 % 3) * 4 + 9
seguida de
60
2*4+9
8+9
17
Precaució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.
++ n ;
n ++ ;
61
tienen el mismo efecto; así como
--n;
n--;
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
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.
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
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.
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
- 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
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.
Precaución
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)
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.
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´)
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:
equivale a
- Evaluación en cortocircuito
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 ( ).
69
Ejemplo 2.12 Los beneficios anteriores se aprecian en la expresión booleana
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
(x < 1.0 / n)
( n == 0) I I (x > 5.0 / n)
n == 0
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:
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 ;
70
Nota
El operador coma tiene la menor prioridad de todos los operadores Java, y se asocia
de izquierda a derecha.
- Operadores ., ( ), [ ]
- 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 [ ]
- 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
int i = 12 ;
double x = 4.0 ;
x=x+i; / / valor de i se convierte en double antes de sumar
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
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.
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 ”
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 ) ;
73
- Prioridad y Asociatividad
I – D: Izquierda – Derecha
D – I: Derecha – Izquierda
74
Actividad de proceso Nº 7
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
76
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: