Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NDICE
PRLOGO............................................................................................................ 21
RA-MA
Secuencias de escape........................................................................................... 56
Tipos de datos Primitivos .................................................................................... 57
Variables.............................................................................................................. 58
Tipos de datos de una variable ........................................................................ 59
Declaracin de variables.................................................................................. 60
Asignacin....................................................................................................... 61
Literales ........................................................................................................... 61
mbito de las variables ................................................................................... 62
Valores por defecto de una variable ................................................................ 64
Conversiones de tipo ....................................................................................... 64
Conversiones implcitas............................................................................... 65
Conversiones explcitas ............................................................................... 66
Constantes ....................................................................................................... 67
Operadores........................................................................................................... 67
Aritmticos ...................................................................................................... 67
Asignacin....................................................................................................... 69
Asignacin de referencias y asignacin de valores ..................................... 70
Condicionales .................................................................................................. 72
Comparacin de tipos bsicos ..................................................................... 72
Igualdad de objetos...................................................................................... 73
Lgicos ............................................................................................................ 74
Operadores a nivel de bits ............................................................................... 75
Operador instanceof......................................................................................... 76
Operador condicional ...................................................................................... 77
El recolector de basura de Java............................................................................ 77
Instrucciones de control....................................................................................... 78
Instruccin if.................................................................................................... 79
La instruccin switch ....................................................................................... 80
La instruccin for ............................................................................................ 82
La instruccin while ........................................................................................ 83
Salida forzada de un bucle............................................................................... 84
break ............................................................................................................ 85
continue ....................................................................................................... 85
Arrays .................................................................................................................. 86
Declaracin...................................................................................................... 86
Dimensionado de un array............................................................................... 87
Acceso a los elementos de un array................................................................. 87
Paso de un array como argumento de llamada a un mtodo............................ 89
Array como tipo de devolucin de un mtodo................................................. 90
Recorrido de arrays con for-each .................................................................... 91
Arrays multidimensionales .............................................................................. 93
Recorrido de un array multidimensional ..................................................... 94
Arrays multidimensionales irregulares ........................................................ 94
RA-MA
NDICE 9
Tipos enumerados................................................................................................ 95
Definicin de un tipo enumerado .................................................................... 97
Clases de enumeracin .................................................................................... 98
Constructores y mtodos de una enumeracin ................................................ 99
Constructores............................................................................................... 99
Mtodos ..................................................................................................... 100
Mtodos con nmero variable de Argumentos.................................................. 101
Cuestiones de autoevaluacin............................................................................ 103
Listado de las prcticas...................................................................................... 105
PRCTICA 2.1 ............................................................................................. 105
PRCTICA 2.2 ............................................................................................. 107
CAPTULO 3. CLASES DE USO GENERAL ................................................ 109
Organizacin de clases: los paquetes................................................................. 110
Ventajas de la utilizacin de paquetes........................................................... 111
Importar clases y paquetes de clases ............................................................. 111
Paquetes de uso general................................................................................. 112
La especificacin del API J2SE..................................................................... 113
Gestin de cadenas: la clase String.................................................................... 115
Creacin de objetos String............................................................................. 115
Inmutabilidad de objetos String..................................................................... 116
Principales mtodos de la clase String .......................................................... 117
La clase Math .................................................................................................... 120
Constantes pblicas ....................................................................................... 120
Mtodos ......................................................................................................... 120
Importaciones estticas.................................................................................. 122
Utilizacin de fechas ......................................................................................... 122
La clase Date ................................................................................................. 123
La clase Calendar .......................................................................................... 124
Creacin de un objeto Calendar................................................................. 124
Mtodos de la clase Calendar .................................................................... 125
Clases de envoltorio .......................................................................................... 126
Encapsulamiento de un tipo bsico ............................................................... 127
Conversin de cadena a tipo numrico.......................................................... 127
Autoboxing .................................................................................................... 128
Entrada y salida en Java .................................................................................... 129
Salida de datos............................................................................................... 130
Salida con formato......................................................................................... 131
El mtodo printf() ...................................................................................... 131
Sintaxis de la cadena de formato ............................................................... 131
Entrada de datos ............................................................................................ 134
Scanners......................................................................................................... 137
Creacin de un objeto scanner................................................................... 137
RA-MA
RA-MA
NDICE 11
RA-MA
RA-MA
NDICE 13
RA-MA
RA-MA
NDICE 15
RA-MA
Modificadores................................................................................................ 438
Clases annimas ................................................................................................ 439
Definicin de una clase annima................................................................... 439
Clase annima como argumento de mtodo.................................................. 441
Clases internas estticas .................................................................................... 442
Instanciacin de la clase interna .................................................................... 442
CAPTULO 11. OBJETIVOS DEL EXAMEN JAVA SUN CERTIFIED
PROGRAMMER 310-055.............................................................................. 445
Objetivo 1: declaracin, inicializacin y mbito ............................................... 446
Declaraciones de elementos........................................................................... 446
Declaracin de una clase ........................................................................... 446
Declaracin de una interfaz ....................................................................... 448
Declaracin de una enumeracin............................................................... 449
Herencia de una clase abstracta ..................................................................... 450
Implementacin y herencia de una interfaz ................................................... 450
Palabras reservadas e identificadores ............................................................ 451
Variables y tipos de datos.............................................................................. 452
Tipos de datos............................................................................................ 452
Variables.................................................................................................... 453
Declaracin, construccin e inicializacin de arrays..................................... 454
Declaracin................................................................................................ 455
Construccin.............................................................................................. 455
Inicializacin ............................................................................................. 456
Array annimo........................................................................................... 456
Asignaciones de referencias a array .......................................................... 457
Utilizacin de variables de array no inicializadas ..................................... 457
Declaracin y utilizacin de mtodos............................................................ 458
Declaracin de un mtodo ......................................................................... 458
Mtodos estticos ...................................................................................... 459
Mtodos en clases JavaBeans .................................................................... 459
Mtodos con nmero variable de argumentos ........................................... 460
Sobrescritura y sobrecarga de mtodos ......................................................... 461
Definicin y utilizacin de constructores ...................................................... 464
Objetivo 2: control de flujo ............................................................................... 466
Utilizacin de las instrucciones if y switch.................................................... 466
Instruccin if..else...................................................................................... 467
switch......................................................................................................... 467
Utilizacin de bucles ..................................................................................... 470
while .......................................................................................................... 470
for .............................................................................................................. 470
for-each ..................................................................................................... 471
Uso de break y continue ............................................................................ 472
RA-MA
NDICE 17
RA-MA
Comodines..................................................................................................... 509
Mtodos genricos......................................................................................... 512
Otras peculiaridades sobre genricos ............................................................ 513
Uso de instanceof con genricos ............................................................... 514
Genricos y arrays ..................................................................................... 514
Colecciones genricas y no genricas ....................................................... 515
Ordenacin de arrays y colecciones de objetos ............................................. 516
Las interfaces Comparable y Comparator ................................................. 516
Ordenacin de una coleccin..................................................................... 519
Ordenacin de un array de objetos ............................................................ 521
Bsqueda de objetos en un array/coleccin................................................... 522
Conversin de array a coleccin y de coleccin a array................................ 524
Objetivo 7: fundamentos ................................................................................... 526
Uso de los modificadores de acceso .............................................................. 527
Argumentos de la lnea de comandos ............................................................ 527
Paso de referencias a objetos y tipos primitivos a mtodos........................... 528
El Recolector de Basura ................................................................................ 529
Comportamiento del recolector de basura ................................................. 529
Situaciones que provocan la recoleccin de un objeto .............................. 529
Reconocer en qu punto un objeto es elegido para recoleccin ................ 531
Requerir la ejecucin del recolector .......................................................... 532
El mtodo finalize() ................................................................................... 532
Organizacin y distribucin de clases ........................................................... 533
Ficheros JAR ............................................................................................. 533
Utilizacin de classpath ............................................................................. 534
Utilizacin de operadores .............................................................................. 537
Operadores de asignacin.......................................................................... 537
Operadores aritmticos .............................................................................. 539
Operadores relacionales............................................................................. 539
Operador instanceof................................................................................... 540
Operadores lgicos .................................................................................... 542
Igualdad de objetos.................................................................................... 543
APNDICES .............................................................................................545
A. CLASES PARA LA CREACIN DE
APLICACIONES GRFICAS...................................................................... 547
AWT.................................................................................................................. 547
Component .................................................................................................... 547
Mtodos destacables .................................................................................. 547
Container ....................................................................................................... 548
Mtodos destacables .................................................................................. 548
Window ......................................................................................................... 549
RA-MA
NDICE 19
Frame............................................................................................................. 549
Button ............................................................................................................ 550
Label .............................................................................................................. 550
TextComponent ............................................................................................. 551
TextField ....................................................................................................... 552
TextArea ........................................................................................................ 552
Ckeckbox....................................................................................................... 553
CheckboxGroup............................................................................................. 555
List................................................................................................................. 555
Choice............................................................................................................ 556
Panel .............................................................................................................. 557
Swing................................................................................................................. 557
JComponent................................................................................................... 557
AbstractButton............................................................................................... 557
JFrame ........................................................................................................... 558
JLabel ............................................................................................................ 559
JTextField ...................................................................................................... 559
JButton........................................................................................................... 560
JRadioButton ................................................................................................. 561
ButtonGroup .................................................................................................. 561
JCheckBox..................................................................................................... 562
B. JAVA 6 ............................................................................................................ 563
Nuevas capacidades del API Java Swing .......................................................... 564
El API Desktop.................................................................................................. 564
Nuevas caractersticas de seguridad .................................................................. 565
Establecimiento de permisos en ficheros y directorios...................................... 566
Actualizacin a JDBC 4.0 ................................................................................. 566
C. SOLUCIN A LAS CUESTIONES DE
AUTOEVALUACIN ................................................................................... 569
D. PREGUNTAS TIPO DE EXAMEN............................................................. 579
NDICE ALFABTICO .................................................................................... 617
PRLOGO
A da de hoy, el nmero de libros publicados en castellano sobre Java es
enormemente extenso. En este escenario cabe pues preguntarse qu tiene de
particular el presente libro.
Programador Java 2 Certificado no pretende ser una especie de Biblia de
Java, ms bien lo que puede distinguir a este libro de otros es su particular enfoque
didctico.
Consciente de la dificultad que entraa el aprendizaje de un lenguaje de
programacin como Java a travs de un manual, he utilizado mis siete aos de
experiencia en la enseanza de este lenguaje para intentar plasmar los conceptos de
una forma sencilla, clara y encadenada, procurando seguir un orden lgico en las
explicaciones que evitase en lo posible los saltos hacia adelante y hacia atrs en la
exposicin de los temas. Cada tema o concepto que se explica viene adems
acompaado de un ejemplo prctico para ayudar a su comprensin.
A lo anterior se debe aadir el hecho de que ste es de los pocos libros de
Java en castellano, orientados a la obtencin de la Certificacin Java Sun.
OBJETIVOS
El objetivo de este libro es conseguir que el lector adquiera un profundo
conocimiento del lenguaje Java, proporcionndole al mismo tiempo la ayuda
RA-MA
A QUIN VA DIRIGIDO
Este libro est dirigido a programadores en cualquier lenguaje que, sin
tener conocimientos de Java, quieran adentrarse en este lenguaje de programacin
y adquirir una slida formacin sobre el mismo.
Tambin aquellos programadores Java que quieran obtener la Certificacin
pueden encontrar este libro como una til herramienta para la preparacin del
examen. En l se exponen algunos conceptos que son desconocidos por los
programadores, debido a que su uso pasa mucha veces desapercibido en el
desarrollo cotidiano de las aplicaciones, pero que son de gran importancia para la
consecucin del examen.
RA-MA
PROLOGO 23
Parte I
Engloba los captulos comprendidos entre el 1 y el 9. El captulo 1 nos
introduce las caractersticas de la tecnologa Java y nos proporciona la base
necesaria para comenzar a crear programas en Java, lenguaje cuyos elementos
sintcticos son analizados en el captulo 2.
El captulo 3 presenta las clases de uso general ms importantes incluidas
en la plataforma, mientras que el captulo 4 se dedica al estudio de uno de los
pilares bsicos de la programacin Java: la programacin orientada a objetos. En el
captulo 5 se analiza el mecanismo de excepciones Java como medio para capturar
y tratar errores provocados por la aplicacin durante la ejecucin de la misma.
Tras el estudio de la sintaxis del lenguaje y los elementos de soporte, los
captulos 6, 7 y 8 se centran en el empleo de Java en dos importantes reas del
desarrollo, stas son el acceso a datos y la creacin de entornos grficos.
Finalmente, el captulo 9 est dedicado a la creacin de aplicaciones
multitarea que es uno de los aspectos ms potentes, y a la vez complejos, que nos
ofrece Java.
Parte II
Esta parte consta de los captulos 10 y 11. Por un lado, el captulo 10 nos
adentra en uno de los aspectos ms extravagantes de la programacin Java: las
clases anidadas. Se trata de un modelo de programacin cada vez menos utilizado
en el desarrollo de aplicaciones, sin embargo, gran parte de las cuestiones de
examen utilizan esta estructura sintctica.
El captulo 11 se centra en realizar una revisin exhaustiva de cada uno de
los puntos que componen los objetivos del exmen de certificacin 310-055,
llamando la atencin del lector sobre aquellos aspectos especialmente relevantes de
cara a la correcta resolucin de las cuestiones que en ellos se plantean. Este
examen corresponde a la certificacin de Programador Java Sun, centrada en el
conocimiento del lenguaje y las libreras de uso general.
RA-MA
Apndices
Adems de los 11 captulos comentados, el libro incluye cuatro apndices.
El apndice A contiene un resumen de las clases AWT y swing ms utilizadas en el
desarrollo de aplicaciones basadas en entorno grfico. En el apndice B se
enumeran las caractersticas ms importantes de la ltima versin de Java: J2SE
6.0. Por otro lado, el apndice C contiene las respuestas a las cuestiones de
autoevaluacin propuestas al final de cada captulo. Finalmente, el apndice D
incluye una simulacin del examen 310-055, con preguntas tipo que pueden ser
planteadas en dicha prueba.
Si desea obtener ms informacin sobre los programas de certificacin
Java de Sun puede consultar la pgina Web:
http://www.sun.com/training/certification/java/index.html
CD-ROM
Con el libro se incluye un CD-ROM con todas las prcticas desarrolladas
en los distintos captulos del mismo. Estas prcticas han sido creadas con el
entorno de desarrollo NetBeans 5.5 y pueden ser ejecutadas tanto con la versin
J2SE 5.0 como con la 6.0.
En el caso de que el lector disponga de un IDE distinto a NetBeans puede
utilizar los cdigos fuente de las clases que se encuentran en el subdirectorio \src
de cada prctica.
Espero que este libro resulte de utilidad al lector y le ayude, tanto a la
comprensin del lenguaje Java como a la superacin del examen de certificacin.
Si desea realizar algn comentario u observacin puede contactar con el autor a
travs de la siguiente direccin de correo:
ajms66@hotmail.com
P
A
R
T
E
PROGRAMACIN
EN
JAVA
CAPTULO 1
INTRODUCCIN A JAVA
Sun Microsystems, la empresa propietaria de Java, no imagin en 1991,
ao en que se desarroll la primera versin del lenguaje, que unos diez aos
despus, ste se iba a convertir en el lenguaje de programacin ms utilizado por la
comunidad mundial de desarrolladores y, mucho menos, que la mayora de los
grandes fabricantes de software del momento IBM, Oracle, Borland, BEA, etc.,
desarrollaran sus productos para, de alguna u otra manera, dar soporte al lenguaje
Java.
Java es, sin duda alguna, el lenguaje de programacin que ms impacto ha
tenido en los ltimos aos, especialmente en el mundo de desarrollo para la Web.
Probablemente, Internet no sera la que es hoy sin la existencia de Java.
Pero la expansin de Java, lejos de detenerse, va en aumento, pues no slo
es el referente en el desarrollo de aplicaciones Web, sino que tambin tiende a
imponerse en los grandes retos que tiene la programacin para el futuro, como son
los Servicios Web o la programacin para dispositivos electrnicos.
Esta especie de Revolucin del mundo Software que Java ha provocado
hace que uno llegue a preguntarse, qu tiene Java que no tengan los dems
lenguajes de programacin? Como lenguaje de programacin, Java no se diferencia
mucho del resto de los lenguajes orientados a objetos, sin embargo, Java es algo
ms que un lenguaje y posee una serie de caractersticas que lo hacen especial.
RA-MA
CARACTERSTICAS DE JAVA
He aqu los principales puntos en los que se apoya la tecnologa Java:
RA-MA
Fig. 1.
RA-MA
EDICIONES JAVA
Una de las caractersticas de Java indicadas anteriormente es el hecho de
disponer de un amplio conjunto de paquetes (libreras) de clases para la realizacin
de las aplicaciones. Todo este compendio de clases se organiza en tres grandes
grupos, conocidos como ediciones Java (figura 2).
Fig. 2.
Ediciones Java
RA-MA
Fig. 3.
RA-MA
Como vemos, por defecto aparece la ltima versin del JDK lanzada por
Sun, actualmente se trata de la versin JDK 6. sta no incorpora ninguna novedad
en la sintaxis del lenguaje respecto a la versin anterior JDK 5, tan slo algunas
mejoras en determinadas API especficas de Java estndar, alguna de las cuales
ser comentada en los captulos dedicados a las interfaces grficas y el acceso a
datos. As pues, aunque este libro se basa en la versin 6, todo lo aqu explicado en
lo que a sintaxis del lenguaje se refiere es igualmente aplicable para la versin 5;
incluso, para aquellos lectores que utilicen versiones de Java estndar anteriores a
sta, como la 1.4, se indicar explcitamente qu caractersticas del lenguaje han
sido incorporadas a partir de la versin 5 y, por tanto, no estn presentes en las
anteriores.
Adems del JDK, esta pgina nos ofrece otras opciones de descarga que
son:
JDK 6 with Java EE. Permite descargar, adems del Java estndar,
las liberas del J2EE
RA-MA
Fig. 4.
RA-MA
D ire c to rio d e
in s ta la c i n
Fig. 5.
RA-MA
Fig. 6.
RA-MA
Fig. 7.
Fig. 8.
RA-MA
CODIFICACIN
Utilizando cualquier editor de texto, por ejemplo el bloc de notas,
procedemos a escribir el cdigo mostrado en la figura 9. Hay que tener en cuenta
que Java hace distincin entre maysculas y minsculas, por lo que hay que
codificarlo tal cual se muestra.
Fig. 9.
Fig. 10.
RA-MA
COMPILACIN
La compilacin de un archivo de cdigo fuente .java se realiza a travs del
comando javac.exe del JDK. Si se ha establecido correctamente la variable de
entorno PATH, javac podr ser invocado desde el directorio en el que se encuentre
el archivo .java (figura 11). Tras ejecutar este comando, se generarn tantos
archivos .class como clases existan en el cdigo fuente, en este ejemplo se crear
solamente el archivo Saludo.class.
Fig. 11.
RA-MA
Fig. 12.
EJECUCIN
Para ejecutar el programa, utilizaremos el comando java.exe, seguido del
nombre de la clase que contiene el mtodo main(), en nuestro caso ser Saludo, que
es la nica clase existente. Es necesario que la variable de entorno CLASSPATH
est correctamente configurada e incluya el carcter . (Directorio actual) en la
lista de direcciones, lo que permitir invocar al comando java desde el directorio en
el que se encuentra el .class (figura 13).
Fig. 13.
RA-MA
Fig. 14.
Fig. 15.
RA-MA
Fig. 16.
RA-MA
La escritura de cdigo tambin resulta una tarea sencilla con un IDE. Estos
suelen contar con un editor de cdigo que resalta las palabras reservadas del
lenguaje para distinguirlas del resto del cdigo, algunos incluso permiten la auto
escritura de instrucciones utilizando la tcnica Intellisense, que consiste en mostrar
la lista completa de mtodos de un objeto segn se escribe la referencia al mismo
(figura 17).
Fig. 17.
Fabricante
Ms info.
NetBeans
Sun Microsystem
http://www.netbeans.org/downloads/index.html
Jbuilder
Borland
http://www.borland.com/us/products/jbuilder/index.html
Jdeveloper
Oracle
http://www.oracle.com/technology/products/jdev/index.html
Eclipse
Eclipse Foundation
http://www.eclipse.org/downloads/index.php
Fig. 18.
RA-MA
NetBeans 5.5
Jbuilder 2005
Fig. 19.
Objetos
Desde el punto de vista de la programacin, un objeto es una especie de
caja negra (figura 20) que expone una serie de operaciones (mtodos) que
pueden ser utilizados por otros programas para la realizacin de tareas mayores, de
la misma forma que en el mundo real un objeto de tipo televisin expone los
RA-MA
O b je to
m to d o 1
----------
C d ig o
m to d o
m to d o 2
----------
C d ig o
m to d o
----------
C d ig o
m to d o
:
m to d o n
Fig. 20.
Para poder invocar a los mtodos de un objeto desde fuera del mismo es
necesario disponer de la referencia al objeto. Normalmente, sta se guarda una
variable que a travs del operador . permite hacer la llamada a los mtodos del
objeto de la forma indicada en la figura 21.
referenciaobjeto.metodo1();
referenciaobjeto.metodo2(argumento1, argumento2,..);
referenciatelevision.encender();
referenciatelevision.ajustarvolumen("subir", 2);
Fig. 21.
RA-MA
Clases
Las clases contienen la definicin de los objetos, dicho de otra manera, una
clase es el lugar en el que se codifican los mtodos que van a exponer los objetos
de esa clase. Siguiendo con el smil de la televisin, una marca y modelo de
televisor sera la clase (cada modelo de televisor define sus propios mtodos),
mientras que un televisor concreto de esa marca y modelo sera el objeto.
En Java una clase se define de la forma indicada en la figura 22.
[public] class Nombreclase
{
//Declaracin de campos o atributos
//Definicin de mtodos
}
Fig. 22.
RA-MA
Fig. 23.
Mtodos y campos
Los mtodos definen el comportamiento de los objetos de una clase, estos
mtodos pueden hacer uso de campos o atributos para almacenar informacin
sobre el objeto, informacin que puede ser utilizada posteriormente por cualquiera
de los mtodos del objeto. Por ejemplo, la clase TelevisorSony debera tener un
campo volumen donde almacenar el volumen actual del televisor, de este modo, el
mtodo ajustarvolumen() podr usar este campo para mantener actualizado en cada
momento el volumen del televisor.
En Java, los mtodos de una clase se implementan mediante funciones y
los campos mediante variables, la sintaxis se indica en la figura 24. Donde la
palabra tipo, representa un tipo de dato vlido en Java y puede ser un tipo de dato
primitivo (los trataremos con detalle en el prximo captulo) o un tipo objeto y
debe ser utilizado para indicar el tipo de dato de los campos, los parmetros de
mtodos y valor de devolucin de stos.
Como hemos comentado, los mtodos de una clase Java pueden recibir
determinados datos (argumentos) en la llamada. Los valores recibidos por el
mtodo se declaran en la cabecera de ste como parmetros de llamada. La
declaracin de parmetros de un mtodo sigue el formato de la declaracin de
variables en Java.
RA-MA
Parmetros de llamada
Fig. 24.
objeto.metodo(argumento1, argumento2)
:
Declaracin
del mtodo
Fig. 25.
RA-MA
RA-MA
T e le v is o r S o n y . o b t e n e r p r e c io ( ) ;
Fig. 26.
RA-MA
Fig. 27.
A diferencia de los campos estndar, que suelen ser privados para uso
interno de la clase, los campos estticos deben llevar un modificador de acceso que
permita su uso desde el exterior de la misma, ste puede ser public, protected o
ninguno (como en la figura 27).
La implementacin de un mtodo esttico impone una serie de
restricciones en el cdigo que deben ser tenidas en cuenta:
RA-MA
El mtodo main()
Toda aplicacin Java est compuesta por al menos una clase, incluso la
sencilla aplicacin de la figura 9 que generaba un mensaje de saludo. En alguna de
esas clases, que ha de estar declarada con el modificador de acceso public, debe
existir un mtodo esttico llamado main(), cuyo formato debe ser el indicado en la
figura 28.
RA-MA
RA-MA
CUESTIONES DE AUTOEVALUACIN
1. Qu edicin Java habra de utilizar para crear un programa que es
utilizado por un nico ordenador?
2. Al intentar ejecutar este programa se produce un error (excepcin).
Dnde est el fallo?
public class Ejercicio
{
public static void main (String args)
{
System.out.println("hola");
}
}
CAPTULO 2
SINTAXIS BSICA
Antes de introducirnos de lleno en la sintaxis del lenguaje, vamos a
comentar algunos aspectos sintcticos generales:
RA-MA
SECUENCIAS DE ESCAPE
Hay determinados caracteres en Java que o bien no tienen una
representacin explcita o bien no pueden ser utilizados directamente por el hecho
de tener un significado especial para el lenguaje. Para poder utilizar estos
caracteres dentro de un programa Java se utilizan las secuencias de escape.
Una secuencia de escape est formada por el carcter \ seguido de una
letra, en el caso de ciertos caracteres no imprimibles, o del carcter especial. La
tabla de la figura 30 contiene las principales secuencias de escape predefinidas de
Java.
RA-MA
Secuencia de escape
Significado
\b
Retroceso
\n
Salto de lnea
\t
Tabulacin horizontal
\\
Barra invertida \
Comilla simple
Comilla doble
Fig. 30.
Secuencias de escape
"maana"
VB
"tarde"
utilizaramos la instruccin:
System.out.println("Java\t\"maana\"\nVB\t\"tarde\"");
T ip o b s ic o
Tam ao
b y te
8 b its
s h o rt
1 6 b its
in t
3 2 b its
lo n g
6 4 b its
char
1 6 b its
f lo a t
3 2 b its
d o u b le
6 4 b its
b o o le a n
Fig. 31.
RA-MA
Numricos enteros. Son los tipos byte, short, int y long. Los
cuatro representan nmeros enteros con signo.
VARIABLES
Una variable es un espacio fsico de memoria donde un programa puede
almacenar un dato para su posterior utilizacin.
RA-MA
int k=40;
k
Fig. 32.
40
ts (referencia)
objeto
Fig. 33.
RA-MA
Declaracin de variables
Como se desprende de los anteriores ejemplos, una variable se declara de
la forma:
tipo_dato nombre_variable;
Un nombre de variable vlido debe cumplir las siguientes reglas:
Vlidas
No vlidas
int k, cod;
long p1;
char cad_2;
Fig. 34.
RA-MA
Asignacin
Una vez declarada una variable se le puede asignar un valor siguiendo el
formato:
variable=expresion;
donde expresion puede ser cualquier expresin Java que devuelva un valor acorde
con el tipo de dato de la variable:
int p, k, v;
p=30;
k=p+20;
v=k*p;
Literales
Un literal es un valor constante que se puede asignar directamente a una
variable o puede ser utilizado en una expresin.
Existen cuatro tipos de literales bsicos, coincidiendo con los cuatro grupos
en los que se pueden dividir los tipos bsicos Java, esto es, numricos enteros,
numricos decimales, lgicos y carcter. A la hora de utilizar estos literales en una
expresin hay que tener en cuenta lo siguiente:
RA-MA
RA-MA
Local
Fig. 35.
RA-MA
char
\u0000'
float, double
0.0
boolean
false
objeto
null
Fig. 36.
Conversiones de tipo
Java es un lenguaje fuertemente tipado, lo que significa que es bastante
estricto a la hora de asignar valores a las variables. A priori, el compilador slo
admite asignar a una variable un dato del tipo declarado en la variable, no obstante,
en ciertas circunstancias, es posible realizar conversiones que permitan almacenar
en una variable un dato de un tipo diferente al declarado.
RA-MA
En Java es posible realizar conversiones entre todos los tipos bsicos, con
excepcin de boolean, que es incompatible con el resto de tipos.
Las conversiones de tipo
implcitamente o explcitamente.
pueden
realizarse
de
dos
maneras:
CONVERSIONES IMPLCITAS
Las conversiones implcitas se realizan de manera automtica, es decir, el
valor o expresin que va a asignar a la variable es convertido automticamente al
tipo de sta por el compilador, antes de almacenarlo en la variable. El siguiente
cdigo es un ejemplo de conversin implcita:
int i;
byte b=30;
i=b;
En este ejemplo, el dato de tipo byte almacenado en la variable b es
convertido en un int antes de asignarlo a la variable b.
Para que una conversin pueda realizarse de forma automtica
(implcitamente), el tipo de la variable destino debe ser de tamao igual o
superior al tipo de origen, si bien esta regla tiene dos excepciones:
RA-MA
CONVERSIONES EXPLCITAS
Cuando no se cumplan las condiciones para una conversin implcita, sta
podr realizarse explcitamente utilizando la expresin:
variable_destino = (tipo_destino) dato_origen;
Con esta expresin le estamos diciendo al compilador que convierta
dato_origen a tipo_destino para que pueda ser almacenado en variable_destino.
A esta operacin se la conoce como casting o estrechamiento ya que al
convertir un dato de un tipo en otro tipo de tamao inferior se realiza un
estrechamiento que, en algunos casos, puede provocar una prdida de datos,
aunque ello no provocar errores de ejecucin. Los siguientes son ejemplos de
conversiones explcitas:
char c;
byte k;
int p=400;
double d=34.6;
c=(char)d; //se elimina la parte decimal (truncado)
k=(byte)p; //se produce una prdida de datos, pero
//la conversin es posible
RA-MA
clase diferente. Para que esto sea posible es necesario que exista una relacin de
herencia entre las clases, por lo que este asunto se tratar en el captulo dedicado a
la Programacin Orientada a Objetos.
Constantes
Una constante es una variable cuyo valor no puede ser modificado. Para
definir una constante en Java se utiliza la palabra final, delante de la declaracin
del tipo, siguiendo la expresin:
final tipo nombre_cte=valor;
Por ejemplo:
final double pi=3.1416;
Una constante se define en los mismos lugares en los que se puede declarar
una variable: al principio de la clase y en el interior de un mtodo.
Suele ser bastante habitual que derterminadas constantes tengan que poder
ser utilizadas desde el exterior de la clase donde se han declarado; para que adems
no sea necesario crear objetos de la misma para hacer uso de estas constantes, se
declaran como campos pblicos y estticos. ste es el caso de la constante PI,
declarada en la clase Math de Java estndar de la forma:
public static final double PI=3.1416;
OPERADORES
Los operadores son smbolos que permiten realizar operaciones con los
datos de un programa. Java dispone de una amplia variedad de operadores; a
continuacin estudiaremos los ms importantes, clasificndolos segn el tipo de
operacin que realizan.
Aritmticos
Se utilizan para realizar operaciones aritmticas dentro de un programa,
actuando sobre valores de tipo numrico.
RA-MA
Descripcin
Ejemplo
int c;
c=2+5;
int c;
c=2-5;
int c;
c=2*5;
int a=8,b=5;
float x, y;
x=a/b; // El resultado es 1
y=a/3.0f; //El resultado es 2.66
int c;
c=7%2; //El resultado es 1
++
int c=3
c++; //Equivale a c=c+1
--
int c=3
c--; //Equivale a c=c-1
Fig. 37.
Operadores aritmticos
RA-MA
int a=3, b, s;
b=a++;
System.out.println("b vale "+b); //b vale 3
s=++b*++a;
System.out.println("s vale "+s); //s vale 20
Asignacin
Adems del clsico operador de asignacin (=), Java dispone de un
conjunto de operadores que permiten simplificar el proceso de operar con una
variable y asignar el resultado de la operacin a la misma variable.
RA-MA
Operador
Descripcin
Ejemplo
int c;
c=8*5; //Asigna el resultado de la
operacin a la variable c
+=
int c=4;
c+=5; //Equivale a realizar c=c+5
-=
int c=3;
c-=2; //Equivale a realizar c=c-2
*=
int a=8;
a*=2; //Equivale a realizar a=a*2
/=
int c=7;
c/=2; //Equivale a realizar c=c/2
%=
int c=6;
c%=3; //Equivale a realizar c=c%3
Fig. 38.
Operadores de asignacin
RA-MA
ob1
ff23
Object ob2=ob1;
Memoria
objeto
ob1
ff23
ob2
ff23
Memoria
objeto
Fig. 39.
int a=5;
int b=a;
5
:
String k=hola;
String p=k;
hola
k
:
p
Fig. 40.
RA-MA
Condicionales
Se utilizan para establecer una condicin dentro de un programa, el
resultado de sta ser un tipo boolean (true o false). Estos operadores se utilizan en
instrucciones de control de flujo, tal y como veremos en el apartado siguiente.
La tabla de la figura 41 contiene el listado de los operadores condicionales
Java.
Operador
Descripcin
==
<
>
<=
>=
!=
Fig. 41.
Operadores condicionales
RA-MA
IGUALDAD DE OBJETOS
Los operadores de igualdad == y desigualdad "!=" pueden utilizarse
para comparar cualquier tipo de dato compatible.
Ahora bien, si lo utilizamos para comparar variables de tipo objeto
debemos recordar que lo que contienen estas variables son referencias a objetos, no
los objetos en s, por tanto, estamos comparando referencias y no objetos.
Esto implica que podemos tener dos variables referenciando a dos objetos
iguales y que la condicin de igualdad de las variables resulte falsa. En la figura 42
se muestra un ejemplo de esto utilizando la clase String, en ella se aprecia que hay
dos objetos idnticos (mismo valor de texto), situados en zonas de memoria
diferentes, por lo que las referencias a los mismos sern tambin distintas.
Para comprobar la igualdad de objetos, las clases proporcionan un mtodo
llamado equals, en el que cada clase implementa su propio criterio de igualdad. Por
tanto, si queremos saber si dos objetos de una determinada clase son iguales,
se debe utilizar el mtodo equals, no el operador de comparacin ==, el cual
solamente dara un resultado verdadero si las dos variables apuntan al mismo
objeto. En el siguiente captulo veremos la aplicacin de este mtodo en algunas de
las clases bsicas de Java.
v1
v2
Memoria
hola
hola
Fig. 42.
RA-MA
Lgicos
Operan con valores de tipo boolean, siendo el resultado tambin de tipo
boolean.
La tabla de la figura 43 muestra los tres operadores lgicos de Java.
Operador
Descripcin
&&
||
Fig. 43.
Operadores lgicos
RA-MA
p++;
}
System.out.println("p vale "+p);
System.out.println("f vale "+f);
O p erad o r
D escrip ci n
&
Fig. 44.
RA-MA
Operador instanceof
Opera nicamente con referencias a objetos y se utiliza para saber si un
objeto pertenece a un determinado tipo. La forma de utilizarlo es:
referencia_objeto instanceof clase
El resultado de la operacin es true si el objeto pertenece a la clase
especificada o a una de sus subclases.
Por ejemplo, al ejecutar el siguiente cdigo:
String s="Hola";
if(s instanceof String){
System.out.println ("Es una cadena");
}
RA-MA
Operador condicional
Se trata de un operador ternario (consta de tres operandos) cuya funcin es
asignar un valor entre dos posibles a una variable, en funcin del cumplimiento o
no de una condicin. Su formato es:
tipo variable = (condicion)?valor_si_true:valor_si_false
Si la condicin resulta verdadera (el resultado es true), se almacenar en la
variable el resultado de la expresin valor_si_true, si no, se almacenar
valor_si_false.
La ejecucin del siguiente bloque de cdigo mostrar en pantalla la palabra
"par":
int k=4;
String s = (k%2==0)?"par":"impar";
System.out.println(s);
RA-MA
M em oria
variables
objeto1
objeto2
D isponible para
recoleccin
objeto3
Fig. 45.
INSTRUCCIONES DE CONTROL
Como cualquier otro lenguaje de programacin, Java dispone de un juego
de instrucciones para controlar el flujo de ejecucin de un programa. Tenemos
instrucciones alternativas y repetitivas, a continuacin estudiaremos cada una de
ellas.
RA-MA
Instruccin if
La instruccin if es una sentencia de tipo alternativa simple que permite
comprobar una condicin dentro un programa. En caso de que la condicin se
cumpla se ejecutar un determinado conjunto de instrucciones, mientras que si no
se cumple, se podr optar por ejecutar otro conjunto diferente de instrucciones o
por no ejecutar ninguna.
En la figura 46 se muestra el formato de esta instruccin con un ejemplo de
utilizacin.
Formato:
Ejemplo:
if(condicion)
{
sentencias
}
else
{
sentencias
}
Fig. 46.
if(a>b)
{
System.out.println(El mayor es +a);
}
else
{
System.out.println(El mayor es +b);
}
RA-MA
La instruccin switch
Se trata de una instruccin de tipo alternativa mltiple. Permite ejecutar
diferentes bloques de instrucciones en funcin del resultado de una expresin.
La figura 47 muestra el formato de la instruccin y un ejemplo de
utilizacin.
Formato:
switch(expresion)
{
case valor1:
sentencias
break;
case valor2:
sentencias
break;
default:
sentencias
}
Fig. 47.
Ejemplo:
switch(a)
{
case 3:
System.out.println(Ests cerca);
break;
case 5:
System.out.println(Enhorabuena);
break;
default:
System.out.println(Vas mal);
}
Formato y ejemplo de utilizacin de la instruccin switch
RA-MA
Los nicos valores que puede evaluar switch son nmeros enteros
de tipo int. Esto incluye, adems de int, a aquellos que puedan ser
promocionados a dicho tipo (byte, char y short).
imprimir en pantalla:
El resultado es 10
El tamao es demasiado alto
RA-MA
La instruccin for
La instruccin repetitiva for permite ejecutar un conjunto de instrucciones
un nmero determinado de veces. Su formato y ejemplo de utilizacin se muestran
en la figura 48.
Formato:
for(inicializacion;condicion;incremento)
{
sentencias
}
Ejemplo:
for(int i=1;i<=10;i++)
{
//Muestra los nmeros del 1 al 10
System.out.println(El nmero es +i);
}
Fig. 48.
RA-MA
La instruccin while
Permite ejecutar un bloque de instrucciones mientras se cumpla una
determinada condicin dentro del programa. Los dos posibles formatos que admite
esta instruccin y un ejemplo de utilizacin se muestran en la figura 49.
En ambos casos, el bloque de instrucciones se ejecuta mientras la
condicin se cumple. En el segundo formato se ejecutan las instrucciones y luego
se comprueba la condicin, lo que garantiza que el bloque de instrucciones se
ejecute por lo menos una vez.
Como en el caso de la instruccin for, la utilizacin de llaves para delimitar
un bloque de instrucciones slo es obligatoria si ste est formado por ms de una
instruccin.
RA-MA
Formatos:
do
{
while(condicion)
{
sentencias
}
sentencias
}while(condicion);
Ejemplo:
int a=10;
while(a>0)
{
//Muestra los nmeros del 10 al 1
System.out.println(el numero es +a);
a--;
}
Fig. 49.
RA-MA
break
continue
BREAK
Ya hemos visto la utilidad de break en una sentencia switch, sin embargo,
su uso tambin se puede extender a las instrucciones repetitivas. En stas, la
utilizacin de break provoca una salida forzada del bucle, continuando la ejecucin
del programa en la primera sentencia situada despus del mismo.
En el siguiente ejemplo, se detiene la ejecucin del for al producirse una
determinada situacin:
int numero=6;
boolean acierto=false;
for(int i=1;i<=5;i++)
{
int aleat=Math.floor(Math.random()*10+1);
if(aleat==numero)
{
acierto=true;
//si acierta el nmero finaliza la ejecucin de
//la instruccin for
break;
}
}
CONTINUE
La instruccin continue, provoca que el bucle detenga la iteracin actual y
pase, en el caso de for, a ejecutar la instruccin de incremento o, en el caso de
while, a comprobar la condicin de entrada.
El siguiente trozo de cdigo suma nmeros impares aleatorios entre 1 y 10,
mientras la suma total sea inferior a 1000. La utilizacin de continue en este
ejemplo impide que los nmeros pares sean sumados:
int suma=0;
while(suma<1000){
int aleat=Math.floor(Math.random()*10+1);
if(aleat%2==0){
RA-MA
continue;
}
//slo se sumarn los nmeros impares
suma+=aleat;
}
PRCTICA 2.1.
Desarrollar un programa que, a partir de dos nmeros enteros dados (dos
nmeros cualesquiera almacenados en variables), muestre en pantalla la suma de
todos los nmeros pares comprendidos entre ambos.
Se realizarn dos versiones del programa. En una primera versin, todo el
cdigo ser incluido en el mtodo main(). En la segunda versin, la clase contar
con dos mtodos: suma(), que devolver el resultado de la suma a partir de los
nmeros recibidos y main(), que realizar la llamada a suma() y mostrar el
resultado en pantalla.
ARRAYS
Un array es un objeto en el que se puede almacenar un conjunto de datos
de un mismo tipo. Cada uno de los elementos del array tiene asignado un ndice
numrico segn su posicin, siendo 0 el ndice del primero.
Declaracin
Un array debe declararse utilizando la expresin:
tipo [] variable_array;
o
tipo variable_array[];
Como se puede apreciar, los corchetes pueden estar situados delante de la
variable o detrs. Los siguientes son ejemplos de declaraciones de array:
int [] k;
String [] p;
char cads[];
RA-MA
Los arrays pueden declararse en los mismos lugares que las variables
estndar: como atributos de una clase o locales en el interior de un mtodo. Como
ocurre con cualquier otro tipo de variable objeto, cuando un array se declara como
atributo se inicializa implcitamente al valor null.
Dimensionado de un array
Para asignar un tamao al array se utiliza la expresin:
variable_array=new tipo[tamao];
Tambin se puede asignar tamao al array en la misma lnea de declaracin
de la variable. Los siguientes son ejemplos de dimensionado de un array:
k=new int[5];
cads=new char[10];
String [] noms=new String[10];
RA-MA
resulta especialmente til en aquellos mtodos que necesitan recorrer todos los
elementos de un array, independientemente de su tamao.
El siguiente bloque de cdigo utiliza length para recorrer un array y
rellenarlo con nmeros enteros pares consecutivos, empezando por el 0.
int [] nums=new int[10];
for (int i=0;i<nums.length;i++){
nums[i]=i*2;
}
RA-MA
RA-MA
menor=calculoMenor(nums);
mayor=calculoMayor(nums);
System.out.println ("El mayor es "+ mayor);
System.out.println ("El menor es "+ menor);
System.out.println ("La suma es "+ suma);
}
static int sumar(int numeros[]){
int s=0;
for(int i=0;i<numeros.length;i++){
s+=numeros[i];
}
return s;
}
static int calculoMayor(int numeros[]){
int may=numeros[0];
for(int i=0;i<numeros.length;i++){
if(nums[i]>may){
may=nums[i];
}
}
return may;
}
static int calculoMenor(int numeros[]){
int men=numeros[0];
for(int i=0;i<numeros.length;i++){
if(nums[i]<men){
men=nums[i];
}
}
return men;
}
}
RA-MA
tipo [] metodo(parmetros){
:
return variable_array;
}
El siguiente mtodo devuelve un array con los cinco nmeros enteros
siguientes al nmero recibido como parmetro:
int [] getNumeros(int n){
int [] nums=new int[5];
for(int i=0;i<nums.length;i++){
nums[i]=n+i+1;
}
return nums;
}
PRCTICA 2.2.
Desarrollar un programa que, partiendo de un array formado por 10
nmeros enteros cualesquiera, ordene de menor a mayor los nmeros contenidos en
dicho array y posteriormente muestre el contenido ordenado en pantalla.
Se debe procurar realizar el programa de forma modular, desglosando en
cdigo de la clase en los mtodos que se considere apropiados.
RA-MA
donde, tipo variable representa la declaracin de una variable auxiliar del mismo
tipo que el array, variable que ir tomando cada uno de los valores almacenados en
ste con cada iteracin del for, siendo var_array la variable que apunta al array.
Por ejemplo, supongamos que tenemos el siguiente array:
int [] nums = {4, 6, 30, 15};
Obsrvese como, sin acceder de forma explcita a las posiciones del array,
cada una de stas es copiada automticamente a la variable auxiliar n al
principio de cada iteracin.
Como ejemplo ilustrativo, a continuacin se presenta una nueva versin del
programa anterior que realiza la suma de los elementos de un array. En este caso se
han utilizado bucles for-each sin ndices en vez de for tradicionales:
public class Principal{
public static void main (String [] args){
int mayor,menor, suma;
int [] nums = {3,4,8,2};
//Llamada a los mtodos
suma=sumar(nums);
menor=calculoMenor(nums);
mayor=calculoMayor(nums);
System.out.println ("El mayor es "+ mayor);
System.out.println ("El menor es "+ menor);
System.out.println ("La suma es "+ suma);
}
RA-MA
Arrays multidimensionales
Los arrays Java pueden tener ms de una dimensin, por ejemplo, un array
de enteros de dos dimensiones se declarara:
int [][] k;
RA-MA
k= new int[3][5];
Igualmente, para acceder a cada una de las posiciones del array se utilizara
un ndice por dimensin:
k[1][3]=28;
0
1
2
28
Fig. 50.
Array bidimensional
RA-MA
Fig. 51.
TIPOS ENUMERADOS
Los tipos enumerados son otra de las nuevas caractersticas incluidas en la
versin 5 de J2SE, consistente en la posibilidad de definir nuevos tipos de datos
cuyos posibles valores estn limitados a un determinado conjunto dado.
Anteriormente a la versin 5, la forma de definir un determinado conjunto
de valores era mediante la utilizacin de constantes:
public class
public
public
public
public
}
Direcciones{
static final
static final
static final
static final
int
int
int
int
NORTE=1;
SUR=2;
ESTE=3;
OESTE=4;
RA-MA
RA-MA
Como se puede ver, los valores del tipo enumerado no necesitan ningn
nmero o cadena de caracteres asociada.
Las clases Barco y Navegacion quedaran ahora de la siguiente manera:
public class Barco{
private Direcciones orientacion;
public void setOrientacion(Direcciones s){
orientacion = s;
}
public Direcciones getOrientacion(){
return orientacion;
}
}
public class Navegacion{
public static void main(String []args){
Barco b=new Barco();
//establecimiento de la orientacin a
//partir de los valores de la enumeracin
b.setOrientacion(Direcciones.OESTE);
}
}
RA-MA
Clases de enumeracin
Una enumeracin es un tipo especial de clase, clase que hereda
java.lang.Enum. A diferencia de las clases estndares, una clase de enumeracin
no permite el uso del operador new para la creacin de objetos. Cada uno de los
valores de la enumeracin representa uno de los posibles objetos de la clase, as
pues, stos sern creados de forma implcita al hacer referencia en el cdigo estos
valores (figura 52).
Adems de los mtodos heredados de Enum, todas las enumeraciones
disponen del mtodo esttico values(), que devuelve un array con todos los objetos
de la clase.
enum D irecciones{NORTE, SUR, ESTE, O ESTE}
:
Direcciones dir;
dir = D irecciones.NORTE;
objeto enum eracin
Fig. 52.
RA-MA
Otra diferencia entre los objetos de las clases estndares y los objetos
enumerados est en que stos ltimos pueden ser utilizados en expresiones de
comparacin de igualdad mediante el signo == y como valores de una instruccin
switch:
for(Direcciones dir:Direcciones.values()){
if(dir==Direcciones.SUR||dir==Direcciones.NORTE){
System.out.println("Rumbo erroneo");
}
else{
System.out.println("Rumbo correcto");
}
}
CONSTRUCTORES
Se definen igual que en las clases estndares:
Nombre_enumeracion(lista_parametros){
:
}
Cuando una enumeracin dispone de constructores con parmetros, los
valores de los argumentos de llamada deben estar especificados en cada uno de los
valores de la enumeracin:
enum Direcciones{
NORTE(4), SUR(2), ESTE(2), OESTE(3)
int distancia;
Direcciones(int d){//constructor
distancia=d;
}
}
RA-MA
MTODOS
Los mtodos tambin se definen igual que en las clases. Como ejemplo,
incluiremos en la enumeracin Direcciones un mtodo que nos permita recuperar la
distancia:
enum Direcciones{
NORTE(4), SUR(2), ESTE(2), OESTE(3)
int distancia;
Direcciones(int d){
//constructor
distancia=d;
}
int getDistancia(){
return distancia;
}
}
RA-MA
RA-MA
RA-MA
CUESTIONES DE AUTOEVALUACIN
1. Dos de las siguientes palabras no se corresponden con tipos
bsicos del lenguaje Java. Indica cules son:
int, double, Long, boolean, byte, char, string
2. El siguiente trozo de cdigo contiene un error de compilacin.
Indica cul es:
int k=2500;
float r=3.7;
byte p=(byte)k;
RA-MA
A. if(a=(b+c))
B. if(++a>(b-c))
C. if((a+b)==0)
6. Indica cul ser el contenido de las variables k y v al finalizar la
ejecucin del siguiente bloque de instrucciones:
int k=5;
int v=2;
if(k>0 ||(++v>1)){
for(int i=0;i<v;i++){
k++;
}
}
RA-MA
RA-MA
*********versin 2*****************
public class SumaPares2 {
public static void main(String[] args) {
//nmeros cualesquiera
int n1=7, n2=13;
//invoca al mtodo sumatorio para calcular la suma
int suma=sumatorio(n1,n2);
System.out.println("La suma es "+suma);
}
//mtodo que realiza la suma
public static int sumatorio(int s1, int s2){
//variables que almacenarn el mayor y el menor de
// los nmeros
int mayor,menor;
//variable local de sumas parciales
int suma=0;
//identifica los extremos
if(s1>s2){
mayor=s1;
menor=s2;
}
else{
mayor=s2;
menor=s1;
}
RA-MA
PRCTICA 2.2.
public class Ordenacion {
public static void main(String[] args) {
//array de enteros cualesquiera
int [] nums = {2, 34, 19, 5, 7, 28, 55, 3, 45, 21};
//llama al mtodo que ordena el array
ordenar(nums);
//llama al mtodo que muestra el contenido
//del array
mostrar(nums);
}
//el mtodo no necesita devolver una referencia al
//array ordenado, dado que ambas referencias,
//num y m, apuntan al mismo objeto array
public static void ordenar(int [] m){
//variable auxiliar utilizada para el intercambio
//de datos en el array
int aux;
//recorre las posiciones del array
for(int i=0;i<m.length;i++){
//el segundo for se utiliza para comparar el
//valor de la posicin actual con las siguientes
RA-MA
for(int j=i+1;j<m.length;j++){
//si uno de los siguientes valores es inferior
//al actual, procede al intercambio de las
//posiciones del array
if(m[j]<m[i]){
aux=m[i];
m[i]=m[j];
m[j]=aux;
}
}
}
}
//se encarga de mostrar el contenido del array
public static void mostrar(int [] m){
//recorre el array utilizando for-each
for(int num:m){
System.out.print(num+",");
}
}
}
CAPTULO 3
RA-MA
Clases bsicas
Clases de envoltorio
Clases de E/S
Colecciones
P a q u e te
p rin c ip a l
ja v a .la n g .S tr in g
S u b p a q u e te
Fig. 53.
C la s e
RA-MA
RA-MA
Nombre cualificado de
la clase
}
}
Importa la clase para
su utilizacin
import java.util.Vector;
public class Ejemplo
{
public void metodo()
{
Vector v;
}
}
Fig. 54.
RA-MA
RA-MA
zona 1
zona 3
zona 2
Fig. 55.
pa q u ete
clase
Fig. 56.
RA-MA
Las variables de tipo String pueden utilizarse tambin en una expresin que
haga uso del operador + para concatenar cadenas:
RA-MA
String s="Hola";
String t=s + " que tal"; //La variable t apunta al
//objeto "Hola que tal"
2 Despus de la
1 Antes de la
concatenacin
concatenacin
Memoria
Memoria
Hola
Hola
s
Fig. 57.
RA-MA
RA-MA
RA-MA
String toUpperCase().
maysculas.
Devuelve
la
cadena
en
formato
RA-MA
LA CLASE MATH
Esta clase proporciona mtodos para la realizacin de las operaciones
matemticas ms habituales en un programa. Todos los mtodos de la clase Math
son estticos, por lo que no necesitamos crear ninguna instancia de la clase para su
utilizacin, de hecho, no es posible crear ningn objeto de la clase Math.
Constantes pblicas
La clase Math dispone de dos atributos pblicos estticos que contienen
dos de las constantes matemticas ms utilizadas:
Mtodos
Los mtodos ms interesantes expuestos por esta clase son:
RA-MA
RA-MA
Importaciones estticas
La importacin esttica es una caracterstica incluida en el lenguaje Java a
partir de la versin 5, consistente en la posibilidad de importar todos los miembros
estticos de una clase, de modo que pueda hacerse referencia a los mismos sin
necesidad de utilizar el nombre de la clase delante del mtodo o atributo.
Esta caracterstica puede resultar bastante til cuando se utilizan los
mtodos de la clase Math pues, como sabemos, todos ellos son estticos. Por
ejemplo, para invocar al mtodo pow() con la importacin esttica de la clase
Math, podemos utilizar pow(3, 8) en vez de Math.pow(3, 8).
Para importar los elementos estticos de una clase debemos utilizar la
instruccin import de la forma siguiente:
import static paquete.clase.*;
UTILIZACIN DE FECHAS
El paquete java.util proporciona dos clases para el tratamiento bsico de
fechas en una aplicacin Java, se trata de las clases Date y Calendar.
RA-MA
La clase Date
Un objeto Date representa una fecha y hora concretas con precisin de un
milisegundo. Esta clase permite manipular una fecha y obtener informacin de la
misma de una manera tremendamente sencilla, sin embargo, ofrece un nulo soporte
para la internalizacin de aplicaciones por lo que a partir de la versin JDK 1.1 se
incorpor una nueva clase llamada Calendar que ampla las posibilidades a la hora
de trabajar con fechas.
No obstante, y aunque la mayora de los mtodos de esta clase estn
deprecated (obsoletos), no est de ms conocer su funcionamiento bsico.
Uno de los dos constructores de Date que quedan no deprecated es el
constructor por defecto. Utilizando ste, crearamos un objeto Date representando
la fecha y hora actuales:
Date dt = new Date();
mostrara en pantalla algo similar a esto (suponiendo que esa fuera la fecha y hora
en que se ejecuta la aplicacin):
Thu Dec 14 09:59:46 CET 2006
RA-MA
La clase Calendar
Como se ha comentado anteriormente, la clase Calendar surgi para cubrir
las carencias de la clase Date en el tratamiento de fechas.
RA-MA
import java.util.*;
public class PruebaCalendar {
public static void main(String[] args) {
Calendar cal=Calendar.getInstance();
String fecha="";
fecha+=cal.get(Calendar.DAY_OF_MONTH)+"/";
fecha+=cal.get(Calendar.MONTH)+1+"/";
fecha+=cal.get(Calendar.YEAR);
System.out.println("Hoy es "+fecha);
}
}
Obsrvese como en el caso del mes el valor devuelto por get() est
comprendido entre 0 y 11, por lo que ser necesario sumar un 1 al resultado.
void set(int ao, int mes, int da). Modifica la fecha del objeto
calendar, asignndole el ao, mes y da especificados en los
parmetros. Este mtodo est sobrecargado, existiendo otra versin
en la que es posible establecer nuevos valores tanto para la fecha
como para la hora. Por otro lado, debemos tener en cuenta que los
meses comienzan a numerarse por 0.
void roll(int campo, int cantidad). Funciona igual que add(), con la
diferencia de que la adicin de la cantidad de tiempo al campo no
RA-MA
CLASES DE ENVOLTORIO
Para cada uno de los tipos de datos bsicos, Java proporciona una clase que
lo representa. A estas clases se las conoce como clases de envoltorio, y se utilizan
fundamentalmente para:
RA-MA
RA-MA
Autoboxing
El autoboxing representa otra de las nuevas caractersticas del lenguaje
incluidas a partir de la versin Java 5 siendo, probablemente, una de las ms
prcticas.
Consiste en la encapsulacin automtica de un dato bsico en un objeto de
envoltorio, mediante la utilizacin del operador de asignacin.
Por ejemplo, segn se ha explicado anteriormente, para encapsular un dato
entero de tipo int en un objeto Integer, deberamos proceder del siguiente modo:
int p = 5;
Integer n = new Integer(p);
RA-MA
muestraNumeros(Integer [] nums){
int suma=0;
for(Integer n: nums){
suma+=n; //autounboxing
System.out.println("El nmero vale "+n);
}
System.out.println("La suma total es "+suma);
Salida
PrintStream
BufferedReader
Entrada
InputStream
InputStreamReader
Fig. 58.
RA-MA
Salida de datos
El envo de datos al exterior se gestiona a travs de la clase PrintStream,
utilizndose un objeto de la misma para acceder al dispositivo de salida.
Posteriormente, con los mtodos proporcionados por esta clase, podemos enviar la
informacin al exterior.
El proceso de envo de datos a la salida debe realizarse siguiendo dos
pasos:
1. Obtencin del objeto PrintStream. Se debe crear un objeto
PrintStream asociado al dispositivo de salida, la forma de hacerlo
depender del dispositivo en cuestin. La clase System
proporciona el atributo esttico out que contiene una referencia al
objeto PrintStream asociado a la salida estndar, representada por
la consola.
2. Envo de datos al stream. La clase PrintStream dispone de los
mtodos print(String cadena) y println(String cadena) para
enviar una cadena de caracteres al dispositivo de salida,
diferencindose uno de otro en que el segundo aade un salto de
lnea al final de la cadena. Esto explica que para enviar un
mensaje a la consola se utilice la expresin:
System.out.println("texto de salida");
o
objeto_printstream.print(dato)
RA-MA
RA-MA
Funcin
s , S
c, C
x, X
e,E
Fig. 59.
RA-MA
Carcter
Funcin
Fig. 60.
Carcter
Funcin
Fig. 61.
RA-MA
Entrada de datos
La lectura de datos del exterior se gestiona a travs de la clase
InputStream. Un objeto InputStream est asociado a un dispositivo de entrada,
que en el caso de la entrada estndar (el teclado) podemos acceder al mismo a
travs del atributo esttico in de la clase System.
Sin embargo, el mtodo read() proporcionado por la clase InputStream
para la letura de los datos no nos ofrece la misma potencia que print o println para
la escritura. La llamada a read() devuelve el ltimo carcter introducido a travs de
dispositivo, esto significa que para leer una cadena completa sera necesario
hacerlo carcter a carcter, lo que hara bastante ineficiente el cdigo.
Por ello, para realizar la lectura de cadenas de caracteres desde el exterior
es preferible utilizar otra de las clases del paquete java.io: la clase
BufferedReader.
La lectura de datos mediante BufferedReader requiere seguir los siguientes
pasos en el programa:
1. Crear objeto InputStreamReader. Este objeto permite convertir
los bytes recuperados del stream de entrada en caracteres. Para
crear un objeto de esta clase, es necesario indicar el objeto
InputStream de entrada, si la entrada es el teclado este objeto lo
tenemos referenciado en el atributo esttico in de la clase
System:
InputStreamReader rd;
rd=new InputStreamReader(System.in);
RA-MA
Lanza la excepcin
im port java.io.*;
public class Ejem plo {
public static void m ain(String[] args) throws IOException{
String cad;
InputStream Reader ir;
BufferedReader bf;
//1. Crea objeto InputStream Reader
ir=new InputStream Reader(System .in);
//2. Crea objeto BufferedReader
bf=new BufferedReader(ir);
System .out.println("Introduzca su nom bre");
//3. Lee la lnea de texto introducida
cad=bf.readLine();
System .out.println("Te llam as: "+cad);
}
}
Fig. 62.
RA-MA
RA-MA
PRCTICA 3.2.
Scanners
Como acabamos de comprobar, la lectura de datos por teclado desde una
aplicacin Java resulta bastante engorrosa. A fin de simplificar este proceso, con la
versin Java 5 se incorpora la clase java.util.Scanner. Esta clase proporciona una
serie de mtodos para realizar la lectura de datos desde un dispositivo de entrada o
fichero, tanto en forma de cadena de caracteres como en cualquier tipo bsico.
Esto
token2
token3
es
una
Fig. 63.
token4
cadena
RA-MA
d).
Establece
un
nuevo
RA-MA
Como hemos indicado antes, hay que tener en cuenta que el delimitador de
token es el espacio en blanco. En el programa anterior esto significa que si el
nombre introducido contiene un espacio, por ejemplo, Luis Prez, al ejecutar la
instruccin:
nom = sc.next();
siendo source un objeto de la clase java.io.File asociado al fichero que contiene los
datos a leer y sc la variable que almacenar la referencia al objeto scanner. Como
se ver en el captulo 6, un objeto File es una representacin abstracta de un fichero
o archivo del disco. Para su creacin podemos recurrir a la expresin:
File f=File (String pathname)
RA-MA
EXPRESIONES REGULARES
Las expresiones regulares se introdujeron en Java a partir de la versin 1.4.
Normalmente, las expresiones regulares se emplean en programacin para la
creacin de patrones, cuya principal utilidad es la bsqueda de coincidencias dentro
de una cadena de caracteres.
Una expresin regular se compone de una combinacin de caracteres que
tienen una funcionalidad especial, por ejemplo, la expresin J2[SEM]E
permitira definir un patrn para la localizacin de las palabras J2SE, J2ME y J2EE
en una cadena.
RA-MA
Definicin de un patrn
Un patrn es un objeto de la clase Pattern, para crearlo se debe utilizar el
mtodo esttico compile() de la propia clase Pattern. El formato de este mtodo es
el siguiente:
static Pattern compile (String reg)
donde la cadena de texto reg representa la expresin regular que define el patrn.
De esta forma, si quisiramos crear un patrn con la expresin regular expuesta
anteriormente como ejemplo sera:
Pattern p=Pattern.compile("J2[SEM]E");
Bsqueda de coincidencias
Una vez definido el patrn, ste puede aplicarse sobre una determinada
cadena de caracteres para comprobar si existe una parte de la misma que coincida
con los criterios establecidos en la expresin del patrn.
Esta busqueda de coincidencias se realiza utilizando los mtodos de la
clase Matcher. La clase Pattern dispone del mtodo matcher() que permite crear un
objeto Matcher a partir de la cadena donde se desea realizar la bsqueda:
Matcher matcher (String cadena)
Por ejemplo, para poder aplicar los mtodos de bsqueda de Matcher sobre
la cadena J2SE, utilizando el objeto Pattern definido anteriormente, deberamos
crear un objeto Matcher utilizando la siguiente instruccin:
Matcher m = p.matcher("J2SE");
RA-MA
Una vez creado el objeto, podemos emplear por ejemplo el mtodo boolean
matches() para saber si la cadena coincide completamente o no con la expresin del
patrn:
if(m.matches()){
System.out.println("Existe coincidencia");
}
else{
System.out.println("No se encontraron "+
" coincidencias");
}
RA-MA
Carcter
Funcin
\d
Dgito entre 0 y 9.
\s
Espacio en blanco.
\w
Fig. 64.
Caracteres especiales
Smbolo
Funcin
Fig. 65.
RA-MA
Expresin
Significado
\d\d/\d\d/\d\d
\w+\.?\w+@\w+\.\w+
www\..+\.com
Fig. 66.
RA-MA
RA-MA
COLECCIONES
Una coleccin es un objeto que almacena un conjunto de referencias a
otros objetos, dicho de otra manera, es una especie de array de objetos.
Sin embargo, a diferencia de los arrays, las colecciones son dinmicas, en
el sentido de que no tienen un tamao fijo y permiten aadir y eliminar objetos en
tiempo de ejecucin.
Java incluye en el paquete java.util un amplio conjunto de clases para la
creacin y tratamiento de colecciones. Todas ellas proporcionan una serie de
mtodos para realizar las operaciones bsicas sobre una coleccin, como son:
Aadir objetos a la coleccin.
Eliminar objetos de la coleccin.
Obtener un objeto de la coleccin.
Localizar un objeto en la coleccin.
Iterar a travs de una coleccin.
A continuacin, vamos a estudiar algunas de las clases de coleccin ms
significativas.
RA-MA
La clase ArrayList
Un ArrayList representa una coleccin basada en ndices, en la que cada
objeto de la misma tiene asociado un nmero (ndice) segn la posicin que ocupa
dentro de la coleccin, siendo 0 la posicin del primer elemento (figura 67).
o b je to s
A r r a y L is t
n d ic e s
0
1
2
Fig. 67.
CREACIN DE UN ARRAYLIST
Para crear un objeto ArrayList utilizamos la expresin:
ArrayList variable_objeto=new ArrayList();
Una vez creado, podemos hacer uso de los mtodos de la clase ArrayList
para realizar las operaciones habituales con una coleccin.
RA-MA
RA-MA
RA-MA
RA-MA
RA-MA
RA-MA
La clase Hashtable
La clase Hashtable representa un tipo de coleccin basada en claves (figura
68), donde los objetos almacenados en la misma (valores) no tienen asociado un
ndice numrico basado en su posicin, sino una clave que lo identifica de forma
nica dentro de la coleccin. Una clave puede ser cualquier tipo de objeto.
La utilizacin de colecciones basadas en claves resulta til en aquellas
aplicaciones en las que se requiera realizar bsquedas de objetos a partir de un dato
que lo identifica. Por ejemplo, si se va a gestionar una coleccin de objetos de tipo
Empleado, puede resultar ms prctico almacenarlos en un hashtable,
asocindoles como clave el dni, que guardarlos en un ArrayList en el que a cada
empleado se le asigna un ndice segn el orden de almacenamiento.
claves
valores
H ashtable
Fig. 68.
Organizacin de un hashtable
CREACIN DE UN HASHTABLE
La creacin de un objeto hashtable se realiza utilizando el constructor sin
parmetros de la clase:
Hashtable variable_objeto=new Hashtable();
Por ejemplo,
Hashtable tb=new Hashtable();
RA-MA
mostrar en pantalla:
Antes se llamaba pepito
RA-MA
Objeto
Enumeration
Fig. 69.
RA-MA
RA-MA
import java.io.*;
import java.util.*;
public class GestionNombres {
public static void main(String[] args)
throws IOException{
Hashtable nombres=new Hashtable();
String opcion;
BufferedReader bf=new BufferedReader(
new InputStreamReader(System.in));
do{
System.out.println("Elegir opcin:\n");
System.out.println("1. Aadir nombre");
System.out.println("2. Eliminar nombre");
System.out.println("3. Mostrar todos los "+
"nombres");
System.out.println("4. Salir");
opcion=bf.readLine();
switch(Integer.parseInt(opcion)){
case 1:
String nom,dni;
System.out.println("Introduce Nombre: ");
nom=bf.readLine();
System.out.println("DNI: ");
dni=bf.readLine();
almacenaNombre(nom,dni,nombres);
break;
case 2:
String d;
System.out.println("Introduzca el dni: ");
d=bf.readLine();
eliminaNombre(d,nombres);
break;
case 3:
mostrarTodos(nombres);
break;
}
}
while(!opcion.equals("4"));
}
RA-MA
Genricos
Despus de haber analizado el funcionamiento de las colecciones y de
haber estudiado algunas de las clases ms significativas en este terreno, es el
momento de abordar una de las mejoras ms significativas del lenguaje incluidas
en Java 5 y que simplifica algunos de los aspectos relativos al tratamiento de
colecciones en los programas. Se trata de los genricos.
RA-MA
RA-MA
RA-MA
for(int i=0;i<l.size();i++){
String s=l.get(i); //ausencia de casting
System.out.println(s.length());
}
RA-MA
RA-MA
RA-MA
do{
System.out.println("Elegir opcin:\n");
System.out.println("1. Aadir temperatura");
System.out.println("2. Mostrar temperatura "+
"media");
System.out.println("3. Mostrar temperaturas "+
"extremas");
System.out.println("4. Salir");
opcion=sc.nextInt();
switch(opcion){
case 1:
double temp;
System.out.println("Introduce la "+
"temperatura: ");
//Recupera el dato como un double
temp=sc.nextDouble();
almacenaTemperatura(temp,temperaturas);
break;
case 2:
muestraMedia(temperaturas);
break;
case 3:
muestraExtremas(temperaturas);
}
}
while(opcion!=4);
}
static void almacenaTemperatura(double d,
ArrayList<Double> temperaturas){
//autoboxing
temperaturas.add(d);
}
static void muestraMedia(
ArrayList<Double> temperaturas){
double media=0.0;
for(Double tp:temperaturas){
media+=d;//autounboxing
}
media/=temperaturas.size();
RA-MA
RA-MA
RA-MA
A esta forma de definir una clase se la conoce como definicin con tipo
parametrizado o definicin de tipo genrico. La anterior declaracin se lee clase
ArrayList de E, donde E, llamado tambin parmetro de tipo, es la letra utilizada
para referirse al tipo de elementos que se pueden aadir y representa a cualquier
tipo de objeto Java.
Como hemos visto en el apartado anterior, es en la declaracin de una
variable de la clase ArrayList y en la creacin de un objeto de la misma cuando se
tiene que especificar el tipo concreto de objetos que se van a tratar en esa
coleccin, sustituyendo la letra E por el nombre de clase correspondiente:
//ArrayList de enteros
ArrayList<Integer> n;
n = new ArrayList<Integer>();
//ArrayList de cadenas
ArrayList<String> cad;
cad = new ArrayList<String>();
RA-MA
RA-MA
RA-MA
Lgica
Clase1.class
ClaseN.class
Clase2.class
m ain()
Clase3.class
Fig. 70.
RA-MA
RA-MA
RA-MA
RA-MA
CUESTIONES DE AUTOEVALUACIN
1. Qu mensaje aparecer en pantalla tras la ejecucin del siguiente
bloque de instrucciones?
String s = new String ("cadena nueva");
String p = new String ("cadena nueva");
if(s==p){
System.out.println("Son iguales");
}
else{
System.out.println("Son diferentes");
}
RA-MA
A. Aparecer: s es mayor
B. Aparecer: p es mayor
C. Se producir un error de compilacin
D. Se producir una excepcin
4. Cules de las siguientes clases de envoltorio proporcionan el
mtodo longValue()?
Int, Float, Character, Boolean, Byte, Long
5. Para leer un dato nmero entero desde el teclado, suponiendo que
la variable bf apunta a un objeto BufferedReader asociado, habra
que utilizar la instruccin:
A. int num = Integer.parseInt(bf.readLine());
B. int num = (bf.readLine()).intValue();
C. int num = (int)bf.readLine();
6. Por qu no compilara el siguiente bloque de cdigo?
ArrayList v = new ArryList();
int n [] = {4, 9, 2, 5};
for(int i=0;i<n.length;i++){
v.add(n[i]);
}
RA-MA
PRCTICA 3.2.
import java.io.*;
public class GestionNotas {
public static void main(String[] args)
throws IOException{
InputStreamReader is=
RA-MA
new InputStreamReader(System.in);
BufferedReader bf=new BufferedReader(is);
//almacena la nota leda
float nota=0.0f;
//almacenar la nota media
float media=0.0f;
//lleva la cuenta de las notas ledas
int validas=0;
//almacenarn las notas extremas
float baja=10.0f,alta=0.0f;
System.out.println("Introduce nota ");
nota=Float.parseFloat(bf.readLine());
//mientras la nota leda sea positiva
//actualiza las variables que contienen
//la media, nota mxima y nota mnima
//y vuelve a leer una nueva nota
while(nota>=0.0){
if(nota>alta){
alta=nota;
}
if(nota<baja){
baja=nota;
}
media+=nota;
System.out.println("Introduce nota ");
nota=Float.parseFloat(bf.readLine());
validas++;
}
//slo calcula la media si por lo menos hay una
//nota vlida (no negativa)
if(validas>0){
media/=validas;
}
System.out.println("media "+media+
" validas "+validas);
System.out.println("alta "+alta);
System.out.println("baja "+baja);
}
}
PRCTICA 3.3.
*******clase Pila***********
public class Pila <E>{
//almacena la pila de objetos en un ArrayList
//de tipo genrico
private ArrayList<E> v=new ArrayList<E>();
public void agregar(E s)
{
//si el objeto no existe la aade
if(v.indexOf(s)==-1){
v.add(s);
}
}
public void quitar()
{
//elimina el ltimo objeto introducido
v.remove(v.size()-1);
}
public E obtener(int p)
{
return v.get(p);
}
public int total()
{
//el tamao del ArrayList determina el
//nmero de elementos almacenados
return v.size();
}
}
*************clase GestionPila********
import java.util.*;
public class GestionPila {
public static void main(String[] args) {
//utiliza Scanner en vez de BufferedReader
Scanner sc=new Scanner(System.in);
//crea una instancia de la clase Pila
RA-MA
RA-MA
CAPTULO 4
PROGRAMACIN ORIENTADA A
OBJETOS CON JAVA
Como ya se dijo al principio, el lenguaje Java es totalmente orientado a
objetos, esto significa que podemos aplicar en una aplicacin Java todas las
caractersticas y beneficios que proporciona este modelo de programacin, entre
ellas, la encapsulacin, la herencia y el polimorfismo.
Durante este captulo vamos a estudiar todos estos conceptos clave en los
que se basa la POO y su aplicacin en Java. Se trata de conceptos cruciales, no slo
por su aplicacin directa en el desarrollo de las aplicaciones, sino tambin porque
estn presentes en todo el conjunto de clases de J2SE y J2EE.
Los distintos temas a tratar en este captulo y en los que se va a dividir el
estudio del mismo son:
Empaquetado de clases
Modificadores de acceso
Encapsulacin
Sobrecarga de mtodos
Constructores
Herencia
Sobrescritura de mtodos
Polimorfismo
RA-MA
EMPAQUETADO DE CLASES
Como hemos comentado en el captulo anterior, la organizacin de las
clases en paquetes facilita el uso de las mismas desde otras clases. Por ello, resulta
tambin recomendable utilizar esta tcnica en el desarrollo de nuestras propias
clases.
Si queremos crear una estructura de paquetes en la que vamos a incluir las
clases que vamos a definir, debemos proceder como sigue:
-
r a z
p a q u e te 1
p a q u e te 2
:
Fig. 71.
RA-MA
Fig. 72.
RA-MA
Ahora ya podemos hacer uso de Ejemplo desde cualquier otra clase que
vayamos a crear, independientemente de donde est situada. Eso s, como ya
explicamos en el captulo 3, para referirse a la clase Ejemplo desde otro lugar habr
que utilizar el nombre cualificado de la misma (pjava.Ejemplo), o bien importarla
mediante la sentencia import:
import pjava.Ejemplo;
public class OtraClase{
public void llamada(){
Ejemplo ej = new Ejemplo();
System.out.println(ej.getMensaje());
}
}
RA-MA
MODIFICADORES DE ACCESO
El tema de los modificadores de acceso no es un punto de la programacin
orientada a objetos como tal, sin embargo, conviene aclarar este aspecto antes de
entrar a analizar otros conceptos ms avanzados.
Los modificadores de acceso se utilizan para definir la visibilidad de los
miembros de una clase (atributos y mtodos) y de la propia clase.
En Java existen cuatro modificadores de acceso que, ordenados de menor a
mayor visibilidad, son:
private. Cuando un atributo o mtodo es definido como private, su
uso est restringido al interior de la clase, lo que significa que
solamente puede ser utilizado en el interior de su misma clase. Este
modificador puede ser aplicado a mtodos y atributos, pero no a la
clase.
RA-MA
package paquete2;
public class ClaseC{
void metodo3(){
//error, las clases estn en paquetes
//diferentes
ClaseA ca = new ClaseA();
}
void metodo4(){
ClaseB cb = new ClaseB();
//error, metodo2() no es visible desde
//ClaseC
cb.metodo2();
}
}
(default)
protected
public
clase
NO
NO
mtodo
atributo
variable local
NO
NO
NO
NO
Fig. 73.
RA-MA
ENCAPSULACIN
Como ya vimos en los primeros captulos, una clase est compuesta, por un
lado, de mtodos que determinan el comportamiento de los objetos de la clase y,
por otro, de atributos que representan las caractersticas de los objetos de la clase.
Los mtodos que se quieren exponer al exterior llevan el modificador de
acceso public, mientras que los atributos suelen tener acceso privado, de modo que
solamente puedan ser accesibles desde el interior de la clase.
sa es precisamente la idea de la encapsulacin: mantener los atributos de
los objetos como privados y proporcionar acceso a los mismos a travs de mtodos
pblicos (mtodos de acceso). Esta filosofa de programacin proporciona grandes
beneficios, entre los que cabra destacar:
Proteccin de datos
Imaginemos que tenemos que crear una clase que representa una figura
geomtrica, por ejemplo, un rectngulo. Dicha clase podra proporcionar diversos
mtodos para realizar clculos sobre la figura, adems de disponer de los atributos
que la caracterizaran, como pueden ser alto y ancho.
Supongamos que desarrollamos la clase sin aplicar el concepto de
encapsulacin, proporcionando acceso pblico a los atributos:
public class Rectangulo{
public int alto, ancho;
//Mtodos de la clase
:
}
RA-MA
RA-MA
RA-MA
RA-MA
}
public void setDni(String n)
{
dni=n;
}
public String getDni()
{
return dni;
}
}
PRCTICA 4.1.
RA-MA
SOBRECARGA DE MTODOS
Otra de las ventajas que nos ofrece la POO orientada a objetos es poder
tener en una misma clase varios mtodos con el mismo nombre, a esto se le
llama sobrecarga de mtodos.
Ejemplos de sobrecarga nos hemos encontrado ya en las clases de uso
general que se han visto hasta el momento. Un caso concreto es el de los mtodos
valueOf() de la clase String para conversin de tipos bsicos en cadenas de
caracteres, donde tenemos una versin de este mtodo para cada uno de los tipos
bsicos Java.
La gran ventaja de la sobrecarga de mtodos es que, si tenemos varios
mtodos que van a realizar la misma operacin (por ejemplo, convertir un tipo
bsico en una cadena), no necesitamos asignarle un nombre diferente a cada uno
(con la consiguiente dificultad a la hora de aprenderlos y posible confusin), sino
que podemos llamarlos igual a todos ellos.
Para que un mtodo pueda sobrecargarse es imprescindible que se d la
siguiente condicin: cada versin del mtodo debe distinguirse de las otras en el
nmero o tipo de parmetros. El tipo de devolucin puede ser o no el mismo, lo
que es indispensable es que se d la condicin anterior.
RA-MA
RA-MA
Texto predeterminado
CONSTRUCTORES
Definicin y utilidad
Para entender la utilidad de los constructores, vamos a utilizar como
ejemplo la clase Punto. Esta clase representa puntos geomtricos caracterizados
por dos coordenadas, x e y, donde a modo de ejemplo se ha aadido un mtodo
llamado dibujar() y cuya nica funcin es mostrar en pantalla los valores de las
coordenadas del punto. La implementacin de esta clase sera la siguiente:
public class Punto {
private int x,y;
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x=x;
}
public void setY(int y) {
this.y=y;
}
public void dibujar()
{
System.out.println("Las coordenadas son "+
x +","+y);
}
}
RA-MA
Como se ve, cada vez que se quiere crear un punto para hacer
posteriormente alguna operacin con el mismo, es necesario primero llamar
explcitamente a los mtodos setX() y setY() para asignar valores a las coordenadas
del punto. Esto, adems de resultar pesado en caso de tener muchos atributos,
puede dar lugar a olvidos y, por tanto, a que ciertos atributos queden sin ser
inicializados de manera explcita (tomaran un valor por defecto). Para evitar estos
problemas, tenemos los constructores.
Un constructor es un mtodo especial que es ejecutado en el momento en
que se crea un objeto de la clase (cuando se llama al operador new). Podemos
utilizar los constructores para aadir aquellas tareas que deban realizarse en el
momento en que se crea un objeto de la clase, como por ejemplo, la inicializacin
de los atributos.
A la hora de crear un constructor, hay que tener en cuenta las siguientes
reglas:
RA-MA
:
}
RA-MA
RA-MA
PRCTICA 4.2.
RA-MA
cantidad y la extrae del objeto creado en las opciones 1 2 (tambin debe haber
pasado antes por estas opciones). Finalmente, la opcin 5 muestra el saldo,
mientras que la 6 finaliza el programa, lo que provocar obviamente que el objeto
Cuenta se destruya y se pierda el saldo.
El men vuelve a presentarse en pantalla mientras no se elija la opcin de
salir.
HERENCIA
La herencia representa uno de los conceptos ms importantes y potentes de
la Programacin Orientada a Objetos.
Concepto de herencia
Podemos definir la herencia como la capacidad de crear clases que
adquieran de manera automtica los miembros (atributos y mtodos) de otras clases
que ya existen, pudiendo al mismo tiempo aadir atributos y mtodos propios.
Ventajas de la herencia
Entre las principales ventajas que ofrece la herencia en el desarrollo de
aplicaciones, estn:
RA-MA
Nomenclatura y reglas
Antes de ver cmo se crean clases en Java utilizando herencia, vamos a
definir la nomenclatura bsica y a conocer ciertas reglas a tener en cuenta sobre la
herencia.
S u p e r c la s e /
c la s e b a s e
S u b c la s e /
c la s e d e r iv a d a
Fig. 74.
Relacin de herencia
RA-MA
No es posible
Clase A
S es posible
Clase X
Clase A
Clase B
Clase B
S es posible
Clase C
Clase A
Clase B
Fig. 75.
Clase C
Relaciones de herencia posibles y no posibles
Relacin es un
La herencia entre dos clases establece una relacin entre las mismas de tipo
es un, lo que significa que un objeto de una subclase tambin es un objeto de la
superclase.
Por ejemplo, Vehculo es la superclase de Coche, por lo que un coche es
un vehculo (figura 76). De la misma forma, Animal es la superclase de Mamfero
y sta es a su vez superclase de Len, esto nos lleva a que un Len es un
mamfero y es un animal.
As pues, una forma de saber si una relacin de herencia entre dos clases
est bien planteada es comprobar si se cumple la relacin es un entre la subclase
y la superclase. Por ejemplo, para crear una clase Lnea podramos intentar heredar
Punto pensando que es una subclase de sta, sin embargo, una lnea es un
punto? La respuesta es NO, por lo que la herencia est mal planteada.
RA-MA
V e h c u lo
U n c o c h e e s u n v e h c u lo
C oche
Fig. 76.
RA-MA
La clase Object es, por tanto, la superclase de todas las clases de Java,
incluidas las del API J2SE y J2EE.
Aunque una subclase hereda todos los miembros de la superclase, incluido
los privados, no tiene acceso directo a stos, puesto que private significa privado a
la clase o lo que es lo mismo, solamente accesibles desde el interior de sta.
As pues, cmo se puede acceder desde el interior de la subclase a los
atributos privados de la superclase? En el caso de que la superclase disponga de
mtodos set/get, se pueden utilizar directamente desde la subclase al ser heredados
por sta. No obstante, de cara a la inicializacin de atributos, los constructores
representan la mejor opcin para acceder a los datos miembro de la clase; en el
siguiente apartado veremos cmo podemos hacer uso de los constructores de la
superclase desde la subclase.
RA-MA
RA-MA
RA-MA
PRCTICA 4.3.
Utilizando la herencia, en esta prctica vamos a crear una nueva clase que
herede BufferedReader y que, adems de los mtodos de sta, incluya una serie de
mtodos propios que faciliten la lectura de datos de tipo numrico en una
aplicacin. Para ello, esta nueva clase, a la que llamaremos LecturaNumeros,
deber definir una serie de mtodos adicionales que permitan realiza esta tarea.
Estos deben ser:
int readInt(). Devolver el dato numrico correspondiente a la ltima lnea
de caracteres suministrada.
int readInt(String mensaje). Igual que el anterior, mostrndole
previamente al usuario el mensaje indicado.
Integer readInteger(). Funciona igual que readInt(), devolviendo el dato
como un objeto Integer.
double readDouble(). Devolver el dato numrico ledo, como un tipo
double.
double readDouble(String mensaje). Igual que el anterior, mostrndole
previamente al usuario el mensaje indicado.
As mismo, la clase deber contar con una serie de constructores que
permitan asociar el objeto al dispositivo de entrada:
LecturaNumeros(). Prepara al objeto para realizar la lectura de datos por
teclado.
LecturaNumeros(Reader r). Realiza la lectura desde el objeto Reader
especificado como parmetro.
RA-MA
Una subclase de Persona definida en otro paquete podr hacer uso del
mtodo getEdad():
package varios;
import basico.Persona;
public class Empleado extends Persona{
private int edad;
private long nseg;
public Empleado(String fecha_nacimiento, long nseg){
super(fecha_nacimiento);
this.nseg=nseg;
}
public void muestradatos(){
//Acceso al mtodo protegido
System.out.println ("Edad: "+this.getEdad());
System.out.println("NISS: "+nseg);
}
}
RA-MA
Clases finales
Si queremos evitar que una clase ser heredada por otra, deber ser
declarada con el modificador final delante de class:
public final class ClaseA{
:
}
Sobrescritura de mtodos
Cuando una clase hereda a otra, el comportamiento de los mtodos que
hereda no siempre se ajusta a las necesidades de la nueva clase. Por ejemplo, el
mtodo dibujar() que hereda la clase PuntoColor no se ajusta del todo a sus
necesidades, ya que no tiene en cuenta el color a la hora de dibujar el punto.
En estos casos, la subclase puede optar por volver a reescribir el mtodo
heredado, es lo que se conoce como sobrescritura de un mtodo.
RA-MA
RA-MA
}
}
cla ss C o ch e e x te n d s V e h icu lo{
p ub lic vo id arran car(){
so b re c arg a
Fig. 77.
RA-MA
Por otro lado, si se quiere evitar que un mtodo pueda ser sobrescrito desde
una subclase deber declararse con el modificador final:
public final void metodo(..){...}
PRCTICA 4.4.
RA-MA
CLASES ABSTRACTAS
Despus de estudiar la herencia, vamos a analizar las clases abstractas.
stas juegan un papel fundamental en otro de los conceptos clave de la POO que
estudiaremos ms adelante: el polimorfismo.
Definicin
Una clase abstracta es una clase en la que alguno de sus mtodos est
declarado pero no est definido, es decir, se especifica su nombre, parmetros y
tipo de devolucin pero no incluye cdigo. A este tipo de mtodos se les conoce
como mtodos abstractos.
Un mtodo se define como abstracto porque en ese momento no se conoce
cmo ha de ser su implementacin; sern las subclases de la clase abstracta las
responsables de darle cuerpo mediante la sobrescritura del mismo.
Por ejemplo, se sabe que toda Figura debe tener un mtodo para poder
calcular el rea, sin embargo, en la definicin de la clase Figura no es posible
codificar este mtodo al depender el clculo de cada tipo concreto de Figura. En
este caso definiramos el mtodo como abstracto en la clase Figura, dejando a las
subclases de esta (Triangulo, Circulo, etc.) los detalles de implementacin.
Al incluir el mtodo en la superclase obligamos a que todas las subclases
respeten el formato especificado.
Sintaxis y caractersticas
La sintaxis para la creacin de una clase abstracta es la siguiente:
public abstract class nombre_clase
{
public abstract tipo nombre_metodo(argmentos);
//otros mtodos
}
RA-MA
Por ejemplo:
public abstract class Figura
{
public abstract double area();
:
}
RA-MA
RA-MA
RA-MA
return base;
}
public int getAltura{
return altura;
}
}
//Clase Circulo
public class Circulo extends Figura{
private int radio;
public Circulo(int r, String c){
super(c);
radio=r;
}
public double area(){
return Math.PI*radio*radio;
}
public int getRadio{return radio;}
}
Triangulo
Atributos:
Mtodos:
color
getColor()
*area()
Circulo
Atributos:
base
altura
getBase()
getAltura()
area()
* Clase/mtodo abstracta/o
Fig. 78.
radio
Mtodos:
getRadio()
area()
RA-MA
POLIMORFISMO
El polimorfismo se basa en gran medida en los conceptos aprendidos
anteriormente, de hecho, es una de las principales aplicaciones de la herencia y
supone el principal motivo de la existencia de las clases abstractas.
Pero antes de definir el polimorfismo, es necesario conocer un fenmeno
fundamental sobre la asignacin de objetos a variables.
Definicin de polimorfismo
Posiblemente, nos estemos preguntando qu utilidad puede tener asignar
un objeto a una variable de su superclase para llamar a sus mtodos, cuando eso
mismo podemos hacerlo si le asignamos a una variable de su propia clase?
RA-MA
RA-MA
o b je to
T r i n g u lo
o b je to
C r c u lo
/ * I n s t r u c c io n e s
q u e u t iliz a n
u n a v a r ia b le d e
t ip o F ig u r a * /
Fig. 79.
Utilizacin de polimorfismo
RA-MA
RA-MA
De esta manera, suponiendo que cir es una variable que contiene una
referencia a un objeto Crculo en un determinado programa, para obtener una copia
de este objeto Crculo utilizando el mtodo anterior deberamos escribir:
Circulo cir2=(Circulo)cir.getNewFigura();
RA-MA
PRCTICA 4.5.
Dado que Object es la superclase de todas las clases Java y que, por tanto,
Integer es una subclase de Object, cabra pensar que la siguiente instruccin es
totalmente correcta:
objs=new ArrayList<Integer>;
RA-MA
Comodines
Lo indicado anteriormente puede parecer una limitacin, pues impedira
definir mtodos polimrficos que pudiesen trabajar con colecciones genricas. Por
ejemplo, si quisiramos tener un mtodo que mostrase en pantalla el contenido de
cualquier coleccin de objetos utilizando tipos genricos, intentaramos hacer algo
como esto:
public void imprime(ArrayList<Object> objs){
for(Object o:objs){
System.out.println(o.toString());
}
}
RA-MA
System.out.println(o.toString());
}
}
Cuando trabajamos con el tipo comodn, hay que tener presente que ste
representa cualquier tipo de dato y en ningn caso se podr intentar aadir a
una coleccin de tipo comodn un objeto de un tipo especfico:
public void tratamiento(
ArrayList<? extends Figura> figs){
figs.add(new Circulo());//Error de compilacin
}
RA-MA
INTERFACES
Definicin de interfaz
Estrictamente hablando, una interfaz es un conjunto de mtodos abstractos
y de constantes pblicos definidos en un archivo .java. Una interfaz es similar a
una clase abstracta llevada al lmite, en la que todos sus mtodos son abstractos.
La finalidad de una interfaz es la de definir el formato que deben de tener
determinados mtodos que han de implementar ciertas clases (figura 80).
Por ejemplo, para gestionar eventos en una aplicacin basada en entorno
grfico, las clases donde se capturan estos eventos deben codificar una serie de
mtodos que se ejecutarn al producirse estos eventos. Cada tipo de evento tendr
su propio mtodo de respuesta, cuyo formato estar definido en una interfaz. As,
aquellas clases que deseen responder a un determinado evento debern
implementar el mtodo de respuesta de acuerdo al formato definido en la interfaz.
Hay que insistir en el hecho de que una interfaz no establece lo que un
mtodo tiene que hacer y cmo hacerlo, sino el formato (nombre, parmetros y tipo
de devolucin) que ste debe tener.
Clase1
public void click(){
Clase2
Clasen
..
Interfaz
public void click();
Fig. 80.
:
}
RA-MA
Por ejemplo,
public interface Operaciones{
void rotar();
String serializar();
}
Al igual que las clases, las interfaces se definen en archivos .java y, como
sucede con aquellas, si la interfaz utiliza el modificador de acceso public, el
nombre de la interfaz deber coincidir con el del fichero .java donde se almacena.
Como resultado de la compilacin de una interfaz, se genera un archivo .class.
A la hora de crear una interfaz hay que tener en cuenta las siguientes
consideraciones:
RA-MA
int k=23;
public String s="hj";
public static final double p=4.5;
Object o=new Object();
Por ejemplo,
public class Triangulo implements Operaciones{
public void rotar(){
//implementacin del mtodo
}
public String Serializar(){
//implementacin de mtodo
}
}
RA-MA
RA-MA
Interfaces y polimorfismo
Como ya ocurriera con las clases abstractas, el principal objetivo que
persiguen las interfaces con la definicin de un formato comn de mtodos es el
polimorfismo.
Una variable de tipo interfaz puede almacenar cualquier objeto de las
clases que la implementan, pudiendo utilizar esta variable para invocar a los
mtodos del objeto que han sido declarados en la interfaz e implementados en la
clase:
Operaciones op = new Triangulo();
op.rotar();
op.serializar();
RA-MA
Interfaces en el J2SE
Adems de clases, los paquetes del Java estndar incluyen numerosas
interfaces, algunas de ellas son implementadas por las propias clases del J2SE y
otras estn diseadas para ser implementadas en las aplicaciones.
Como muestra, comentamos algunas de las ms importantes:
java.lang.Runnable. Contiene un mtodo para ser implementado
por aquellas aplicaciones que van a funcionar en modo multitarea.
Analizaremos su uso a lo largo del captulo 9.
java.util.Enumeration. La utilizamos en el apartado dedicado a
las colecciones. Proporciona mtodos que son implementados por
objetos utilizados para recorrer colecciones.
java.awt.event.WindowListener. Proporciona mtodos que deben
ser implementados por las clases que van a gestionar los eventos
(clases manejadoras) producidos en la ventana, dentro de una
aplicacin basada en entorno grfico. Adems de esta interfaz, hay
otras muchas ms para la gestin de otros tipos de eventos en los
diversos controles grficos Java. Estas interfaces sern estudiadas a
lo largo del captulo 8.
java.sql.Connection. Interfaz implementada por los objetos
utilizados para manejar conexiones con bases de datos. Adems de
sta, el paquete java.sql contiene otras interfaces relacionadas con
el envo de consultas SQL y la manipulacin de resultados, como
es el caso de Statement o ResultSet. Todas ellas sern analizadas
con detalle en el captulo 7.
java.io.Serializable. Esta interfaz no contiene ningn mtodo que
deba ser definido por las clases que la implementan, sin embargo,
la JVM requiere que dicha interfaz deba ser implementada por
aquellas clases cuyos objetos tengan que ser transferidos a algn
dispositivo de almacenamiento, como por ejemplo un archivo de
disco. Se estudiar durante el captulo 6.
RA-MA
CUESTIONES DE AUTOEVALUACIN
1. En cules de los siguientes elementos no puede ser aplicado el
modificador de acceso protected?
clase, mtodo, atributo, variable local, interfaz, constructor
2. Cul de las siguientes caractersticas no corresponde a la
encapsulacin?
A. Reutilizacin de cdigo
B. Proteccin de datos
C. Fcil mantenimiento de las clases
3. El siguiente cdigo provocar un error de compilacin. Indica el
motivo:
class Primera{
int k;
Primera (int s){
k=s;
}
}
class Segunda extends Primera{
Segunda(){
super();
}
Segunda(int n){
k=n;
}
}
RA-MA
RA-MA
RA-MA
RA-MA
RA-MA
System.out.println("Introduce nombre");
n=bf.readLine();
System.out.println("Introduce dni");
d=bf.readLine();
System.out.println("Introduce el "+
"telefono");
tel=Long.parseLong(bf.readLine());
if(ag.agregar(d, n,tel)){
System.out.println("La persona se "+
" ha aadido correctamente");
}
else{
System.out.println("Dni repetido, "+
"la persona no se ha aadido");
}
break;
case 2:
System.out.println("Introduce dni");
d=bf.readLine();
Persona p=ag.recuperar(d);
if(p!=null){
System.out.println("Los datos "+
" son:");
System.out.print("DNI:"+p.getDni()+
" - ");
System.out.print("Nombre:"+
p.getNombre()+" ");
System.out.println("Telefono:"+
p.getTelefono());
}
break;
case 3:
System.out.println("Introduce dni");
d=bf.readLine();
if(ag.eliminar(d)){
System.out.println("La persona ha "+
"sido eliminada");
}
else{
RA-MA
PRCTICA 4.2.
*******clase Cuenta***********
public class Cuenta {
//atributo para almacenar el saldo
//actual
private float saldo;
public Cuenta(){
//inicializa el saldo a 0
saldo=0;
}
public Cuenta(float s){
//inicializa el saldo al valor indicado
saldo=s;
RA-MA
}
public void ingresar(float c){
saldo+=c;
}
public void extraer(float c){
saldo-=c;
}
public float getSaldo(){
return saldo;
}
}
*******clase Cajero********************
import java.io.*;
public class Cajero {
public static void main(String[] args)
throws IOException{
//variable que almacenar la opcin elegida
String op;
//variable que almacenar el objeto Cuenta
Cuenta c=null;
//variable que almacenar las cantidades
float cant;
InputStreamReader is=
new InputStreamReader(System.in);
BufferedReader bf=new BufferedReader(is);
do{
System.out.println("Elegir opcin:\n");
System.out.println("1. Crear cuenta vaca");
System.out.println("2. Crear cuenta saldo "+
"inicial");
System.out.println("3. Ingresar dinero");
System.out.println("4. Sacar dinero");
System.out.println("5. Ver saldo");
System.out.println("6. Salir\n");
op=bf.readLine();
switch(Integer.parseInt(op)){
RA-MA
case 1:
c=new Cuenta();
break;
case 2:
System.out.println("Saldo inicial: ");
float inicial=
Float.parseFloat(bf.readLine());
c=new Cuenta(inicial);
break;
case 3:
System.out.println("Introduzca cantidad "+
"a ingresar: ");
cant=Integer.parseInt(bf.readLine());
c.ingresar(cant);
break;
case 4:
System.out.println("Cantidad a extraer: ");
cant=Integer.parseInt(bf.readLine());
c.extraer(cant);
break;
case 5:
System.out.println("Su saldo actual es "+
" de: "+ c.getSaldo());
break;
}
}
while(!op.equals("6"));
}
}
PRCTICA 4.3.
*********clase LecturaNumeros********
import java.io.*;
public class LecturaNumeros extends BufferedReader{
public LecturaNumeros() {
RA-MA
RA-MA
}
System.out.println("La suma es "+suma);
}
}
PRCTICA 4.4.
*******clase Cuenta*************************
public class Cuenta {
//atributo para almacenar el saldo
//actual
private float saldo;
public Cuenta(){
//inicializa el saldo a 0
saldo=0;
}
public Cuenta(float s){
//inicializa el saldo al valor indicado
saldo=s;
}
public void ingresar(float c){
saldo+=c;
}
public void extraer(float c){
saldo-=c;
}
public float getSaldo(){
return saldo;
}
}
*********clase CuentaClave*************************
public class CuentaClave extends Cuenta{
//atributo que almacena el cdigo de la cuenta
private String codigo;
public CuentaClave(String c){
RA-MA
codigo=c;
}
public CuentaClave(String c, float f){
//inicializa el saldo a travs del constructor
//de la superclase
super(f);
codigo=c;
}
public String getClave(){
return codigo;
}
public void extraer(float c){
if(getSaldo()>c){
//invoca a la versin del mtodo extraer()
//que est definida en la superclase
super.extraer(c);
}
}
}
*********clase Cajero*********************************
public class Cajero {
public static void main(String[] args)
throws IOException {
String op;
CuentaClave c=null;
float cant;
InputStreamReader is=
new InputStreamReader(System.in);
BufferedReader bf=new BufferedReader(is);
do{
System.out.println("Elegir opcin:\n");
System.out.println("1. Crear cuenta vaca");
System.out.println("2. Crear cuenta saldo "+
"inicial");
System.out.println("3. Ingresar dinero");
System.out.println("4. Sacar dinero");
System.out.println("5. Ver saldo");
RA-MA
System.out.println("6. Salir");
op=bf.readLine();
switch(Integer.parseInt(op)){
case 1:
System.out.println("Cdigo de cuenta: ");
String cod=bf.readLine();
c=new CuentaClave(cod);
break;
case 2:
System.out.println("Cdigo de cuenta: ");
cod=bf.readLine();
System.out.println("Saldo inicial: ");
float inicial=
Float.parseFloat(bf.readLine());
c=new CuentaClave(cod,inicial);
break;
case 3:
System.out.println("Introduzca cantidad "+
" a ingresar: ");
cant=Integer.parseInt(bf.readLine());
c.ingresar(cant);
break;
case 4:
System.out.println("Cantidad a extraer: ");
cant=Integer.parseInt(bf.readLine());
c.extraer(cant);
break;
case 5:
System.out.println("Su saldo actual es "+
"de: "+c.getSaldo());
break;
}
}
while(!op.equals("6"));
}
}
RA-MA
PRCTICA 4.5.
**********************clase Figura************************
public abstract class Figura {
private String color;
public Figura(String c){
color=c;
}
public String getColor(){
return color;
}
public abstract float area();
}
******************clase Triangulo*********************
public class Triangulo extends Figura{
private float base,altura;
public Triangulo(float b,float a, String c){
super(c);
base=b;
altura=a;
}
public float area(){
return base*altura/2;
}
}
******************clase Rectangulo********************
public class Rectangulo extends Figura{
private float base,altura;
public Rectangulo(float b,float a, String c){
super(c);
base=b;
altura=a;
}
public float area(){
RA-MA
return base*altura;
}
}
********************clase Circulo***********************
public class Circulo extends Figura{
private float radio;
public Circulo(float r, String c){
super(c);
radio=r;
}
public float area(){
return (float)Math.PI*radio*radio;
}
}
**********************clase GestionFiguras*****************
import java.io.*;
public class GestionFiguras {
public static void main(String[] args)
throws IOException{
String op,color;
float base,altura,radio;
InputStreamReader is;
is= new InputStreamReader(System.in);
BufferedReader bf=new BufferedReader(is);
do{
System.out.println("Elegir opcin:\n");
System.out.println("1. Crear Triangulo");
System.out.println("2. Crear Rectangulo");
System.out.println("3. Crear Circulo");
System.out.println("4. Salir");
op=bf.readLine();
switch(Integer.parseInt(op)){
case 1:
System.out.println("Introduzca base: ");
RA-MA
base=Integer.parseInt(bf.readLine());
System.out.println("Introduzca altura: ");
altura=Integer.parseInt(bf.readLine());
System.out.println("Introduzca color: ");
color=bf.readLine();
//invoca al mtodo con un Tringulo
pinta(new Triangulo(base,altura,color));
break;
case 2:
System.out.println("Introduzca base: ");
base=Integer.parseInt(bf.readLine());
System.out.println("Introduzca altura: ");
altura=Integer.parseInt(bf.readLine());
System.out.println("Introduzca color: ");
color=bf.readLine();
//invoca al mtodo con un Rectngulo
pinta(new Rectangulo(base,altura,color));
break;
case 3:
System.out.println("Introduzca radio: ");
radio=Integer.parseInt(bf.readLine());
System.out.println("Introduzca color: ");
color=bf.readLine();
//invoca al mtodo con un Crculo
pinta(new Circulo(radio,color));
break;
}
}
while(!op.equals("4"));
}
//mtodo que utiliza el polimorfismo para mostrar los
//clculos de todas las figuras
public static void pinta(Figura f){
//invoca a la versin de los mtodos implementados
//en la subclase de Figura pasada como parmetro
System.out.println("Area: "+f.area());
System.out.println("Color: "+f.getColor());
}
}
CAPTULO 5
EXCEPCIONES
Ya hemos tenido algn contacto con las excepciones en alguno de los
ejemplos aparecidos en captulos anteriores. Por ejemplo, cuando vimos el mtodo
readLine() de la clase BufferedReader para la lectura de cadenas por teclado,
tuvimos que declarar la excepcin IOException en le mtodo main() para poder
compilar el programa.
Durante este captulo se estudiarn con detalle las excepciones.
Analizaremos su funcionamiento y se presentarn las principales clases de
excepciones existentes, adems de conocer los mecanismos para su captura,
propagacin y creacin.
EXCEPCIONES Y ERRORES
Una excepcin es una situacin anmala que puede producirse durante la
ejecucin de un programa, como puede ser un intento de divisin entera entre 0, un
acceso a posiciones de un array fuera de los lmites del mismo o un fallo durante la
lectura de datos de la entrada/salida.
Mediante la captura de excepciones, Java proporciona un mecanismo que
permite al programa sobreponerse a estas situaciones, pudiendo el programador
decidir las acciones a realizar para cada tipo de excepcin que pueda ocurrir.
RA-MA
T h ro w a b le
E x c e p tio n
E rro r
E x c e p c io n e s
Fig. 81.
E rro re s
Superclases de excepciones y errores
CLASES DE EXCEPCIN
Al producirse una excepcin en un programa, se crea un objeto de la
subclase de Exception a la que pertenece la excepcin. Como veremos ms
adelante, este objeto puede ser utilizado por el programa durante el tratamiento de
la excepcin para obtener informacin de la misma.
En la figura 82 se muestra la jerarqua de clases con algunas de las
excepciones ms habituales que podemos encontrar en un programa.
RA-MA
E x c e p t io n
R u n t im e E x ce p t io n
IO E x c e p t io n
S Q L E x ce p tio n
..
A rith m e tcE x c e p t io n
N u llP o in te rE x c e p t io n
In d e x O u tO fB o u n d sE x c e p t io n
C la ss C a s tE x c e p t io n
Fig. 82.
TIPOS DE EXCEPCIONES
Desde el punto de vista del tratamiento de una excepcin dentro de un
programa, hay que tener en cuenta que todas estas clases de excepcin se dividen
en dos grandes grupos:
Excepciones marcadas
Excepciones no marcadas
Excepciones marcadas
Se entiende por excepciones marcadas aquellas cuya captura es obligatoria.
Normalmente, este tipo de excepciones se producen al invocar a ciertos mtodos de
determinadas clases y son generadas (lanzadas) desde el interior de dichos mtodos
como consecuencia de algn fallo durante la ejecucin de los mismos.
Todas las clases de excepciones, salvo RuntimeException y sus subclases,
pertenecen a este tipo.
Un ejemplo de excepcin marcada es IOException. Esta excepcin es
lanzada por el mtodo readLine() de la clase BufferedReader cuando se produce
RA-MA
As, siempre que vayamos a utilizar algn mtodo que tenga declaradas
excepciones, hemos de tener presente que estamos obligados a capturar dichas
excepciones.
Excepciones no marcadas
Pertenecen a este grupo todas las excepciones de tiempo de ejecucin, es
decir, RuntimeException y todas sus subclases.
No es obligatorio capturar dentro de un programa Java una excepcin no
marcada, el motivo es que gran parte de ellas (NullPointerException,
ClassCastException, etc.) se producen como consecuencia de una mala
programacin, por lo que la solucin no debe pasar por preparar el programa para
que sea capaz de recuperarse ante una situacin como sta, sino por evitar que se
produzca. Tan slo las excepciones de tipo ArtihmeticException es recomendable
capturarlas.
Si durante la ejecucin de un programa Java se produce una excepcin y
sta no es capturada, la Mquina Virtual provoca la finalizacin inmediata del
mismo, enviando a la consola el volcado de pila con los datos de la excepcin a la
consola (figura 83). Estos volcados de pila permiten al programador detectar fallos
de programacin durante la depuracin del mismo.
RA-MA
Excepcin
Volcado de
pila
Fig. 83.
CAPTURA DE EXCEPCIONES
Como ya se apunt anteriormente, en el momento en que se produce una
excepcin en un programa, se crea un objeto de la clase de excepcin
correspondiente y se lanza a la lnea de cdigo donde la excepcin tuvo lugar.
El mecanismo de captura de excepciones de Java permite atrapar el
objeto de excepcin lanzado por la instruccin e indicar las diferentes acciones a
realizar segn la clase de excepcin producida.
A diferencia de las excepciones, los errores representan fallos de sistema
de los cuales el programa no se puede recuperar. Esto implica que no es obligatorio
tratar un error en una aplicacin Java, de hecho, aunque se pueden capturar al igual
que las excepciones con los mecanismos que vamos a ver a continuacin, lo
recomendable es no hacerlo.
RA-MA
Fig. 84.
TRY
El bloque try delimita aquella o aquellas instrucciones donde se puede
producir una excepcin. Cuando esto sucede, el control del programa se transfiere
al bloque catch definido para el tipo de excepcin que se ha producido, pasndole
como parmetro la excepcin lanzada. Opcionalmente, se puede disponer de un
bloque finally en el que definir un grupo de instrucciones de obligada ejecucin.
CATCH
Un bloque catch define las instrucciones que debern ejecutarse en caso de
que se produzca un determinado tipo de excepcin.
Sobre la utilizacin de los bloques catch, se debe tener en cuenta lo
siguiente:
RA-MA
RA-MA
catch(Exception e)
{
System.out.println("Excepcin general");
}
System.out.println("Final del main");
}
}
Compila
correctamente
No compila
try
try
{
:
catch(IOException e)
catch(Exception e)
{
:
Error de
compilacin
:
}
catch(Exception e)
catch(IOException e)
{
:
Fig. 85.
:
}
Diferencia entre situar los bloques catch especficos antes y despus de los genricos
RA-MA
Metodo 1
Propagacin de
la excepcin
Metodo 2
..
Metodo n
excepcin
Fig. 86.
FINALLY
Su uso es opcional. El bloque finally se ejecutar tanto si se produce una
excepcin como si no, garantizando as que un determinado conjunto de
instrucciones siempre sean ejecutadas.
Si se produce una excepcin en try, el bloque finally se ejecutar despus
del catch para tratamiento de la excepcin. En caso de que no hubiese ningn catch
para el tratamiento de la excepcin producida, el bloque finally se ejecutara antes
de propagar la excepcin.
Si no se produce excepcin alguna en el interior de try, el bloque finally se
ejecutar tras la ltima instruccin del try.
El siguiente cdigo de ejemplo ilustra el funcionamiento de finally:
RA-MA
Esto demuestra que, aun existiendo una instruccin para la salida del
mtodo (return), el bloque finally se ejecutar antes de que esto suceda.
RA-MA
capturarla, dejando que sean otras partes del programa las encargadas de definir las
acciones para su tratamiento.
Para propagar una excepcin sin capturarla, basta con declararla en la
cabecera del mtodo en cuyo interior puede producirse (figura 87).
public static void main(String [] args)
{
BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
try
{
imprime(b);
}
catch(IOException e)
{
System.out.println("fallo de lectura");
}
}
Declara la excepcin para que
sea propagada
Fig. 87.
RA-MA
RA-MA
//puede provocar
public void extraer(double c) throws Exception
{
if(saldo<c){
//creacin y lanzamiento de
//la excepcin
throw new Exception();
}
else{
saldo-=c;
}
}
public double getSaldo()
{
return saldo;
}
}
En este caso, a pesar de estar capturada por un catch y dado que vuelve a
ser lanzada, la excepcin IOException tambin deber declararse en la cabecera del
mtodo.
RA-MA
RA-MA
RA-MA
}
}
//clase que representa la excepcin personalizada
class SaldoInsuficienteException extends Exception{
public SaldoInsuficieteException(String mensaje){
super(mensaje);
}
}
PRCTICA 5.1.
ASERCIONES
El mecanismo de aserciones fue introducido con la versin 1.4 de J2SE.
Las aserciones se utilizan durante la fase de desarrollo y depuracin de una
aplicacin para verificar ciertas suposiciones asumidas por el programa, evitando la
utilizacin innecesaria de instrucciones println() o de captura de excepciones.
Cuando la suposicin asumida por el programa no se cumple, la asercin
generar un error que provocar la interrupcin inmediata del programa.
El aspecto ms positivo de las aserciones est en que solamente se pueden
habilitar durante la fase de desarrollo y depuracin de la aplicacin. Al
realizar el despliegue de la misma todas las aserciones sern ignoradas sin
necesidad de introducir cambios en el cdigo, dejando atrs cualquier tipo de
sobrecarga que estas instrucciones pudieran producir.
RA-MA
donde condicion es una expresin cuyo resultado debe ser de tipo boolean. La
condicin siempre se espera que sea verdadera (true), si es as, no pasa nada, el
programa contina ejecutndose normalmente, pero si la condicin es falsa, el
programa se interrumpir lanzando un AssertionError que no deber ser
capturado.
El siguiente ejemplo consiste en un mtodo privado existente en una clase,
cuya misin es realizar algn tipo de clculo con nmeros naturales enteros
positivos. Dado que se supone que el parmetro siempre ser positivo, utilizamos
una asercin para depurar dicha condicin:
private void procesa(int num)
{
assert(num>0); //Lanzar un AssertionError si
//el nmero es negativo
}
RA-MA
Habilitar aserciones
De forma predeterminada, las aserciones estn inhabilitadas. Si se quiere
hacer uso de ellas, primeramente habr que indicar al compilador que compile con
aserciones, para despus habilitarlas en el momento de la ejecucin.
RA-MA
java ea Ejemplo
o
java enableassertions Ejemplo
RA-MA
RA-MA
CUESTIONES DE AUTOEVALUACIN
1. Si definimos una clase de excepcin personalizada que herede
Exception, ser un tipo de excepcin marcada?
2. Indica el motivo por el cual la siguiente clase no compilar:
import java.io.*;
public class Ejemplo{
public void limitador(String s){
if(s.length()>10){
throw new IOException();
}
}
}
RA-MA
A. Fallo en el array
Total final 0
B. El total es 16
Total final 16
C. Error
Total final 16
D. Error
Total final 0
RA-MA