Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Core Java Libro1 V5
Core Java Libro1 V5
IBM Training
Worldwide Certified Material
Core Java
Contenido
Descripcin del Curso: Core Java....................................................................iv
Descripcin de Unidades ................................................................................viii
Volumen 1: Fundamentos de Java ....................................................................1
Unidad 1: Visin General de Java .....................................................................3
Objetivos del Aprendizaje
1. Introduccin
2. Historia de Java
4. Caractersticas de Java
5. La Plataforma Java
11
16
7. Clases y Objetos
17
21
26
27
Resumen
29
30
32
33
1. Introduccin
34
34
3. Clases Envolventes
39
44
5. Manejo de String
44
6. Identificadores
50
51
8. Operadores en Java
53
9. Conversin de Tipos
63
10. Arreglos
66
71
Resumen
86
87
i
Core Java
89
90
Ejercicios de Laboratorio
91
97
1. Introduccin
98
2. Clases y Objetos
98
101
4. Variables
103
5. Mtodos
108
6. Modificadores de Acceso
113
121
8. Sobrecarga de Mtodo
124
9. Clases Anidadas
127
130
131
136
13. Enumeraciones
136
Resumen
138
139
141
143
Ejercicios de Laboratorio
144
147
1. Introduccin
148
148
152
Resumen
177
178
180
181
ii
Ejercicios de Laboratorio
Core Java
182
183
1. Introduccin
184
2. Clases Abstractas
184
186
194
202
205
208
Resumen
210
211
213
215
Ejercicios de Laboratorio
216
Unidad 7: Paquetes.........................................................................................219
Objetivos de Aprendizaje
219
1. Introduccin
220
220
222
224
227
235
7. Agrupar Paquetes
239
8. Despliegue de Paquetes
239
245
Resumen
248
249
251
iii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Duracin
La duracin del curso es de 108 horas.
Propsito
Este curso ofrece a los estudiantes un estudio del lenguaje Java. El primer volumen del
curso se ocupa de los fundamentos de Java, del impacto de Java en la Web, la
orientacin a objetos en Java, operadores y estructuras de control. Los estudiantes
aprendern sobre las caractersticas de Java, convenciones de nombres, declaracin de
variables y su inicializacin.
El segundo volumen del curso se ocupa de la programacin orientada a objetos.
Proporciona una descripcin de los miembros de una clase Java, del uso de los
mtodos de clase y del manejo de la memoria en Java. Los estudiantes aprendern
sobre los fundamentos de la herencia, de clases, mtodos abstractos y las interfaces.
Tambin aprendern sobre los paquetes incorporados comnmente usados de Java.
El tercer volumen del curso trata de las excepciones y los mtodos para lanzar
excepciones. Los estudiantes aprendern cmo distinguir entre las excepciones
verificadas y no verificadas. Tambin aprendern sobre cmo crear y usar excepciones
definidas por el usuario.
El cuarto volumen del curso proporciona una descripcin de las capacidades para
entrada/salida. Trata de los archivos y los flujos, los flujos de caracteres, las clases
lectoras y escritoras, adems de los archivos de acceso aleatorio. Tambin se ocupa de
la serializacin de objetos, de la interfaz serializable y de la interfaz externalizable. Los
estudiantes estudiarn la clase ObjectOutputStream y la clase ObjectInputStream.
El quinto volumen del curso provee una descripcin de las interfaces de usuario usando
AWT y Swing. Se ocupa de las clases y contenedores de AWT, dibujo y actualizacin de
los componentes de la interfaz del usuario. Tambin trata los mtodos heredados por
los componentes de AWT de las clases componente y contenedor. Los estudiantes
aprendern sobre los administradores de diseo, adems de asociarlos al contenedor.
Adicionalmente, obtendrn informacin sobre el modelo de delegacin de eventos y el
manejo de eventos.
Se proporciona una introduccin a ciertas clases fundamentales de Java. Se ocupa de
la arquitectura MVC y las clases Swing, las diferencias entre AWT y Swing, los
componentes Swing, el API de Java 2D y la representacin en 2D.
El sexto volumen del curso introduce a los applets. Se ocupa del ciclo de vida de un
applet, prueba de applets, carga de un applet, mtodos de dibujo y manejo de eventos.
iv
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Los estudiantes aprendern conceptos tales como: usar el API de applet, localizar y
cargar archivos de datos, mostrar documentos en un navegador web, comunicacin con
otros applet y restricciones de seguridad en applets.
El sptimo volumen del curso contiene una introduccin a multihilos y redes. Estudia el
ciclo de vida de los hilos, creacin y funcionamiento, realizar subclases de la clase de
hilo e implementar la interfaz Runnable. Tambin se ocupa de la sincronizacin de hilos,
de los mtodos y sentencias sincronizadas, adems de la comunicacin entre hilos. Los
estudiantes aprendern sobre el trabajo con URLs y programacin de conectores,
clases orientadas a conexin en Java, envo y recepcin de datagramas.
El octavo volumen de este curso presenta una descripcin del API de colecciones. Se
ocupa del marco de trabajo para colecciones de Java, de las interfaces e
implementaciones de las colecciones. Presenta la conectividad a la base de datos en
Java y las sentencias SQL usadas en los programas Java, adems de los pasos que
implica el acceso a base de datos. Los estudiantes aprendern sobre procedimientos
almacenados, manejo de la transaccin, soporte de cursores, procesamiento de
mltiples conjuntos de resultados, entre otras funcionalidades de JDBC. Para finalizar
se discute acerca de las caractersticas avanzadas, tales como: las consideraciones de
seguridad cuando se trabaja con programas Java, los Java beans y los conceptos de la
internacionalizacin.
El curso incorpora varias sesiones de laboratorios donde los estudiantes obtendrn
experiencia prctica en los conceptos de Core Java.
Audiencia
Estudiantes, Profesionales y Gente de Negocios.
Prerrequisitos
CY410, CY350
v
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Objetivos
Al completar este curso, usted ser capaz de:
Entender las caractersticas principales de Java.
Examinar las diferentes formas en las que las excepciones pueden ser lanzadas,
capturadas y manejadas.
Explicar cmo crear hilos desde la clase Thread y desde la interfaz Runnable.
Describir los algoritmos polimrficos del JDK que operan en las colecciones.
Core Java
Agenda
Cada unidad en este curso es de 2 horas de duracin.
vii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Descripcin de Unidades
Volumen 1: Fundamentos de Java
Unidad 1: Visin General de Java
Esta unidad introductoria proporciona una visin general de Java, incluyendo la historia
del desarrollo de Java, fundamentos bsicos de la Programacin Orientada a Objetos y
aspectos bsicos de Java. Tambin cubre la plataforma de Java y su efecto en la
WWW.
Unidad 3: Herencia
El principal objetivo de esta unidad es entender los aspectos bsicos de la herencia,
cmo utilizar el modificador sper, cmo crear la herencia multi-nivel y los fundamentos
del mtodo de sobreescritura. Tambin se discute el uso de la palabra clave final para
evitar la sobreescritura y para evitar la herencia.
viii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Unidad 7: Paquetes
Los paquetes son un aspecto importante en el estudio de Java. En esta unidad se
define qu es un paquete, el CLASSPATH y su utilizacin, adems de la proteccin de
acceso mientras se usan los paquetes. Tambin explica cmo utilizar los paquetes
miembro, cmo importar paquetes y se explican algunos de los paquetes intrnsecos de
Java ms utilizados.
Core Java
x
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Volumen 6: Applets
Unidad 1: Escribir y Desplegar Applets
En el lenguaje Java, los applets son uno de los tpicos ms interesantes y significativos.
Esta unidad establece qu es un applet y lo que puede hacer. Provee un resumen de
los applets, su ciclo de vida y cada una de sus fases significativas. Se discuten los
mtodos para responder a eventos (milestones), el uso de los mtodos para dibujar y
manejar eventos, los mtodos para aadir componentes UI y la aplicacin y ventajas del
API en un applet.
Core Java
Core Java
Unidad 3: JDBC
Esta unidad trata la conectividad de base de datos en Java y el API JDBC de Java.
Discute las sentencias SQL usadas en los programas de Java y cmo funciona el
manejo de excepciones.
xiii
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Core Java
Core Java
1. Introduccin
Antes que Java existiera, C y C++ eran los lenguajes de programacin ms usados. C
es un lenguaje de programacin estructurada, mientras que C++ brinda soporte tanto a
la programacin estructurada como a la programacin orientada a objetos. Estos dos
lenguajes de programacin son complejos y tienen algunas limitaciones inherentes.
Aunque Java no fue diseado como solucin a los problemas encontrados en C o C++,
algunas de sus caractersticas han solventado las limitaciones de estos dos lenguajes.
Uno de los objetivos principales detrs de la creacin de Java fue tener un lenguaje
orientado a objetos que fuera poderoso, pero simple. Java ha simplificado muchas de
las estructuras complicadas y ambiguas de C++. Otra ventaja fundamental es que Java
trajo el concepto de la independencia de plataforma. Se aprender acerca de estas
caractersticas en detalle en las prximas secciones.
Sin embargo, antes de continuar, se presenta un breve resumen de la evolucin de
Java.
2. Historia de Java
Patrick Naughton, Mike Sheridan y James Gosling de SUN Microsystems iniciaron un
proyecto secreto llamado "Proyecto Verde" (Green Project) a finales de 1990. El objetivo
de este proyecto era anticiparse a la revolucin en el mundo de la computacin que
estaba por llegar. El equipo decidi intentar introducirse en el mercado de la electrnica
de consumo y desarrollar programas para pequeos dispositivos electrnicos.
Desarrollaron un dispositivo llamado StarSeven (*7), este dispositivo era capaz de
controlar una variedad de plataformas de entretenimiento y dispositivos de uso
domstico, adems de mostrar animaciones simultneamente. *7 usaba un procesador
independiente del lenguaje llamado Oak para adaptarse a una variedad de plataformas
y dispositivos de uso domstico. Tras unos comienzos dudosos, Sun decidi crear una
filial, denominada FirstPerson Inc., para dar margen de maniobra al equipo responsable
del proyecto. Este grupo intent mercadear l *7 a la industria de televisin por cable,
pero la tecnologa usada para desarrollar l *7 estaba adelantada a la tecnologa
existente en la industria de televisin por cable y por esto no fue aceptado.
Afortunadamente para el grupo creador del *7, Internet se estaba volviendo popular en
ese momento. La Internet tena una configuracin de red similar al *7, y estaba siendo
usada cada vez ms para la transferencia de texto, grficos y video, esencialmente
datos estticos. El equipo FirstPerson ampli Oak, transformndolo en un lenguaje que
permita al programador escribir programas que corran en una gran variedad de
dispositivos, a un lenguaje que permita escribir cdigo ejecutable que poda ser
distribuido en Internet.
En el ao 1995, este nuevo lenguaje evolucionado fue llamado Java. Java permita a los
usuarios de Internet transferir contenido esttico a travs de la misma. Adicionalmente,
permita transferir pequeas aplicaciones dinmicas a travs de la red en la forma de
applets de Java. Algunos de los miembros del grupo FirstPerson mostraron el lenguaje
Unidad 1: Visin General de Java
Core Java
C++
Es slo un lenguaje de programacin.
Da soporte tanto a la programacin estructurada
como a la programacin orientada a objetos.
Las declaraciones de variables y funciones
pueden estar presentes fuera de las definiciones
de las clases. No es necesario para un programa
en C++ tener una clase.
El cdigo C++, una vez escrito para una
plataforma, necesita ser compilado de nuevo, y
el cdigo objeto reenlazado para ser ejecutado
en otra plataforma diferente.
Los programadores tienen que hacerse cargo de
liberar la memoria no utilizada.
Da soporte a caractersticas como sobrecarga de
operadores y conversiones automticas en
ambos sentidos.
Una clase puede heredar directamente de ms
de una clase.
Sus rutinas de libreras no son extensibles.
Core Java
La programacin de redes es ms
fcil. Los objetos pueden ser
accedidos a travs de la red usando
URLs.
Los programadores no pueden usar
apuntadores. Los apuntadores se
usan internamente.
Implementa arreglos verdaderos.
4. Caractersticas de Java
Java puede usarse para desarrollar dos tipos de programas:
Aplicaciones: Las aplicaciones son programas independientes que pueden correr en
una computadora, usando la plataforma Java con el soporte del sistema operativo de la
computadora.
Applets: Los applets son programas especiales Java, que pueden usarse para
transmitir informacin en Internet.
Los applets pueden ser incrustados en una pgina HTML usando la etiqueta Applet, y
pueden ejecutarse en un navegador web con soporte para Java. Los applets pueden
adaptarse a la entrada del usuario inteligentemente. Las aplicaciones Java y los applets
pueden ser compilados y ejecutados usando el Kit de Desarrollo de Java (Java
Development Kit JDK).
La Figura 1.1 muestra las diferentes caractersticas de Java.
Core Java
4.2 Seguridad
Inicialmente, cuando la Internet comenz y Java no era tan conocido, los usuarios de
Internet teman descargar programas ejecutables debido al dao alarmante causado por
la difusin de virus. Las personas que descargaban archivos eran muy cautelosas de
revisar estos archivos cuidadosamente antes de usarlos. Haba tambin programas
maliciosos que recababan informacin acerca de tarjetas de crdito, palabras clave, etc.
del sistema de archivos local. Esto fue, por supuesto, desastroso para las personas que
navegan por la Internet. Java proporcion un modelo de seguridad, que previene el
acceso a los recursos del sistema, y as bloquear cualquier intento malicioso.
4.3 Portabilidad
Existen muchas ocasiones en donde los usuarios de Internet pueden querer descargar
programas y ejecutarlos dinmicamente. Los usuarios pueden estar usando diferentes
Libro 1: Core Java
Core Java
Core Java
4.4 Distribuido
La computacin distribuida es muy til en el ambiente de la Internet, donde los mdulos
de los programas pueden estar presentes en diferentes computadoras alrededor del
mundo. Java fue diseado para brindar soporte TCP/IP. El soporte a redes de Java
permite construir aplicaciones cliente/servidor, adicionalmente Java tiene el paquete de
Invocacin de Mtodos Remota (Remote Method Invocation RMI). Este permite a
programas que se ejecutan en una JVM invocar un mtodo en una clase Java
ejecutndose en otra JVM.
4.6 Robusto
A medida que los usuarios de Java en Internet comenzaron a incrementarse en nmero,
creci tambin la necesidad de ejecutar una aplicacin en diversas plataformas. Estas
plataformas diversas tenan demandas diferentes por parte de las aplicaciones para que
se ejecutaran apropiadamente y por tanto, la aplicacin tena que ocuparse de todas
estas demandas. Para poder hacer esto, la aplicacin deba de ser robusta
Core Java
El diseo de Java hace posible que los programadores identifiquen errores en la misma
etapa de desarrollo. El cdigo puede ser revisado para asegurar confiabilidad colocando
restricciones en ciertas reas claves de la programacin y teniendo un diseo para
evitar los errores ms comunes de programacin. Java est diseado para ser un
lenguaje estrictamente tipado, Por lo tanto, verifica errores de codificacin tanto en
tiempo de compilacin como en tiempo de ejecucin.
Java provee manejo de excepciones para ocuparse de los errores de una manera
sofisticada. La robustez del manejo de excepciones de Java ayuda a construir
programas confiables. Funciones como la recoleccin automtica de basura en Java
hace que los programas sean menos propensos a errores relacionados con la memoria.
Esto a su vez da seguridad a los programadores para predecir el comportamiento del
programa en diversas situaciones.
4.7 Dinmico
Java enlaza el cdigo dinmicamente. Java fue implementado para usar los datos
disponibles en los archivos class en tiempo de ejecucin. Los objetos que se crean y
usan en un programa son verificados y resueltos en tiempo de ejecucin. Esta
caracterstica es til cuando se quiere actualizar el bytecode en un sistema en
ejecucin.
4.9 Interpretado
Los bytecodes de Java son interpretados por la JVM en el lenguaje nativo de la
plataforma subyacente. Los lenguajes interpretados tienen limitaciones de rendimiento
comparados con los lenguajes que son compilados. Java combina las ventajas de la
compilacin e interpretacin. El compilador Java JIT puede ayudar a superar las
limitaciones de rendimiento asociadas a la JVM.
Core Java
5. La Plataforma Java
Una plataforma es el entorno sobre el cual se ejecutan los programas. Una plataforma
puede ser una plataforma de software, una plataforma de hardware o una combinacin
de ambos. La plataforma Java es una plataforma de slo software, la cual se puede
ejecutar en varias plataformas de hardware as como en varios sistemas de operativos.
La plataforma Java esta conformada por dos componentes, llamados la JVM y el API de
Java, como se muestra en la Figura 1.4.
5.1 JVM
La JVM es una aplicacin ejecutable que representa a un procesador genrico en el
cual corren los bytecodes de Java. Una implementacin particular de esta mquina
virtual, que es escrita para operar en un entorno particular, an brindar soporte al API
general de Java. Esto es lo que hace a Java independiente de la plataforma.
Core Java
Especificacin abstracta.
Implementacin concreta.
Core Java
El comando javac se usa para iniciar el compilador Java, que compila el cdigo
fuente Java (archivo .java) a bytecodes, suponiendo que no hay errores en
tiempo de compilacin. Si existe un error, el programador debe regresar al
editor, corregir los problemas, y ejecutar nuevamente javac hasta que todos los
errores sean solucionados y se obtenga una compilacin limpia.
Una vez compilado, se produce un archivo .class que podr ser usado con
cualquier JVM ejecutndose en cualquier plataforma.
El comando java se usa para iniciar el intrprete Java, y para ejecutar el archivo
.class.
Core Java
Core Java
En Java, las clases son agrupadas dentro de paquetes, es decir, cada paquete tiene un
conjunto de clases. El trmino espacio de nombres se refiere a la entidad que mantiene
los nombres de las clases. Java usa paquetes para este propsito. Dentro de un
espacio de nombres en particular, slo puede existir una clase con un nombre dado. Sin
embargo, puede existir cualquier nmero de cargadores de clases dentro de una JVM.
Cada cargador de clases puede estar asociado a un espacio de nombre diferente. La
misma clase puede ser cargada a travs de diferentes cargadores de clases que estn
asociados a diferentes espacios de nombres. No puede haber ninguna interaccin entre
cargadores de clases que estn presentes en diferentes espacios de nombres, a menos
que el cargador de clase expresamente permita esa interaccin.
Se pueden diferenciar las clases descargadas de la red desde diferentes mquinas en
diferentes espacios de nombres. A estas clases se les restringir el acceso a otra clase
que est en un nombre de espacios diferente. As, se puede usar esta arquitectura de
cargador de clase para evitar cualquier dao causado por cdigo malicioso.
Core Java
Core Java
Nota: Todas las tecnologas listadas en la Figura 1.7, excepto la tecnologa applet,
estn basadas en la ejecucin sobre la JVM de una mquina en vez de la JVM de un
navegador. Por lo tanto, slo los applets tienen restricciones en acceder los recursos del
sistema fuera de la JVM.
A continuacin se estudian las diferentes clases y objetos en Java.
7. Clases y Objetos
Una clase es un prototipo que se usa para definir las caractersticas y los
comportamientos que son comunes a todos los objetos de un mismo tipo. Las variables
se usan para representar las caractersticas de los objetos y los mtodos se usan para
representar el comportamiento de los objetos. Se puede declarar una variable
especificando su tipo de datos y el nombre de la variable.
Similarmente, se puede declarar objetos especificando lo siguiente:
Nombre de Objeto.
int a;
Computador comp;
Core Java
La Figura 1.8 muestra una clase llamada Cliente y objetos con los nombres ObjetoA,
ObjetoB y ObjetoC de este tipo. La clase Cliente es una representacin orientada a
objetos del cliente del mundo real, mantiene los datos del cliente. Tpicamente, la clase
tendr variables miembro para mantener informacin, como el ID del cliente, el nombre
del cliente, etc.
Se define una clase en Java usando la palabra reservada class. La sintaxis es la
siguiente:
class NombreClase {
// variables miembro
// funciones miembro
}
Core Java
Considere la clase Computador, que tiene los atributos cpu, monitor, teclado y
mouse. Se pueden crear dos instancias de la clase Computador que tengan diferentes
valores para estos atributos. Estas dos instancias estn representadas por comp1 y
comp2.
Los objetos en Java se crean usando la palabra clave new.
La sintaxis es la siguiente:
NombreClase objecto = new NombreClase();
Los constructores en Java tienen la misma funcionalidad que en C++. Los constructores
en Java pueden aceptar nombres de variables y tipos de variables como argumentos.
A su vez, como en C y C++, donde la funcin main() es el punto de inicio del
programa, se tiene que main() es el punto de inicio del programa Java tambin.
La funcin main() tiene la siguiente declaracin de funcin:
public static void main(String args[]){
// El cdigo principal va aqu
}
As como en C y C++, los programas Java pueden aceptar parmetros por la lnea de
comandos, el main()de Java puede tomar estos argumentos. En C o C++, se pueden
tener parmetros de la lnea de comandos usando int argc y char* argv[]. En
Java, se toman como un arreglo de objetos String. Adems, mientras en C o C++ es
opcional para la funcin main() tomar argumentos desde la lnea de comandos, es
obligatorio que los argumentos de la lnea de comandos estn declarados en la funcin
main() de Java.
Nota: La funcin main() en Java no puede ser global, como en C o C++. En Java,
debe estar presente dentro de una clase Java.
La palabra clave public es un tipo de especificador de acceso en Java. Se vern otros
tipos de especificadores de acceso en el Volumen 2, Unidad 1 - Clases, Objetos y
Referencias.
Las variables miembro son conocidos como miembros, y las funciones miembros como
los mtodos de una clase. No se puede tener la declaracin de la clase separada, y la
definicin de la funcin miembro apareciendo libremente, como en C++. Ambos deben
aparecer dentro del bloque de definicin de la clase.
Observe el Ejemplo 1.1, que tiene el cdigo Java para la clase Computador. En este
momento, la sintaxis del cdigo no es importante, dado que el punto ahora es entender
la relacin entre clases y objetos.
Core Java
Ejemplo 1. 1
El siguiente programa representa una computadora.
El cdigo Java comienza aqu...
1.
2.
3.
4.
class Computador {
boolean cpu, teclado, mouse;
String monitor;
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
comp1.monitor = "Negro";
comp1.teclado = true;
comp1.mouse = true;
19.
20.
21.
comp2.cpu = true;
comp2.monitor = "Blanco y negro";
22.
23.
24.
comp1.cpu = true;
comp2.teclado = true;
comp2.mouse = false;
}/* El metodo main termina aqui */
Core Java
tambin se muestra que estos dos objetos pueden contener diferentes valores para sus
atributos.
Considere la Figura 1.9 para entender mejor el cdigo anterior.
Core Java
Encapsulacin.
Herencia.
Polimorfismo.
8.1 Encapsulacin
La capacidad de presentacin de informacin dentro de un objeto se divide en dos
partes bien diferenciadas:
Externa La que necesitan el resto de los objetos para interactuar con el objeto
que definimos. Estas propiedades se denominan pblicas y corresponde a la
informacin que necesitan conocer los restantes objetos de la aplicacin
respecto del objeto definido para poder operar.
Se puede imaginar la encapsulacin como introducir el objeto dentro de una caja negra
donde existen dos ranuras denominadas entrada y salida. Si se introducen datos por la
entrada automticamente obtendr un resultado en la salida. No necesita conocer
ningn detalle del funcionamiento interno de la caja.
El trmino encapsulacin indica la capacidad que tienen los objetos de construir una
cpsula a su alrededor, ocultando la informacin que contienen (aquella que es
necesaria para su funcionamiento interno, pero innecesaria para los dems objetos) a
las otras clases que componen la aplicacin.
Esto se ilustra en la Figura 1.10.
Core Java
Core Java
8.2 Herencia
Considere el ejemplo de un profesor de fsica y uno de matemticas. Ambos pertenecen
a una categora general llamada profesores. Ellos tienen ciertos atributos y
comportamiento que son comunes a todos los profesores. Adicionalmente, ellos tienen
ciertos atributos especiales que son comunes a todos los profesores de fsica y
matemticas. Cuando se modela este ejemplo usando objetos de software, se puede
tener una clase llamada Profesor que defina todos los atributos y comportamiento
comunes a todos los profesores. Subsecuentemente, se pueden definir dos clases
ProfesorFisica y ProfesorMatematica, que hereden los atributos y
comportamiento comunes a todos los profesores, desde la clase Profesor. En este
caso, la clase Profesor ser la sper clase de las clases ProfesorFisica y
ProfesorMatematica y estas sern subclases de la clase Profesor.
Algunos lenguajes como C++, permiten la herencia mltiple en la cual una clase puede
heredar de varias clases. En Java, una clase slo puede tener una sper clase. Esto
significa que una clase en Java no puede directamente derivar de varias clases. Sin
embargo, Java soporta herencia mltiple indirectamente usando interfaces. Las
interfaces sern tratadas en detalle en el Volumen 1, Unidad 5 Clases Abstractas e
Interfaces.
La Figura 1.12 muestra un ejemplo de herencia. De esta figura, se puede deducir que
Bicicleta, MonoPatin y Moto tienen propiedades que son comunes a todos los
Unidad 1: Visin General de Java
Core Java
vehculos de dos ruedas, mientras que Carro, Autobus y Camion tienen propiedades
que son comunes a todos los vehculos de cuatro ruedas. Adems, los vehculos de dos
y cuatro ruedas, a su vez, tienen propiedades que son comunes a los vehculos.
8.3 Polimorfismo
Se pueden tener muchas situaciones cuando se quieren hacer varias operaciones
similares unas con otras dependiendo de la entrada que se obtenga. Esto se denomina
polimorfismo, formado de dos races griegas, poly y morphus. La palabra poly
significa muchos y 'morphus' significa formas.
En programacin orientada a objetos, polimorfismo significa una sola interfaz y mltiples
implementaciones. En otras palabras, los nombres de mtodos son los mismos, pero
tienen diferentes implementaciones basadas en los parmetros que le son pasados, o
en los objetos sobre los cuales son invocados.
Suponga que se desea implementar a la clase Mamiferos, suponga tambin que uno
de los mtodos que se desea implementar para esta clase, es el que permita a tales
mamferos desplazarse de forma natural, a este mtodo se le llamar desplazar().
Se encontrar entonces conque para algunos mamferos el desplazamiento se realizar
por medio de caminar, como es en el caso de las personas, para otros el
desplazamiento natural ser nadar, como en el caso de los delfines e inclusive para
otros, el desplazamiento se lograr por medio de volar, como sucede con los
murcilagos. Se usa el mismo nombre del mtodo para invocar sus diferentes
implementaciones.
Ahora, se va a comenzar la programacin en Java escribiendo la aplicacin
HolaMundo, que escribe la cadena Hola Mundo en la salida estndar.
Los Ejemplos 1.2 y 1.3 tienen algunos elementos sintcticos, que no se han visto en
detalle hasta ahora. Estos elementos sern cubiertos en las prximas unidades. Estos
ejemplos simplemente ayudarn a exponer al usuario a la sintaxis Java.
Libro 1: Core Java
Core Java
Core Java
9.
10.
11.
Core Java
Core Java
Resumen
Ahora, que ha completado esta unidad, usted debe ser capaz de:
Core Java
Core Java
Core Java
Core Java
Core Java
1. Introduccin
En esta unidad, se discute la sintaxis bsica de Java, se encontrarn muchas
similitudes entre la sintaxis de Java y C++.
Antes de aprender acerca de la sintaxis de programacin de Java, se discuten los tipos
de datos que provee el lenguaje Java.
Tipos Primitivos: Tipos de datos que mantienen valores primitivos como 10, a,
12.2 etc.
Adems de los tipos de datos en Java, tambin existen los genricos que nos permiten
especificar el tipo de elemento de un Coleccin en tiempo de compilacin. En lugar de
especificar una lista, especificamos su contenido, por ejemplo: Double (doble).
La Figura 2.1 muestra los tipos de datos que Java soporta.
Core Java
En la Figura 2.1, bajo los tipos primitivos, se tienen ocho tipos de datos. Los nombres
mostrados en la figura son las palabras claves usadas en Java para denotar estos tipos
de datos. Los tres tipos referencia, es decir, arreglos, clases e interfaz, se les coloca
identificadores definidos por el usuario al escribir cdigo Java. Por ejemplo,
nombre[20] denota a nombre definido por el usuario como tipo arreglo.
A continuacin se ver en detalle los tipos de datos primitivos usados en Java.
boolean
1 byte
byte
1 byte
char
2 bytes
short
2 bytes
int
4 bytes
Long
8 bytes
Float
4 bytes
Double
8 bytes
Tabla 2.1: Tamao Ocupado por los Tipos de Datos Primitivos en la Memoria
A continuacin se discute cada uno de los ocho tipos de datos en Java, comenzando
con los tipos de datos enteros.
2.1.1 Tipos de Datos Enteros
Los tipos de datos enteros se usan para almacenar valores enteros. La Figura 2.1
muestra cinco tipos diferentes de tipos de datos enteros, estos son: byte, short,
int, long, y char. El rango de valores que estos tipos de datos primitivos pueden
almacenar se muestra a continuacin:
byte
-27 hasta 27 1
short
Core Java
int
long
Las diferentes variables de los tipos de datos enteros se declaran como se muestra en
el siguiente cdigo:
byte b = 1;
short s = 1;
int i = 1;
long l = 1;
En las declaraciones anteriores, a todas las variables se les ha asignado el valor del
literal entero 1. Los literales son valores constantes que son asignados a las variables.
El tipo de dato char se usa para almacenar caracteres. Estos caracteres deben ser
caracteres Unicode. Unicode provee nmeros nicos a los caracteres, que permanecen
igual en cualquier plataforma o lenguaje.
Debido a que se usan nmeros para almacenar caracteres en la mquina, el tipo de
datos char esta dentro de la categora de tipos de datos enteros.
El rango del tipo de datos char se muestra a continuacin:
0 hasta 215
char
Java reserva 2 bytes para almacenar el valor de un char. El siguiente cdigo muestra la
declaracin de una variable char.
char ch = a;
Los literales de carcter se definen usando la comilla simple, mientras que las cadenas
de caracteres se definen usando comillas dobles. Java tambin usa secuencias de
escape, en los caracteres. Una secuencia de escape es un conjunto especial de
caracteres que tienen algn significado especial. Todas las secuencias de escape en
Java comienzan con el caracter \. A continuacin se muestran algunas secuencias de
escape en Java:
\r retorno de carro
\n nueva lnea
\t tabulador
\b borrado a la izquierda
\f comienzo de pgina
\\ - caracter \
\ comilla simple
Core Java
Core Java
Entero
Valor Aceptable
2 (se asume int)
2L
0777 (octal)
0xa5fd (hexadecimal)
a, \n, \udddd
Punto Flotante
Boolean
true, false
Tabla 2.2: Algunos Ejemplos de Valores para los Tipos de Datos en Java
Core Java
2.3 Genricos
Java 5.0 introduce nuevas funcionalidades al lenguaje de programacin Java. Una de
esas funcionalidades son los genricos. Puede que usted encuentre construcciones
similares en otros lenguajes pero ver que hay diferencias importantes entre ellas. Los
genricos le permiten hacer abstracciones de tipos de datos. Estos sern tratados en
detalle en el Volumen 8 - Conceptos Avanzados, Unidad 1 API de Colecciones.
Seguidamente, se va a aprender acerca de clases envolventes (wrapper classes), que
esencialmente envuelven los tipos de datos primitivos en clases.
3. Clases Envolventes
Se han discutido varios tipos de datos primitivos de Java. Java tambin provee clases
envolventes para cada uno de estos tipos de datos primitivos. Una clase envolvente da
la funcionalidad de una clase para un tipo de datos primitivo. Estas clases envolventes
tienen mtodos que permiten manipular el tipo de dato primitivo correspondiente que
ellos envuelven.
Los tipos de datos primitivos tienen conjuntos de operaciones que se pueden usar con
ellos. Sin embargo, cuando se quiere proveer algunas funciones utilitarias para un tipo
de dato en particular, se usan las clases envolventes y se proveen funciones primitivas
dentro de las clases envolventes.
Hay ciertas clases, que vienen como parte de la librera de Java, que requieren de un
objeto en vez de una variable de tipo de dato primitivo. Los objetos de las clases
envolventes se pueden usar tambin para este propsito.
Java provee clases envolventes para los ocho tipos de datos primitivos. Se discute a
continuacin las ocho clases envolventes en Java, comenzando por la clase envolvente
Boolean.
Core Java
byteValue()
shortValue()
intValue()
floatValue()
doubleValue()
equals()
toString()
hashCode()
de
la clase
Adems de estos mtodos, la clase Byte tiene el mtodo static valueOf() para
convertir una representacin de objeto String en un valor byte.
byteValue()
shortValue()
intValue()
floatValue()
doubleValue()
Core Java
La clase Short tiene el mtodo static valueOf() para convertir una representacin
del objeto String en un valor Short.
Core Java
Core Java
7.
8.
9.
10.
11.
12.
13.
14.
Float f = Float.valueOf(s);
float primitivoFloat = f.floatValue();
15.
16.
17.
18.
19.
20.
+ primitivoFloat);
System.out.println("Valor del primitivo int es: "
+ primitivoInt);
21.
22.
Core Java
5. Manejo de String
El manejo de cadenas de caracteres (string) en Java se hace usando las clases
String o StringBuffer, ambas clases se usan para almacenar y manipular cadenas
de caracteres. Sin embargo, hay una diferencia principal entre estas dos clases en la
forma en la que son manejados por el sistema de tiempo de ejecucin de Java. Se va a
profundizar en estas dos clases para entender la diferencia.
Core Java
Crear otra cadena de caracteres que tenga todos los caracteres de la primera
cadena de caracteres en maysculas o minsculas.
Dos cadenas de caracteres pueden ser concatenadas usando el operador "+" como se
muestra en la Figura 2.3. Como String es inmutable, esta concatenacin es
actualmente implementada usando internamente la clase StringBuffer por Java. En
la prxima seccin, se discute la clase StringBuffer.
String uno = "abcde";
String dos = "fghij";
String tres;
tres = uno + dos;
System.out.println(tres);
Figura 2.3: Uso de la Clase String
Core Java
Core Java
La clase Matcher:
La clase Matcher implementa MatchResult.
Esta clase es un motor que realiza operaciones de correspondencia sobre una
secuencia de caracteres interpretando un patrn.
Una instancia de la clase Matcher es creada a partir de un patrn mediante la
invocacin del mtodo matcher de la clase Pattern. Una vez creada, una clase
Matcher puede ser usada para realizar tres tipos diferentes de operaciones de
correspondencia:
Cada uno de estos mtodos retorna un boolean indicando xito o fracaso. Se puede
obtener ms informacin acerca de una correspondencia exitosa haciendo una consulta
del estado del matcher.
Libro 1: Core Java
Core Java
Core Java
se usa el mtodo append() sobre los objetos creados. Esto es una alternativa mejor
que usar el operador + sobre dos objetos String.
Los objetos StringBuffer se pueden usar en aplicaciones multihilos, ya que los
mtodos que operan en estos objetos pueden ser sincronizados para evitar la
ocurrencia del interbloqueo. Se aprender acerca de los interbloqueos en detalle en el
Volumen 7, Unidad 3 Sincronizacin de Hilos.
Se han discutido varios tipos de datos soportados por Java, los cuales representan
varios tipos de valores que se pueden usar en programas Java. Estos valores son
almacenados usualmente en la memoria de la pila, y se pueden cambiar cualquier
nmero de veces dentro de un mismo programa Java. Los nombres de las variables o
identificadores se usan para localizar estos valores. A continuacin se discuten los
nombres de variables o identificadores.
Core Java
6. Identificadores
Cuando se escribe un programa se necesita almacenar los valores usados en el
programa. Estos valores se almacenan en la memoria, se necesita tener un mtodo
simple para acceder a estas posiciones en la memoria. Por esto se usa un identificador
o variable para referirnos a estas posiciones en memoria.
Los nombres de variables deben comenzar con una letra, subrayado (_) o dlar
($). Sin embargo, no hay restriccin en el nmero de letras que se pueden usar.
Para una mejor legibilidad, los nombres de variables deben componerse de dos
o ms palabras significativas. La primera letra de la variable ser siempre en
minsculas y las primeras letras de las palabras subsecuentes en maysculas
(Ejemplo: numeroCuenta).
Core Java
En el caso de nombres de clase, todas las palabras que son parte del nombre de
la clase deben comenzar con una letra mayscula (Ejemplo: StringBuffer).
Core Java
El bloque externo contiene al bloque del medio, que a su vez contiene al bloque interno.
Suponga que una variable llamada edad se declara dentro del bloque del medio,
entonces puede ser usada dentro del bloque del medio y del interno, pero no dentro del
bloque externo. El rango de bloques dentro de la cual una variable se puede usar se
conoce como alcance de una variable.
El Ejemplo 2.2 ilustra el alcance de una variable en un programa Java
Ejemplo 2.2
El cdigo Java comienza aqu...
1. public class BloquePrueba {
2.
3.
4.
5.
6.
7.
8.
9.
System.out.println(a);
System.out.println(b);
System.out.println(c);
10.
}/* Fin del 2do bloque */
11. }/* Fin del 1er bloque */
Core Java
interno). Sin embargo, lo contrario no es cierto, las variables declaradas dentro del
segundo bloque no son visibles dentro del primer bloque. El alcance de una variable
est limitado al bloque en la cual es declarada. La palabra clave static se usa para
especificar que estas variables son variables de clase.
Fin del Ejemplo 2.2
Se discute a continuacin acerca de varios operadores usados en Java.
8. Operadores en Java
Cuando se escribe un programa, se usan numerosas expresiones para calcular algunos
valores especficos. Estas expresiones hacen uso de varios operadores y son similares
a expresiones aritmticas que usan muchos operadores. Las variables usadas en estas
expresiones se llaman operandos. Existen algunos operadores que solo necesitan un
operando, son llamados operadores unarios (ejemplo: ++). Los operadores que
requieren dos operandos se llaman operadores binarios (por ejemplo, +), y los
operadores que requieren tres operandos se llaman operadores ternarios (ejemplo:,? :).
Java soporta los siguientes tipos de operadores:
Operadores Aritmticos.
Operadores Relacionales.
Operadores Condicionales.
Operadores Ternarios.
Operadores de Bits.
Operadores de Asignacin.
Core Java
Core Java
<: El operador menor que < se usa para determinar si el valor almacenado en
una variable es menor que el valor almacenado en otra variable. Cuando esta
condicin se satisface, el resultado de esta operacin es true, caso contrario el
resultado es false. La siguiente expresin ilustra el uso de este operador:
a < b
>: El operador mayor que > se usa para determinar si el valor almacenado en
una variable es mayor que el valor almacenado en otra variable. Cuando esta
condicin se satisface, el resultado de esta operacin es true, caso contrario el
resultado es false. La siguiente expresin ilustra el uso de este operador:
a > b
<=: El operador menor o igual que <= se usa para determinar si el valor
almacenado en una variable es menor o igual que el valor almacenado en otra
variable. Cuando esta condicin se satisface, el resultado de esta operacin es
true, caso contrario el resultado es false. La siguiente expresin ilustra el uso
de este operador:
a <= b
>=: El operador mayor o igual que >= se usa para determinar si el valor
almacenado en una variable es mayor o igual que el valor almacenado en otra
variable. Cuando esta condicin se satisface, el resultado de esta operacin es
true, caso contrario el resultado es false. La siguiente expresin ilustra el uso
de este operador:
a >= b
Tmese como ejemplo, dos nmeros, 35 y 65, y determine que sucede cuando se usan
los diferentes operadores relacionales en ellos.
35 < 65
resulta en true
35 > 65
resulta en false
Core Java
35 == 65 resulta en false
35 != 65 resulta en true
A veces durante la ejecucin, puede ser necesario encontrar la clase a la que un objeto
pertenece. El operador instanceof devuelve true o false basado en si el operando
izquierdo es una instancia del operando derecho.
Considere este ejemplo, asumiendo que mc es un objeto definido y MiClase es una
clase Java, el operador instanceof se usa como sigue para saber si mc es una
instancia de la clase MiClase.
mc instanceof MiClase
La sentencia anterior retorna true si es una instancia, false en caso contrario.
&&: El operador && (AND) se usa para determinar si las condiciones a ambos
lados del operador resultan en true o false. Primero se evala el resultado de la
condicin a la izquierda del operando, si resulta en true, entonces el resultado de
la condicin a la derecha del operador es evaluado. Si ambas condiciones
resultan en true, entonces esta operacin tambin resulta en true. Si la condicin
a la izquierda del operador resulta en false, la condicin a la derecha del
operador no es evaluada, y la operacin completa resulta en false. La siguiente
expresin ilustra el uso de este operador:
(a < b) && (b < c)
||: El operador || (OR) se usa para determinar si al menos uno de las dos
condiciones en alguno de los lados de este operador es true. Si la condicin a la
izquierda de este operador resulta en false, entonces la condicin a la derecha
es evaluada, si esta ltima condicin resulta en true, entonces el resultado de la
operacin es true. Si la condicin a la izquierda de este operador es true,
entonces la condicin a la derecha no es evaluada, y el resultado de la
operacin es true. La siguiente expresin ilustra el uso de este operador:
(a < b) || (b < c)
Core Java
&: El operador & (AND) se usa para comparar los patrones de bits de los
operandos a la izquierda y a la derecha bit-por-bit. La operacin resulta en un
conjunto de bits donde las posiciones de los bits que tienen 1 indica que las
posiciones correspondientes en los operandos izquierdo y derecho tambin
tienen el valor de 1.
Core Java
Patrn de Bits 1
Patrn de Bits 2
Resultado
Patrn de Bits 2
Resultado
Core Java
^: El operador ^ (XOR) se usa para evaluar los conjuntos de bits a ambos lados
del operador, y resulta en un conjunto de bits que indica en que posiciones solo
uno de los patrones de bits tiene un 1.
La Tabla 2.4 muestra la tabla de la verdad para el operador de bits ^.
Patrn de Bits 1
Patrn de Bits 2
Resultado
Core Java
Operador
Sintaxis
Operacin
<<
>>
>>>
A<<B
A>>B
A>>>B
Para realizar cualquier tipo de desplazamiento, hay que recordar que el tipo de dato int
es de 32 bits, y el tipo long, 64 bits y tanto short como byte son promovidos a int para
ser representados en 32 bits para estas operaciones.
Si l operando (A) es un nmero negativo entonces la representacin de A se hace a
travs de complemento a dos.
Si al desplazar bits de un valor numrico, la cantidad (n) de bits a mover supera o iguala
el mximo de bits representable por el tipo de dato (32 bits para int y 64 bits para
long), los bits a desplazar sern n mdulo (%) de 32 o de 64.
Vea los ejemplos mostrados en la Figura 2.10, que muestra el uso de los operadores de
desplazamiento de bits.
Core Java
Operador
Uso
Equivalente
var1 = var2
var1 = var2
+=
var1 += var2
-=
var1 -= var2
*=
var1 *= var2
/=
var1 /= var2
%=
var1 %= var2
&=
|=
var1 |= var2
^=
var1 ^= var2
<<=
>>=
>>>=
Core Java
que se sigue que especifica la precedencia de cada operador sobre los otros. Esto se
llama precedencia de operadores.
La lista siguiente muestra la precedencia de operadores. El operador con ms alta
precedencia encabeza la lista. Conforme se baja en la lista, la precedencia decrece. Los
operadores con igual precedencia se muestran en la misma lnea. Cuando se tienen
operadores con igual precedencia en una expresin, el primer operador, de izquierda a
derecha en la expresin, tiene mayor precedencia.
La Figura 2.11 ilustra la precedencia de los diferentes operadores en Java.
Core Java
9. Conversin de Tipos
Puede haber situaciones donde el resultado de una expresin ser de un tipo en
particular, pero tiene que ser asignado a una variable de un tipo diferente. Por ejemplo,
se puede querer asignar el valor de una variable de punto flotante a una variable entera.
Algunas veces, se quiere realizar una operacin entre dos valores de diferentes tipos,
Se puede querer convertir un valor de un tipo en otro tipo. Esto se llama conversin de
tipos, y se puede hacer de dos formas:
Conversin Automtica.
Conversin Explcita.
Core Java
Considere una variable b, del tipo int, que tiene el valor de 1. Cuando se intenta
asignar esta variable b a una variable a del tipo byte, no hay que preocuparse por
errores de incompatibilidad de tipos, al realizar la conversin explcita, el compilador
Java convierte el valor int de b a un valor byte, y se lo asigna a a. La expresin ser
la siguiente:
byte a;
int b = 1;
a = (byte) b;//Valor de b convertido a int explcitamente
La Figura 2.13 muestra varios ejemplos de combinaciones de tipos de datos, en algunos
se aplica la coercin automtica, en otros se requiere la conversin de tipos explcita.
Core Java
Java 5.0 ha incorporado un nuevo tipo de conversin automtica entre las clases
envolventes y los tipos de datos primitivos. Este tipo de conversin se realizaba
manualmente por mtodos proporcionados en las clases envolventes (clases
Wrappers). Bajo este esquema se introducen los siguientes terminos:
Auto-boxing: Se refiere a las conversin automtica de un tipo de dato primitivo a su
correspondiente clase envolvente.
Auto-unboxing: Se refiere a las conversin automtica de una clase envolvente a su
correspondiente tipo de dato primitivo.El proceso manual se tornaba mecnico y
tedioso, por ello fueron integrados los mecanismos de auto-boxing y auto-unboxing para
permitir la conversin de valores primitivos hacia sus respectivos objetos envolventes de
manera directa y sin mayores complicaciones.
El Ejemplo 2.3 ilustra el uso auto-boxing y auto-unboxing en Java 5.0.
Ejemplo 2.3
El cdigo Java comienza aqu...
1. /*Definicion de la clase comienza aqui*/
2. public class ConversionEnvolventePrimitivoEjemplo {
3.
/*El metodo main comienza aqui */
4.
public static void main(String[] args) {
5.
6.
7.
8.
9.
Integer vuelta = 0;
// Parametros
double kilometros = 2.5;
10.
11.
12.
int tiempo = 2;
while (true) {
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Core Java
23.
}/* El metodo main termina aqui */
24. }/*Definicion de la clase termina aqui*/
El cdigo Java termina aqu
Salida:
Vuelta: 0 Distancia: 2.5 Tiempo: 2
Vuelta: 1 Distancia: 5.0 Tiempo: 4
Vuelta: 2 Distancia: 7.5 Tiempo: 6
Vuelta: 3 Distancia: 10.0 Tiempo: 8
Vuelta: 4 Distancia: 12.5 Tiempo: 10
Vuelta: 5 Distancia: 15.0 Tiempo: 12
Del cdigo anterior se puede observar que no fue necesario hacer ningn tipo de
conversin explicita entre un primitivo y un objeto envolvente en varias ocasiones.
Lo primero fue la asignacin de un entero de tipo int al objeto Integer, sin la
necesidad de usar el operador new. Luego, dentro del bloque while se realizan
operaciones matemticas e incremento en reiteradas ocasiones, para finalizar con la
comparacin sobre el objeto Integer con un primitivo de tipo int.
Fin del Ejemplo 2.3
Se han estudiado los tipos de datos primitivos en Java. A continuacin se aprender
acerca de los arreglos que son uno de los tipos referencias en Java.
10. Arreglos
Los arreglos se usan para almacenar varios valores de un mismo tipo de datos. Asuma
que se necesita almacenar los nombres de 100 empleados de una compaa. Si no se
usan arreglos, se tendran que usar 100 variables diferentes para almacenar los
nombres de los empleados. Los arreglos son tiles en estas situaciones, debido a que
no se tiene que declarar, inicializar y recordar 100 nombres de variables.
El ndice en un arreglo se usa para identificar cada elemento del arreglo. En el ejemplo
anterior, el ndice del primer elemento ser 0, el ndice del segundo, ser 1, y as
sucesivamente. El ndice del 100th elemento ser 99. Por lo tanto, se puede acceder al
nombre de un empleado especfico fcilmente usando el ndice correspondiente al
empleado. Vea la Figura 2.14, que representa los ndices en arreglos en Java.
Core Java
5000
12000
6000
7500
La Tabla 2.8 muestra un arreglo de enteros usado para almacenar la Renta Permitida
para cada empleado. La Renta Permitida se calcula como el 20% del pago bsico del
empleado.
800
1000
2400
1200
1500
new int[5];
Core Java
{5,2,0};
{5,2,0};
Las instrucciones anteriores inicializan un arreglo con tres valores enteros. El tamao
est implcito en este caso.
Se puede tambin simultneamente crear y asignar valores en los arreglos. Esto se
hace de la siguiente manera:
String [] s = new String[] {"uno", "dos"};
Considere la Figura 2.15, que resume las diferentes formas de crear arreglos en Java.
int x[] = {5, 2, 0};
float arregloFloat[] = new float[10];
String[] s1 = {"uno", "dos"};
String[] s2 = new String[]{"uno", "dos"};
Figura 2.15: Crear de Arreglos en Java
Core Java
7.
8.
9.
6000, 7500};
// Arreglo renta permitida por emppleado
double empRenta[] = new double[5];
10.
11.
12.
int i;
13.
14.
15.
empRenta[i] = .2 * empSueldo[i];
}// Fin del ciclo for
16.
17.
18.
19.
20.
2400.0
1200.0
1500.0
Core Java
4000
800
5000
1000
12000
2400
6000
1200
7500
1500
Tabla 2.9: Arreglo de Salario Base y Renta Permitida por Empleado (Bidimensional)
El Ejemplo 2.5 muestra como trabajar con arreglos de dos dimensiones en Java.
Ejemplo 2.5
El cdigo Java comienza aqu...
1. /*Definicion de la clase comienza aqui*/
2. public class ArregloBidimensionalEjemplo {
3.
/* Metodo main comienza aqui */
4.
public static void main(String args[]) {
5.
6.
7.
8.
9.
10.
{ 4000, 0},
{ 5000, 0},
{12000, 0},
11.
12.
13.
{ 6000, 0},
{ 7500, 0}
};
14.
15.
16.
int i, j;
double basico = 0.0;
17.
18.
19.
20.
21.
22.
23.
basico = empArreglo[i][j];
else
empArreglo[i][j] = 0.2 * basico;
}// Fin lazo for
Core Java
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
System.out.println();
}// Fin lazo for
}/* Metodo main termina aqui */
}/* Definicion de la clase termina aqui */
2400.0
1200.0
7500.0
1500.0
11.1
La Construccin ifelse
Core Java
Core Java
Core Java
Core Java
en true, las sentencias en el cuerpo del ciclo for son ejecutadas, y si resulta en
false, la sentencia siguiente al final del ciclo for se ejecuta.
Se pueden tener ciclos for anidados, en los cuales se tiene un ciclo for dentro de
otro. No hay restriccin en el nmero de ciclos for que se pueden tener dentro de un
ciclo for. La estructura general de un ciclo for anidado se da a continuacin:
for(inicializacion; booleanExp; incrementoExp){
sentencia1;
sentencia2;
for(inicializacion; booleanExp; incrementoExp){
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
.
.
.
sentenciaN;
}
Considere la Figura 2.17, que muestra el uso del ciclo for en Java. El ciclo for que se
muestra a continuacin calcula la suma de todos los elementos de un arreglo.
int a[] = {1, 2, 3, 4, 5};
int suma = 0;
for (int i = 0; i<a.length; i++){
suma = suma = a[i];
}
System.out.println("suma = " + suma);
Figura 2.17: Uso del Ciclo for
Core Java
sentencia2;
.
.
sentenciaN;
}
En la discusin de la construccin for, se ha estado usando incrementoExp, para
hacer referencia a la expresin de incremento del contador del ciclo, pero esta
expresin tambin puede ser usada para decrementar este contador.
Java 5.0 ha incorporado una nueva sintaxis para el ciclo for, con el cual se pretende
simplificar su uso.
La nueva sintaxis del ciclo for se muestra a continuacin:
for ([Tipo] identificador : arreglo|coleccion){
sentencia1;
sentencia2;
.
.
sentenciaN;
}
Observe el siguiente ejemplo, que muestra el uso del ciclo for en Java 5.0 con la
nueva sintaxis. El ciclo for que se muestra a continuacin hace lo mismo que el
ejemplo de la Figura 2.17.
int a[] = {1, 2, 3, 4, 5};
int suma = 0;
for (int numero : a) {
suma = suma + numero;
//suma += numero;
}
System.out.println("suma = " + suma);
Core Java
Core Java
Se pueden tener ciclos while anidados, en los que se tiene un ciclo while dentro de
otro. No hay restriccin en el nmero de ciclos while que se pueden tener dentro de un
ciclo while. La estructura general de esta forma del ciclo while se da a continuacin:
while(booleanExp){
sentencia1;
sentencia2;
while(booleanExp2){
sentencia1;
sentencia2;
.
.
.
sentenciaN;
}
.
.
.
sentenciaN;
}
Tambin se puede tener un ciclo while infinito, como sigue:
while( true ){
sentencia1;
sentencia2;
.
Unidad 2: Operadores, Expresiones y Control de Flujo
Core Java
.
sentenciaN;
}
Core Java
Se pueden tener dos o mas ciclos do-while anidados, en el cual se tienen ciclos dowhile dentro de otros. No hay restriccin en el nmero de ciclos do-while que se
pueden tener dentro de otro ciclo do-while. La estructura general de los ciclos dowhile anidados se muestra a continuacin:
do{
sentencia1;
sentencia2;
do{
sentencia1;
sentencia2;
.
.
.
sentenciaN
} while(booleanExp);
.
.
.
sentenciaN;
} while(booleanExp2);
Se puede tener un ciclo do-while infinito tambin, como sigue:
do {
sentencia1;
sentencia2;
Unidad 2: Operadores, Expresiones y Control de Flujo
Core Java
.
.
sentenciaN;
} while( true );
Core Java
.
sentenciaN;
}
Aqu, se usa la sentencia break despus de que todas las instrucciones dentro de un
case particular son ejecutadas. La sentencia break ocasiona que el flujo de control
salga de la construccin switch-case. Si no se usa la sentencia break, todas las
sentencias que estn despus del case que concuerde hasta el fin del bloque, sern
ejecutadas.
A continuacin se aprender acerca de las sentencias break y continue.
Core Java
Core Java
1.
2.
3.
etiquetaUno:
for(int i=0;i<2;i++){
System.out.println("En Ciclo Uno");
4.
5.
6.
etiquetaDos:
for(int j=0;j<2;j++ ){
System.out.println("En Ciclo Dos");
7.
8.
9.
if(j==0)
continue;
if(j==1)
10.
11.
break etiquetaUno;
if(j==2)
12.
continue etiquetaUno;
13.
}
14. }
El cdigo Java termina aqu
Salida:
En Ciclo Uno
En Ciclo Dos
En Ciclo Dos
Cuando j sea igual a 0, el control de flujo permanecer en el ciclo ms interno y
continuar la ejecucin para la iteracin donde j es igual a 1.
Cuando j es igual a 1, el control de flujo sale fuera del ciclo principal y en consecuencia
fuera del ciclo ms interno, terminado as con la ejecucin del cdigo. La variable j
nunca valdr 2.
Si la lnea (10) del fragmento de cdigo anterior se sustituye por la lnea:
break etiquetaDos;
La salida al ejecutar dicha aplicacin ser:
En
En
En
En
En
En
Ciclo
Ciclo
Ciclo
Ciclo
Ciclo
Ciclo
Uno
Dos
Dos
Uno
Dos
Dos
Cuando j es igual a 1, el control de flujo sale fuera del ciclo ms interno nicamente,
permitiendo que el ciclo ms externo realice las dos iteraciones establecidas por su
condicin, es decir, para i =0 e i =1 respectivamente.
Core Java
Nota: S la lnea (8) del fragmento de cdigo anterior se sustituye por la lnea:
continue etiquetaUno;
La salida al ejecutar dicha aplicacin ser:
En
En
En
En
Ciclo
Ciclo
Ciclo
Ciclo
Uno
Dos
Uno
Dos
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Core Java
Core Java
Core Java
Core Java
Core Java
Ejercicios de Laboratorio
1) Escriba un programa para crear una clase llamada Calculadora que usa
operadores aritmticos y tambin operadores de bits (&, | y ^). Inicialice las
variables con cualquier valor aceptable de su eleccin y demuestre el uso de
estos operadores.
Consejos tiles:
Declare dos variables enteras e inicialcelas con dos valores (por ejemplo 10 y
5).
Sume, reste, multiplique y divida estas dos variables e imprima los resultado en
la salida estndar.
Realice un AND (&), OR (|) y un XOR (^) bits en estas dos variables e imprima
los resultado en la salida estndar.
Escriba un ciclo for con el valor de la variable contadora variando desde 100
hasta 999.
3) Se da como entrada para un programa Java una oracin larga terminada con un
carcter nuevalinea. La oracin puede contener letras, dgitos y caracteres
especiales. Se requiere que se escriba un programa de Java que cuente el
nmero de letras, dgitos, espacios en blanco, adems de otros caracteres y los
muestre de la siguiente forma:
Ejemplo :
Entrada
Salida :
Letras
Dgitos
Libro 1: Core Java
: 31
: 0
Unidad 3: Lab. de Operaciones, Expresiones y Control de Flujo 91
Copyright IBM Corp. 2007
Los materiales del curso no pueden ser reproducidos total o
parcialmente sin el previo permiso escrito de IBM.
Core Java
Espacios en blanco
: 6
Otros
: 10
Consejos tiles:
Declare una variable String, str e inicialcela con la oracin por ejemplo.
Mustrelos (:,*,; etc.) en una forma adecuada!\n.
Cree un ciclo for (haciendo uso de su nueva sintaxis), que opere con el arreglo
de caracteres y asigne cada uno de los elementos en una variable Character
llamada caracter.
Core Java
Declare una variable entera llamada numero e inicialcela con un entero vlido
(por ejemplo 54321).
5) Calcule la denominacin de 500, 100, 50, 20, 10, 5, 2 y 1 billetes de dlar que
formarn el 54321 e imprmalos en la salida estndar.
Core Java
Core Java
Explicar cmo los mtodos en una clase Java pueden ser sobrecargados.
Core Java
1. Introduccin
En el volumen anterior, se tuvo una visin general de la programacin en Java. Se
estudiaron los operadores, expresiones y sentencias de control de flujo. En esta unidad,
se discuten clases y objetos en Java.
Todos los das, son empleados numerosos objetos en nuestras vidas, algunos de los
cuales tienen ciertas caractersticas comunes que los hacen pertenecer a una categora
particular. Por ejemplo, John Davenport y Edna Smith son estudiantes en una
universidad. Ambos tienen algunos atributos en comn como el nombre, edad, nmero
de identificacin del estudiante, nombre de la universidad, carrera estudiando, estatus
del estudiante, cursos registrados, calificaciones obtenidas, y as sucesivamente, que
son comunes a cualquier estudiante. Aunque ellos comparten este conjunto de
atributos, los valores de los atributos sern diferentes y especficos para cada persona.
Similarmente, el carro de John y el de Edna pertenecen a una categora llamada carro.
Algunos de los atributos comunes a esta categora son: nmero de placa del carro,
fecha de fabricacin, tipo de carro, etc. En un escenario orientado a objetos, John y
Edna son objetos de la clase estudiante y sus carros son objetos de la clase carro. A
continuacin se aprender ms acerca de clases y objetos.
2. Clases y Objetos
Una vez vistos algunos ejemplos del mundo real de clases y objetos, se les va a definir
formalmente.
Una clase es una entidad auto contenida que provee una plantilla (framework) para
definir atributos y comportamiento encontrados comnmente en objetos de software
pertenecientes a un tipo en particular. Los atributos se representan como variables y el
comportamiento como mtodos en una clase Java.
Cualquier instancia creada a partir de la plantilla se denomina un objeto. El proceso a
travs del cual una instancia (objeto) se crea se llama instanciacin.
Se puede modelar el ejemplo de Estudiante, dado anteriormente, en clases y objetos de
software.
Se tendr una clase Estudiante que define atributos como: gnero, nombre, nmero
de identidad, nmero de estudiante, carrera estudiante, estatus, nombre, edad, cursos
registrados, calificaciones obtenidas y otros.
La Figura 1.1 muestra el modelo de software de un estudiante en una clase
Estudiante.
Core Java
Core Java
Se pueden obtener los atributos del objeto estudiante usando los mtodos getter
(mtodos que comienzan con la palabra get, como: getNombre, getEdad, etc.) y se
les puede asignar valor a los atributos mediante los mtodos setter (mtodos que
comienzan con la palabra set, como: setNombre, setEdad, etc.).
La Figure 1.3 muestra tres objetos creados de la clase Estudiante para representar
tres estudiantes: Edna Smith, J. McDonald and T. Hughes.
Estos objetos son diferentes entre s. Los datos en cada uno de estos objetos son
diferentes, aunque las variables en las que se almacenan tengan el mismo nombre. Los
mtodos que estn disponibles en estos objetos son los mismos. De aqu que sean
llamadas instancias de la clase.
Se ha visto que una clase tiene variables y mtodos. A continuacin se presenta la
estructura de una clase Java.
Core Java
Core Java
Habiendo comprendido la estructura de una clase Java, se contina con los miembros
de una clase Java.
Core Java
4. Variables
Las variables disponibles en una clase pueden ser de varios tipos, son estos, variables
de instancia, variables de clase, variables final, variables transient y variables
volatile. Observe cada una de ellas en detalle.
Core Java
Las variables de instancia se usan para representar los atributos de datos de un objeto
particular. Las variables de instancia son creadas cuando el objeto es instanciado. En la
Figura 1.6, nombre, genero y edad son variables de instancia del objeto Estudiante.
Estas se acceden usando la instancia o el objeto creado.
Core Java
false
(carcter en blanco)
0
short
integer
long
float
double
0.0
0
0
0.0
Core Java
Core Java
Figura 1.8: Uso de los Modificadores static and final para Constantes de Librera
}
Aqu, nombre es declarada como una variable miembro, porque la declaracin se hace
dentro del cuerpo de la clase y fuera de cualquier mtodo o constructor de la clase. El
nombre de la variable miembro es nombre, y su tipo de dato es String. El modificador
private indica que nombre como una variable slo puede ser accedida dentro de los
constructors y mtodos de la clase Estudiante.
A continuacin se examinan los mtodos en Java.
Core Java
5. Mtodos
Los mtodos en Java se usan para tener acceso y manipular las variables. Usualmente,
los mtodos se usan para asignar, recuperar, o cambiar los valores almacenados en
una variable. La definicin de mtodos establece el tipo y nombre de los parmetros de
entrada. Los parmetros pasan a ser variables locales del mtodo, tambin el mtodo
puede declarar otras variables locales dentro de ella. Las variables locales pueden ser
de tipo primitivo o referencias a objeto. Ellas no pueden ser referenciadas antes de ser
declaradas y no pueden usarse sin haber sido inicializadas. Un ejemplo se presenta a
continuacin.
public void hacerCualquierCosa() {
MiClase mc;
mc.getNombre();
// Error
mc = new MiClase();
mc.getNombre();
// OK
}
Antes de inicializar mc, no se puede usar mc. El compilador genera un error.
En Java 5.0 se permite establecer un nmero variable de parmetros en los mtodos, al
igual que C. Para lograr esto, se hace uso de la expresin .... Seguidamente, se
presenta un ejemplo de ello:
Core Java
En Java, los mtodos son de diferentes tipos, son estos, mtodos de instancia y
mtodos de clase. Se vern estos dos tipos en detalle a continuacin.
Variables de instancia.
Variables de clase.
Mtodos de clase.
Figura 1.9: Mtodo Getter para Recuperar el Valor de una Variable de Instancia
Un mtodo setter se usa para asignar valor a variables privadas. Los mtodos setter se
inician con la palabra set. La Figura 1.10 muestra como el mtodo setter se usa para
asignar valor a la variable nombre.
Figura 1.10: Mtodo Setter Que Asigna un Valor a una Variable de Instancia
Core Java
La clase Math tiene muchas funciones de librera, que tambin estn definidas como
mtodos estticos. As, los mtodos definidos en la clase Math pueden usarse
directamente. La Figura 1.12 muestra el uso de mtodos estticos definidos en la clase
Math.
Core Java
Cuando un usuario inicia una aplicacin, algn cdigo debe ser ejecutado. Sin una
referencia a objetos, no habr cdigo a ser ejecutado. Java supera esto proveyendo el
mtodo main, que es un mtodo esttico. Este mtodo esttico main es independiente
de un objeto. Dentro del mtodo main, otros objetos pueden ser instanciados.
A continuacin se aprender a cmo usar los mtodos de clase para acceder a la clase.
8.
9.
10.
System.out.println(n);
}/* El metodo agregar termina aqui */
11.
12.
13.
agregar(53, 74);
14.
}/* El metodo main termina aqui */
15. }/*Definicion de la clase StaticEjemplo termina aqui*/
Libro 1: Core Java
Core Java
Mtodos Abstractos.
Mtodos Final.
Mtodos Nativos.
Mtodos Sincronizados.
Aunque los mtodos abstractos son mtodos de instancia, los otros tres pueden ser
mtodos de instancia o de clase.
Core Java
escritura de mtodo. Si no se quiere que un mtodo sea sobreescrito por sus subclases,
se puede usar el modificador final en la declaracin del mtodo, como sigue:
public final int mostrarSalida(int a);
A continuacin se discute acerca de los mtodos nativos, que permiten que se use el
cdigo escrito en otro lenguaje.
6. Modificadores de Acceso
Se pueden usar los modificadores de acceso de Java para proteger las variables y
mtodos de una clase de ser accedidos sin garanta por parte de otras clases. Los
modificadores de acceso permitidos por Java son: public, protected, package y
private. Se va a iniciar la revisin con el modificador de acceso public.
Core Java
7.
}
8. }/*Definicion de la clase PublicEjemplo termina aqui*/
El cdigo Java termina aqu
Se va a escribir una clase llamada ClaseNoRelacionada en otroPaquete, que es
totalmente diferente del paquete en el cual est la clase PublicEjemplo.
pe.secretoAbiert = 35;
pe.abrirMetodoSecreto();
}
Core Java
La clase ClaseNoRelacionada no tiene ninguna relacin con (no es una subclase de)
la clase PublicEjemplo. A pesar de esto, se puede acceder a la variable y al mtodo
public definidos en la clase PublicEjemplo.
Fin del Ejemplo 1.2
A continuacin se discute el modificador de acceso protected, que no es tan
permisivo como el modificador de acceso public.
package miPaquete;
8.
}
9. }/*Definicion de la clase ProtectedEjemplo termina aqui*/
El cdigo Java termina aqu
Ahora, considere la clase ProtectedHijo, que extiende de la clase
ProtectedEjemplo, pero que est presente en un paquete otroPaquete que es
diferente del paquete en el cual ProtectedEjemplo fue declarada. En este caso, la
clase ProtectedHijo implcitamente obtiene todos los mtodos definidos en
ProtectedEjemplo, pero la clase ProtectedHijo no puede acceder la variable
protected o invocar al mtodo protected de un objeto de la clase
ProtectedEjemplo. Observe:
Libro 1: Core Java
Core Java
package otroPaquete;
3. import miPaquete.*;
4.
5. //Definicion de la clase ProtectedHijo comienza aqui
6. class ProtectedHijo extends ProtectedEjemplo {
7.
void accederSecreto(ProtectedEjemplo pe, ProtectedHijo ph) {
8.
pe.secretoFamiliar = 53;
// error
9.
10.
11.
ph.secretoFamiliar = 33;
pe.metodoSecretoFamiliar(); // error
ph.metodoSecretoFamiliar();
12.
}
13. }//Definicion de la clase ProtectedHijo termina aqui
package miPaquete;
2.
3. //Definicion de la clase AmigoDeLaFamilia comienza aqui
4. class AmigoDeLaFamilia {
5.
6.
7.
8.
9.
void accederSecreto() {
ProtectedEjemplo pe = new ProtectedEjemplo();
pe.secretoFamiliar = 53;
pe.metodoSecretoFamiliar();
}
Core Java
int secretoEntreAmigos;
void metodoSecretoEntreAmigos(){
7.
System.out.println("metodoSecretoEntreAmigos");
8.
}
9. }/*Definicion de la clase PackageEjemplo termina aqui*/
El cdigo Java termina aqu
La clase PackageEjemplo tiene acceso a la variable secretoEntreAmigos y al
mtodo metodoSecretoEntreAmigos(). Todas las clases presentes en el paquete
miPaquete tienen acceso a la variable secretoEntreAmigos y al mtodo
metodoSecretoEntreAmigos().
Ahora, considere la clase PackageAmigo, que est presente en miPaquete.
package miPaquete;
Core Java
9.
}
10. }/*Definicion de la clase PackageAmigo termina aqui*/
package otroPaquete;
3. import myPackage.*;
4.
5. /*Definicion de la clase PackageHijo comienza aqui*/
6. class PackageHijo extends PackageEjemplo {
7.
void accederMiembrosDePackage(){
8.
9.
10.
11.
}
12. }/*Definicion de la clase PackageHijo termina aqui*/
Core Java
// error
Core Java
2. class PrivateEjemplo {
3.
private int secreto;
4.
boolean verificarAccesoPrivado(PrivateEjemplo pe){
5.
6.
7.
if (this.secreto == pe.secreto)
return true;
else
8.
return false;
9.
}
10. }/*Definicion de la clase PrivateEjemplo termina aqui*/
Core Java
public Estudiante(){}
public Estudiante(int nuevoId){
id = nuevoId;
}
public Estudiante(int nuevoId, String nuevoNombre){
id = nuevoId;
nombre = nuevoNombre;
}
Figura 1.13: Constructores para la Clase Estudiante
Core Java
public Fibonacci() {
n = 0;
}
// constructor
// constructor
Core Java
declaracin de clase no tiene estos elementos opcionales, los valores por defecto que
usa el compilador Java son: no-public, no-final, no-abstract y sub-clase de la
clase Object. La clase java.lang.Object es la superclase de todas las clases Java
por defecto. Se estudiar en detalle super clases en la Unidad 3 - Herencia de este
volumen. El compilador Java tambin asume que una clase no implementa ninguna
interfaz. Considere el Ejemplo 1.6, un programa que imprime los primeros cinco
trminos de la serie de Fibonacci.
Ejemplo 1.6
Se va a crear una clase en este programa de ejemplo. Se usar esta clase en las
siguientes secciones.
El cdigo Java comienza aqu...
1. /*Definicion de la clase Fibonacci comienza aqui*/
2. public class Fibonacci {
3.
public int a = 0, n; /* variable */
4.
private int b = 1, c, contador = 2; /* variables */
5.
6.
7.
8.
9.
n = numeroDeTerminos;
}/* Constructor Fibonacci termina aqui */
10.
11.
12.
13.
14.
15.
n = numeroDeTerminos;
}/* Metodo cambiarNumeroDeTerminos termina aqui */
16.
17.
18.
19.
20.
21.
System.out.println("Entrada invalida");
System.exit(0);
}
22.
23.
24.
if (n >= 1)
System.out.println(a);
if (n >= 2)
25.
26.
System.out.println(b);
while (contador < n) {
Core Java
27.
28.
29.
c = a + b;
System.out.println(c);
a = b;
30.
31.
32.
b = c;
contador++;
}
33.
34.
35.
36.
37.
38.
fib.mostrarSeries();
39.
}/* Metodo main termina aqui */
40. }/* Definicion de la clase Fibonacci termina aqui */
8. Sobrecarga de Mtodo
En la seccin anterior se vio que ms de un constructor puede ser creado para una
clase. De manera similar, Java permite tener dos o ms mtodos con el mismo nombre
dentro de la misma clase. Como con los constructores, los mtodos sobrecargados
Core Java
6.
7.
8.
}
void mostrarEnPantalla(int a, char b){
9.
10.
11.
System.out.println(a);
System.out.println(b+"\n");
}
12.
13.
14.
15.
16.
17.
System.out.println(b+"\n");
}
18.
19.
20.
Core Java
21.
22.
23.
System.out.println(c+"\n");
}
24.
25.
26.
27.
28.
29.
System.out.println(c);
System.out.println(d+"\n");
}
30.
31.
32.
33.
34.
35.
36.
37.
msce.mostrarEnPantalla(68, 'g');
msce.mostrarEnPantalla('f', 74);
msce.mostrarEnPantalla(64, 36, 'h');
38.
msce.mostrarEnPantalla(85, 'd', (float) 745.3, "true");
39.
}
40. }/*Definicion de la clase termina aqui*/
Core Java
85
d
745.3
true
En la salida del programa anterior se puede ver en la lnea 37 de la clase
MetodoSobrecargadoEjemplo que a pesar que el tercer argumento pasado al
mtodo fue el carcter h, ese carcter no se imprimi y que en su lugar se imprimi el
valor ASCII del carcter, que es 104. Esto se debe a que el compilador primero busca
por la correspondencia exacta de ambos, tanto del nmero de argumentos como del
tipo de dato de los argumentos.
En un programa, cuando ambas condiciones corresponden con una versin
sobrecargada particular del mtodo, se llama a esa versin particular del mtodo. En la
ausencia de tal correspondencia, el compilador convierte implcitamente el tipo de dato
de los argumentos a algn otro tipo de dato, siempre que esa conversin se permita en
Java.
En el ejemplo anterior, el compilador busca por una correspondencia exacta para el
conjunto de tres tipos de datos. Si se encuentra esa correspondencia, esta versin
particular del mtodo sobrecargado ser invocada. Sin embargo, no existe una
correspondencia directa cuando dos enteros y un carcter son pasados como
argumentos. As que el tercer argumento se convirti implcitamente a un int (Java
permite tal conversin, de int a char y viceversa), hubo una correspondencia con la
versin del mtodo mostrarEnPantalla, la cual toma tres enteros como argumentos.
Se invoc esa versin y por lo tanto se obtuvo la salida anterior.
Fin del Ejemplo 1.7
A continuacin se va a entender el concepto de clases anidadas.
9. Clases Anidadas
Una clase anidada es una clase cuya definicin est dentro de otra clase. Si una clase
contiene a una clase anidada, es conocida como clase exterior.
Las clases anidadas tienen acceso total a los miembros de su clase exterior, incluso a
los miembros privados. Estas clases son consideradas miembro de la clase
contenedora. Ellas pueden ser final o abstract. Ahora como miembro tambin
puede ser private, protected, adems de public o package que es una
posibilidad para cualquier clase.
La forma general de una clase exterior que contiene a una clase anidada se muestra a
continuacin:
class ClaseExterna{
Core Java
Clase Anidada Esttica: esta clase se declara como miembro esttico (static)
de la clase exterior y tiene todas las caractersticas de cualquier otro miembro
esttico.
6.
7.
8.
9.
10.
11.
class Acelerador {
private int velocidadMaxima;
12.
13.
Acelerador() {
velocidadMaxima = 180;
14.
15.
16.
17.
Core Java
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
marca = mar;
nombre = nom;
placa = pla;
32.
33.
34.
velocidadActual = 0;
}/* Constructor Carro termina aqui */
35.
36.
37.
38.
39.
40.
41.
}/* Metodo main termina aqui */
42. }/* Definicion de la clase Carro termina aqui */
El cdigo Java termina aqu
Note que en la lnea 38 se necesita la instancia de la clase Carro para poder crear una
instancia de Acelerador, debido a que esta ltima es un miembro de instancia de la
clase Carro.
Fin del Ejemplo 1.8
Una clase interna tambin puede estar definida dentro de algn mtodo de una clase
externa. Esta representacin es como sigue:
public class ClaseExterna{
Core Java
Este tipo de clase interna puede acceder a todos los miembros de la clase contenedora,
inclusive puede modificarlos. Sin embargo slo tiene acceso a las variables final del
mtodo que la contiene, en el ejemplo, y y z.
Es posible declarar clases internas con o sin nombre. Las clases internas sin nombre
son conocidas como Clases Internas Annimas y sern discutidas para el manejo de
eventos en la Unidad 5 Modelo de Delegacin de Eventos y Manejo de Eventos del
Volumen 5. A continuacin se va a entender cmo tomar entradas del usuario a travs
de argumentos de la lnea de comandos.
7.
8.
9.
Core Java
Core Java
Core Java
Core Java
Core Java
new Fibonacci(10).mostrarSeries();
El mtodo mostrarSeries() no retorna ningn valor (indicado por la palabra clave
void). Suponga que se tiene un mtodo que retorna un valor y se quiere guardar el
valor retornado, se puede hacer como se muestra a continuacin:
(Asuma que el mtodo mostrarSeries() retorna un valor entero).
El cdigo Java comienza aqu...
public int mostrarSeries() {
// mtodo
if(n<=0) {
System.out.println("Entrada invalida");
return(0);
}
if(n>=1)
System.out.println(a);
if(n>=2)
System.out.println(b);
while(contador<n) {
c=a+b;
System.out.println(c);
a=b;
b=c;
contador++;
}
return(1);
}
El cdigo Java termina aqu
En el caso anterior el mtodo mostrarSeries() retorna 1 para indicar que la
operacin fue exitosa, o 0 para indicar lo contrario. Si se quiere guardar el valor
retornado por el mtodo en una variable, se hace como sigue:
int exito = new Fibonacci(10).mostrarSeries();
o
Fibonacci fib = new Fibonacci(10);
int exito = fib.mostrarSeries();
En el segundo caso, la referencia al objeto Fibonacci debe ya estar disponible en la
variable fib como se discuti anteriormente en esta seccin. Invocar un mtodo en un
objeto es similar a enviar un mensaje a ese objeto. Si se tienen dos variables de
Libro 1: Core Java
Core Java
13. Enumeraciones
En Java 5.0, aparece la palabra reservada enum que permite definir un conjunto de
valores constantes bajo un mismo espacio de nombres que lo hace ser ms coherente y
legible. Seguidamente, se presenta un ejemplo de ello:
enum Semana {DOMINGO, LUNES, MARTES, MIERCOLES, JUEVES, VIERNES,
SABADO}
Unidad 1: Clases y Objetos
Core Java
Sus valores no son tipo de datos enteros: Cada valor declarado es una instancia
de la clase enumeracin en s mismo.
Sus valores son public, static y final: Impide que sus valores puedan ser
sobreescritos o cambiados. Adems, impide que estos objetos sean superclases
de otras.
Las
enumeraciones
implementan
java.io.Serializable.
java.lang.Comparable
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Explicar cmo los mtodos en una clase Java pueden ser sobrecargados.
Core Java
Core Java
Core Java
Core Java
Core Java
Ejercicios de Laboratorio
1) Escriba un programa en Java que tenga dos clases, Empleado y
CalcularSueldo. Empleado tiene los siguientes detalles acerca del empleado:
nombre, cdigo de empleado, horas trabajadas y pago por hora.
CalcularSueldo crea instancias de la clase Empleado, obtiene los detalles del
empleado para calcular los pagos y los imprime en la salida estndar. Use el
constructor de la clase Empleado para asignar valores a las diferentes variables.
Sugerencias tiles:
Escriba una clase llamada Usuario que invoque las diferentes versiones de
area() en la clase Area con valores de prueba como parmetros. El valor
retornado se imprime en la salida estndar.
Core Java
Escriba mtodos para obtener los valores de estas variables y asignar valores a
estas variables.
Escriba mtodos para obtener los valores de estas variables y asignar valores a
estas variables.
Escriba mtodos para obtener los valores de estas variables y asignar valores a
estas variables.
Use el mtodo setter para inicializar las variables de cada clase con valores de
prueba.
4) Cree una enumeracin llamada Curso con los nombres de los cursos de su
preferencia. Cree una clase llamada Programa y defina un mtodo esttico que
reciba un nmero variable de cursos e imprima un mensaje particular para cada
uno.
Sugerencias tiles:
En la clase anterior, defina un mtodo esttico que reciba varios cursos usando
la notacin ....
Core Java
Core Java
Unidad 3: Herencia
Objetivos del Aprendizaje
Al final de esta unidad, usted ser capaz de:
Core Java
1. Introduccin
La herencia es uno de los fundamentos de la programacin orientada a objetos. Permite
crear una jerarqua entre un grupo de clases que tiene caractersticas similares. Se
puede tener una clase que define los atributos y comportamiento comunes a un grupo
especfico de clases. Todas las clases que son parte de este grupo especfico pueden
heredar los atributos y el comportamiento de esta clase comn.
Se va a entender que es la herencia tomando un ejemplo de la vida real. Asuma que
quiere crear una clase llamada ArbolDePino, que tiene las mismas caractersticas
que la clase Arbol, adems de algunas caractersticas adicionales. Una forma de
hacerlo es rescribiendo las variables miembro (atributos) y los mtodos
(comportamiento) que ya estaban disponibles en la clase Arbol, tambin en la clase
ArbolDePino, y luego aadir las caractersticas especiales a la clase ArbolDePino.
Sin embargo, Java proporciona una forma elegante de hacer lo anterior, usando el
concepto de herencia. De acuerdo con este concepto, la clase ArbolDePino puede ser
una subclase de la clase Arbol. As, la clase ArbolDePino obtiene implcitamente
todas las variables y mtodos que tengan acceso protected, public y package.
Adicionalmente, ArbolDePino puede aadir sus propias caractersticas especiales
adems de las caractersticas de la clase Arbol. Dado que ArbolDePino hereda de la
clase Arbol, puede ser llamado un tipo de Arbol.
La clase que define los atributos y el comportamiento comn se denomina superclase.
Las clases que heredan atributos y comportamiento de la clase general (superclase) se
denominan subclases. Una superclase es una clase que es heredada por otras clases.
A continuacin se discute cmo declarar clases usando la herencia en Java.
Unidad 3: Herencia
Core Java
2. class Arbol {
3.
private String nombre;
4.
private int edad;
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
}
public int getEdad() {
16.
17.
18.
return edad;
}
19.
20.
21.
22.
23.
24.
25.
Core Java
26.
27.
28.
29.
}
30. }/* Definicion de la clase Arbol termina aqui */
31.
32. /* Definicion de la clase ArbolDePino comienza aqui */
33. class ArbolDePino extends Arbol {
34.
private boolean conifero;
35.
36.
public ArbolDePino() {
37.
38.
39.
setNombre("Pino");
conifero = true;
}
40.
41.
42.
43.
}
44. }/* Definicion de la clase ArbolDePino termina aqui */
45.
46. /* Definicion de la clase HerenciaEjemplo comienza aqui */
47. public class HerenciaEjemplo {
48.
public static void main(String[] args) {
49.
50.
51.
String nombreSuper;
String nombreSub;
Arbol superClase = new Arbol();
52.
53.
54.
55.
56.
57.
subClase.setEdad(68);
nombreSuper = superClase.getNombre();
nombreSub = subClase.getNombre();
58.
59.
60.
61.
62.
superClase.setEdad(36);
Unidad 3: Herencia
63.
64.
65.
Core Java
66.
System.out.println("Conifero: " + subClase.isConifero());
67.
}
68. }/* Definicion de la clase HerenciaEjemplo termina aqui */
Core Java
3.1 Qu es Heredado?
Las variables miembro, tambin conocidas como campos y los mtodos de la clase
base son heredados. Los constructores de la clase base no son heredados. La herencia
no implica automticamente visibilidad o accesibilidad a los miembros de la clase base
en la clase que hereda. Los modificadores de acceso controlan la accesibilidad de los
miembros. As, un miembro de datos privado de la clase base a pesar de que es
heredado por la subclase no es accesible en forma directa por la subclase. Slo usando
un mtodo getter provisto en la clase base, se puede acceder a este miembro privado.
Unidad 3: Herencia
Core Java
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
}/* Metodo main termina aqui */
15. }/* Definicion de la clase CompararEjemplo termina aqui */
Libro 1: Core Java
Core Java
Unidad 3: Herencia
Core Java
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
System.out.println(iguales);
}/* Metodo main termina aqui */
Core Java
objeto actual. Considere por un momento otro ejemplo, que se muestra en la Figura 3.2,
para entender el uso de la palabra reservada super.
Core Java
5.
6.
7.
8.
9.
10.
this.nombre = nombre;
this.edad = edad;
}
11.
12.
13.
public Arbol() {
this.nombre = "Roble";
14.
15.
16.
this.edad = 100;
}
17.
18.
19.
Core Java
20.
21.
22.
}
public String getNombre() {
23.
24.
25.
return nombre;
}
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
return edad;
}
public void setConFlores(boolean conFlores) {
43.
this.conFlores = conFlores;
44.
}
45. }/* Definicion de la clase Arbol termina aqui */
46.
47. /* Definicion de la clase ArbolDePino comienza aqui */
48. class ArbolDePino extends Arbol {
49.
50.
51.
52.
53.
super();
setNombre("Pino");
54.
55.
56.
conifero = true;
public ArbolDePino() {
Unidad 3: Herencia
Core Java
57.
58.
59.
60.
61.
62.
}
public ArbolDePino(ArbolDePino arbolDePino) {
63.
64.
65.
super(arbolDePino);
conifero = arbolDePino.conifero;
}
66.
67.
68.
return conifero;
69.
}
70. }/* Definicion de la clase ArbolDePino termina aqui */
71.
72. /* Definicion de la clase SuperEjemplo comienza aqui */
73. public class SuperEjemplo {
74.
75.
76.
77.
78.
79.
80.
81.
82.
+ arbol1.getEdad());
Arbol arbol2 = new Arbol("Mango", 64);
83.
84.
85.
System.out.println("\nContenido de arbol2:");
System.out.println("Nombre Arbol: "
+ arbol2.getNombre());
86.
87.
88.
89.
90.
91.
92.
93.
Core Java
94.
95.
96.
+ arbol3.getEdad());
ArbolDePino pino1 = new ArbolDePino();
97.
98.
99.
System.out.println("\nContenido de pino1:");
System.out.println("Nombre Arbol: "
+ pino1.getNombre());
100.
101.
102.
103.
104.
+ pino1.isConifero());
105.
106.
107.
108.
109.
110.
+ pino2.getNombre());
System.out.println("Edad Arbol: "
+ pino2.getEdad());
111.
112.
113.
System.out.println("Conifero : "
+ pino2.isConifero());
114.
115.
116.
117.
118.
119.
+ pino3.getNombre());
System.out.println("Edad Arbol: "
+ pino3.getEdad());
120.
121.
122.
System.out.println("Conifero : "
+ pino3.isConifero());
}
Core Java
Contenido de arbol2:
Nombre Arbol: Mango
Edad Arbol: 64
Contenido de arbol3:
Nombre Arbol: Mango
Edad Arbol: 64
Contenido de pino1:
Nombre Arbol: Pino
Edad Arbol: 100
Conifero : true
Contenido de pino2:
Nombre Arbol: Pino
Edad Arbol: 35
Conifero : true
Contenido de pino3:
Nombre Arbol: Pino
Edad Arbol: 35
Conifero : true
En este programa, la clase Arbol define tres constructores sobrecargados diferentes.
ArbolDePino usa los tres constructores cuando define sus constructores usando
super().
Fin del Ejemplo 3.4
Teniendo una idea general de la palabra reservada super, se ver en detalle su uso en
la herencia.
3.3.1 Usar super en Clases Derivadas Un Enfoque Detallado
En trminos generales, una subclase se puede referir a su superclase inmediata usando
la palabra reservada super. La palabra reservada super puede usarse en dos formas
diferentes. La primera forma se usa cuando se invoca al constructor de la superclase,
mientras que la segunda se usa para acceder a las variables miembro de la superclase
que han sido ocultadas por las variables miembro de la subclase. En el programa del
Ejemplo 3.4 se vio que el uso de la primera forma de la palabra clave super. El uso de la
segunda forma de la palabra clave super ser ilustrado posteriormente.
Libro 1: Core Java
Core Java
Una subclase puede ocultar una variable de su superclase teniendo su propia variable
con el mismo nombre que el de la superclase.
La forma general de la palabra reservada super usada por el constructor de la
subclase para llamar al constructor de la superclase es como sigue:
super(listaDeParametros);
Cuando una subclase usa la palabra reservada super en la forma descrita, el
compilador busca por la correspondencia exacta en la lista de parmetros de los
diferentes constructores de la superclase. Si se encuentra una correspondencia, se usa
ese constructor particular, como se ilustr en el programa del Ejemplo 3.4.
Vase el siguiente constructor definido por la clase ArbolDePino.
ArbolDePino(ArbolDePino ap) {
super(ap);
conifero = ap.conifero;
}
En este cdigo, super() se usa con un objeto del tipo ArbolDePino y no del tipo
Arbol. Pero an as, se invoca al constructor de la forma Arbol(Arbol arbol),
esto se debe a que una variable referenciando a un objeto de la superclase tambin
puede usarse para referenciar al objeto de una clase que deriva de ella. Por lo tanto, se
puede pasar el objeto ArbolDePino al constructor Arbol(Arbol arbol). En este
caso, el objeto arbol puede acceder solamente a los miembros presentes en la clase
Arbol. No conoce acerca de los miembros adicionales de la clase ArbolDePino. De
esta forma, el miembro conifero se le asigna valor por separado en el constructor
ArbolDePino() despus de invocar al constructor de la clase Arbol mediante
super(). Usualmente si se usa super(), entonces ser la primera sentencia en el
constructor de una subclase, de lo contrario el compilador generar un error. Aqu
super() permite referir al constructor de la superclase inmediata (Arbol) de la clase
actual (ArbolDePino).
La palabra reservada super tambin sirve para referir a las variables miembro o a los
mtodos miembro de la superclase. Este uso de la palabra reservada super es similar
al uso de la palabra reservada this. La forma general del uso de super se da a
continuacin:
super.nombreDeMiembro
Aqu, nombreDeMiembro puede referir tanto a una variable como a un mtodo de
instancia de la superclase. Se ver en un ejemplo como acceder a un mtodo de la
superclase desde un mtodo en la subclase en la seccin Sobrescritura de Mtodos.
La herencia tiene un comportamiento diferente cuando se usa junto a un modificador de
acceso. A continuacin se considera ese aspecto.
Unidad 3: Herencia
Core Java
Core Java
6.
7.
8.
9.
10.
this.edad = edad;
}
11.
12.
13.
14.
15.
16.
17.
Unidad 3: Herencia
Core Java
27.
28.
29.
30.
31.
public ArbolDePino(
String nombre,
int edad,
41.
42.
43.
String lugarDondeCrece) {
super(nombre, edad);
44.
45.
46.
this.lugarDondeCrece = lugarDondeCrece;
}
47.
48.
49.
Core Java
55.
56.
57.
58.
59.
60.
"Malaysia");
System.out.println("Arbol: " + pino.getNombre());
System.out.println("Edad: " + pino.getEdad());
61.
62.
63.
64.
}
65. }/* Definicion de la clase termina aqui */
Unidad 3: Herencia
Core Java
Ejemplo 3.6
El ejemplo muestra como se construyen los objetos.
El cdigo Java comienza aqu
1.
2. class X {
3.
public X() {
4.
System.out.println("Objeto de la clase X construido!");
5.
}
6. }/* Definicion de la clase X termina aqui */
7.
8. /*Definicion de la clase Y comienza aqui*/
9. class Y extends X {
10.
11.
12.
public Y() {
System.out.println("Objeto de la clase Y construido!");
}
new Z();
}
Core Java
int a, b, c;
6.
7.
8.
a = m;
b = n;
}
9.
10.
11.
X(int m, int n) {
12.
}
13. }/* Definicion de la clase X termina aqui */
14.
15. /* Definicion de la clase Y comienza aqui */
16. class Y extends X {
17.
int d;
18.
19.
Unidad 3: Herencia
Core Java
20.
21.
22.
23.
24.
25.
/* Metodo sobrescrito */
public int add() {
26.
27.
28.
super(m, n);
d = o;
int s = super.add();
return (c = s + d);
// return (c = super.add() + d);
29.
}
30. }/* Definicion de la clase Y termina aqui */
31.
32. /* Definicion de la clase comienza aqui */
33. public class SobrescrituraMetodosEjemplo {
34.
35.
36.
37.
38.
39.
System.out.println(
"Suma en la super clase: " +
x.add());
40.
41.
42.
System.out.println(
"Suma en la sub-clase: " +
y.add());
43.
}
44. }/* Definicion de la clase termina aqui */
El cdigo Java termina aqu
La salida del programa es la siguiente:
Suma en la super clase: 77
Suma en la sub-clase: 100
Del programa anterior, se puede ver que cuando se invoca el mtodo add() en el
objeto de la clase Y, se invoca al mtodo add() definido en Y. El mtodo add()
definido en su superclase est sobrescrito u oculto. Cuando los mtodos dentro de la
clase Y quieren acceder al mtodo sobrescrito de la clase X, pueden usar la palabra
reservada super como se mostr en el programa anterior.
Fin del Ejemplo 3.7
Core Java
Unidad 3: Herencia
Core Java
Core Java
8.
9.
10.
System.out.println(
"Valores de la referencia de la sub clase: ");
System.out.println("Nombre: " + ap.getNombre());
11.
12.
13.
14.
15.
16.
17.
18.
System.out.println(
"Valores de la referencia de la super clase: ");
19.
20.
21.
22.
23.
24.
Unidad 3: Herencia
Core Java
Todos los mtodos definidos en la clase base son accesibles a travs de a. Por lo tanto,
cuando se asigna la referencia a la subclase a una referencia de superclase, solamente
aquellos mtodos que estn disponibles en la superclase pueden ser accedidos usando
la referencia.
Fin del Ejemplo 3.8
El punto a destacar aqu es que la referencia al objeto de superclase que actualmente
referencia a su subclase permite acceder solamente a aquellas variables de la subclase
que han sido heredadas de la superclase. Por esto la referencia a no puede acceder al
miembro conifero, que est presente solamente en ArbolDePino, y no en Arbol.
Esto es as, porque la superclase no conoce de las caractersticas especiales aadidas
por la subclase. Esta es la razn por la que la lnea 23 de la funcin main,
a.isConifero() est comentada.
La asignacin a = new ArbolDePino() es conocida como upcast y es legal en Java.
Sin embargo, no se puede tener ap = new Arbol(), que es referido como downcast.
Si se desea asignar a a ap despus de hacer a = new ArbolDePino(), se debe
realizar una conversin explcita como se muestra a continuacin:
ap = (ArbolDePino) a;
A continuacin se aprender acerca del uso de la palabra reservada final en el
contexto de herencia.
Core Java
8.
9.
10.
11.
12.
13.
System.out.println(
"Valor de la variable a es: " +
a);
14.
15.
16.
final class X {
private int a;
3.
4.
5.
X(int m) {
a = m;
}
6.
Unidad 3: Herencia
7.
8.
9.
10.
11.
12. }
Core Java
a = m;
}
public int getA() {
return (a);
}
13.
14. /* error de compilacin, Y no puede ser subclase de X */
15. class Y extends X {
16.
17.
18.
19.
20.
public int b;
Y(int m, int n) {
super(m);
b = n;
}
21. }
El cdigo Java termina aqu
Como se discuti, la clase Y no puede heredar de la clase X, porque X fue declarada
como final.
Fin del Ejemplo 3.10
A continuacin se discute el uso de la palabra reservada final para evitar la
sobrescritura de mtodos de una superclase por su subclase.
3.7.1 Uso de la Palabra Reservada final Para Prevenir la Sobrescritura
En esta seccin veremos el uso de la palabra reservada final en la declaracin de los
mtodos para evitar que el mtodo sea sobrescrito.
A pesar de que sobrescribir mtodos es sin duda, una caracterstica importante en Java,
puede haber situaciones donde no se quiere que un mtodo sea sobrescrito por sus
subclases para mejorar el desempeo del programa. Esto se debe a que, en este caso,
el compilador sabe que estos mtodos final no sern sobrescritos por sus subclases,
y directamente remplaza el cdigo fuente por el bytecode, mejorando el rendimiento del
programa. Esto se llama enlace temprano (early binding). Generalmente el compilador
Java resuelve la invocacin de mtodos en tiempo de ejecucin, esto se llama enlace
tardo (late binding). Se puede usar el modificador final al declarar mtodos para
conseguir el enlace temprano.
Considere el Ejemplo 3.11. Se modificar el programa del Ejemplo 3.10, para ilustrar el
uso de final en la declaracin de mtodos para prevenir el sobrescribir.
Ejemplo 3.11
Libro 1: Core Java
Core Java
class X {
int a, b, c;
3.
4.
5.
X(int m, int n) {
a = m;
6.
7.
8.
b = n;
}
9.
10.
11.
12.
13. }
14.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30. }
int s = super.add();
c = s + d;
return (c);
}
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Core Java
Unidad 3: Herencia
Core Java
7) Cuando se usa el objeto de una subclase Y que deriva de una clase X, en una
clase externa Z, se puede hacer referencia a los mtodos de la clase X usando la
palabra clave super con el objeto de la clase Y.
a) Verdadero
b) Falso
8) A es la superclase de B, y B es la superclase de C. Cuando un objeto de C es
creado, cul es el orden en el que los constructores se invocan?
a) Slo el constructor de C es invocado
b) Constructor de C, Constructor de B, Constructor de A
c) Constructor de A, Constructor de B, Constructor de C
d) Constructor de A, Constructor de C
9) Cul es la palabra clave usada en Java para detener la sobrescritura de mtodos
en subclases?
a) static
b) stop
c) final
d) private
10) Cuando se usa la palabra clave final con una variable, sta no puede ser
ocultada por una subclase con una variable con el mismo nombre.
a) Verdadero
b) Falso
Core Java
Unidad 3: Herencia
Core Java
Core Java
Ejercicios de Laboratorio
1) Escribir un programa en Java, que tenga una clase llamada Color. La clase
Color tiene un atributo colorNombre que es privado y los siguientes mtodos,
final void setColor(String color);
String getColor();
Core Java
Core Java
1. Introduccin
Se estudi la herencia en Java en la Unidad 3 - Herencia. En esta unidad, se tratar el
tema de clases abstractas e interfaces, las cuales pueden usarse por la herencia.
2. Clases Abstractas
En todas las unidades anteriores, hasta la Unidad 3 Herencia, se han discutido
solamente las clases concretas. Estas clases se denominan as porque se pueden
instanciar objetos de ellas. Existe otro grupo de clases que no pueden instanciarse, se
denominan clases abstractas. Por lo tanto, el operador new no puede usarse en las
clases abstractas.
Las clases abstractas se usan para definir las caractersticas generales de un concepto
abstracto. Una clase abstracta se usa para definir los atributos comunes y el
comportamiento general de un grupo de clases. Las clases abstractas tienen las
definiciones de mtodos que justifican su comportamiento. Una clase abstracta puede
implementar algunos de los mtodos definidos en ella, obtenindose una
implementacin parcial de su comportamiento. Usualmente, no se implementa una gran
parte de la clase (no se da la implementacin de los mtodos), algunas veces, sin
embargo, las clases abstractas pueden implementar todos los mtodos definidos en
ella.
Las clases que heredan de una clase abstracta implementan los mtodos abstractos
definidos en esa clase. En caso de que la subclase no proporcione la implementacin
para todos los mtodos abstractos definidos en la clase abstracta, la subclase misma se
declara como una clase abstracta y la clase que herede de esta subclase abstracta
debe proporcionar la implementacin para sus mtodos abstractos. De lo contrario la
cadena de clases abstractas contina.
Se va a entender el concepto de clases abstractas con dos ejemplos generales.
Considere tres especies de mamferos: jirafas, delfines y ballenas, se pueden modelar
estas especies como clases de software: Jirafa, Delfin y Ballena. Se conoce el
aspecto de estos tres animales, y podemos visualizar cada uno de ellos.
Las jirafas, los delfines y las ballenas pertenecen a la categora llamada mamferos. Se
pueden representar las caractersticas de los mamferos en la forma de una clase
llamada Mamifero. Cundo se piensa en un mamfero se puede visualizar cmo
luce?, No, esto se debe a que un mamfero puede tener el aspecto de una jirafa, un
delfn o una ballena, en nuestro ejemplo. Una clase abstracta puede ser usada para
representar entidades que no pueden ser visualizadas. Mamifero puede ser una clase
abstracta, no se pueden crear instancias de Mamifero. Sin embargo, se pueden crear
instancias de sus subclases, llamadas, Jirafa, Delfin y Ballena.
Core Java
Una de las caractersticas comunes a los mamferos es que ellos dan a luz a sus
pequeos. Sin embargo, las jirafas, delfines y ballenas dan a luz a sus pequeos en
ambientes diferentes. Mientras la jirafa da a luz a su pequeo en tierra, un delfn y una
ballena dan a luz en el agua. Por lo tanto, la clase Mamifero se puede usar solo para
definir las caractersticas que ellos dan a luz a sus pequeos. No se puede usar para
definir donde ellos dan a luz a sus pequeos.
De la discusin anterior est claro que existen algunos patrones genricos de
comportamiento de entidades del mundo real que pueden ser abstrados en una sola
clase, la cual forma la clase base para la herencia. En el ejemplo anterior, Mamifero
es la clase abstracta, que forma la clase base, cuyos atributos y mtodos podrn ser
heredados por otras clases.
Considere otro ejemplo. El concepto de nmero es un concepto abstracto porque no
existe un objeto llamado nmero en la realidad, lo que se tiene en el mundo real son
enteros, nmeros reales, etc., que comparten caractersticas o propiedades comunes.
Estas caractersticas pueden ser abstradas en una clase llamada Numero, que forma la
clase base para las subclases Entero, Real, etc. La clase Numero se define como
clase abstracta, ya que existe tambin slo en abstraccin en el mundo real.
Los dos ejemplos que se han discutido muestran como las clases abstractas son tiles
para definir conceptos abstractos en Java. Otras clases concretas heredan de clases
abstractas para concretizar su definicin abstracta. Antes de avanzar ms en lo
concerniente a clases abstractas, se van a resumir las diferencias entre clases
abstractas y concretas.
para
Clases Concretas
generalizar
Core Java
Core Java
Los mtodos abstractos pueden estar presentes solamente dentro de una clase
abstracta. La siguiente es la estructura general de la declaracin de un mtodo
abstracto:
abstract tipoRetorno nombreMetodo(argumentos);
La palabra reservada abstract se usa antes de especificar el tipo de retorno del
mtodo. Se puede ver que el cuerpo del mtodo est ausente, lo que significa que la
implementacin del mtodo no se proporciona en la clase.
Una clase abstracta puede contener cualquier nmero de mtodos abstractos. Como se
mencion anteriormente, tambin es posible tener una clase abstracta que de la
implementacin para todos los mtodos definidas en ella y as no tenga ningn mtodo
abstracto. Cuando una clase es declarada como abstracta, no necesariamente debe
contener un mtodo abstracto. Sin embargo cuando existe un mtodo abstracto dentro
de la clase, la clase debe ser declarada como abstracta. Antes de avanzar con ejemplos
de clases y mtodos abstractos, se va a ver como una referencia se puede usar para
una clase abstracta.
Core Java
referenciaAbstracta.m1();
}
}
En el cdigo anterior, se crea una referencia referenciaAbstracta de la clase
Abstracta, a esta referencia se le pueden asignar referencias de subclases de
Abstracta. Esta caracterstica es muy til para lograr el polimorfismo. Usando
referenciaAbstracta en el cdigo anterior, se puede hacer referencia al mtodo
m1() definido en la clase abstracta.
Una vez aprendido como definir clases y mtodos abstractos, se va a considerar dos
clases llamadas CuentaDeAhorros y CuentaCorriente. La representacin grfica
de la clase CuentaDeAhorros y el cdigo Java que la implementa se muestra en la
Figura 5.2.
CuentaDeAhorros
numero:String
saldo:double
tasaInteres:double
cerrar():void
calcularIntereses():double
credito(double):void
debito(double):void
getSaldo():double
public
public
public
public
public
void cerrar() {}
double calcularIntereses() {}
void credito(double cantidad){}
void debito(double cantidad){}
double getSaldo() {}
CuentaCorriente
numero:String
saldo:double
comisionMensual:double
cargarComision():double
cerrar():void
credito(double):void
debito(double):void
getSaldo():double
public
public
public
public
public
double cargarComision() {}
void cerrar() {}
void credito(double cantidad){}
void debito(double cantidad){}
double getSaldo() {}
Core Java
Las similitudes entre estas clases permite definir una jerarqua de herencia.
Para estas clases, se puede crear una clase en comn llamada CuentaBancaria, que
tenga funciones definidas en ella, sin la implementacin, esta clase se convierte en
candidata para una clase abstracta.
El diagrama de la clase CuentaBancaria se muestra en la Figura 5.4. Las definiciones
abstractas estn en letra itlica.
Core Java
Se van a escribir dos programas Java que usan clases y mtodos abstractos.
Core Java
Ejemplo 5.1
Este ejemplo muestra como un mtodo abstracto se implementa en la subclase V.
El cdigo Java comienza aqu
1. /* Definicion de la clase U comienza aqui */
2. abstract class U {
3.
abstract void metodo1();
4.
5.
6.
void metodo2() {
System.out.println(
"Dentro de metodo2 en la clase U");
7.
}
8. }/* Definicion de la clase U termina aqui */
9.
10. /* Definicion de la clase V comienza aqui */
11. class V extends U {
12.
void metodo1() {
13.
14.
System.out.println(
"Dentro de metodo1 en la clase V");
15.
}
16. }/* Definicion de la clase V termina aqui */
17.
18. /* Definicion de la clase AbstractaEjemplo comienza aqui */
19. public class AbstractaEjemplo {
20.
/* El metodo main comienza aqui */
21.
22.
23.
24.
subClase.metodo2();
25.
}/* El metodo main termina aqui */
26. }/* Definicion de la clase AbstractaEjemplo termina aqui */
El cdigo Java termina aqu
La salida del programa anterior es la siguiente:
Dentro de metodo1 en la clase V
Dentro de metodo2 en la clase U
De la salida del programa anterior, se puede ver que a pesar de que no se cre un
objeto de la clase U, la clase V implcitamente tiene la implementacin para el metodo2.
Libro 1: Core Java
Core Java
float dimension2;
6.
7.
8.
Poligono(float x, float y) {
dimension1 = x;
dimension2 = y;
9.
10.
11.
}
abstract float area();
}
float area() {
21.
return (dimension1 * dimension2);
22.
}
23. }/* Definicion de la clase Cuadrado termina aqui */
24.
25. /* Definicion de la clase Triangulo comienza aqui */
Unidad 5: Clases Abstractas e Interfaces
Core Java
}
float area() {
32.
return ((float) 0.5 * dimension1 * dimension2);
33.
}
34. }/* Definicion de la clase Triangulo termina aqui */
35.
36. /* Definicion de la clase Cilindro comienza aqui */
37. class Cilindro extends Poligono {
38.
Cilindro(float radio, float altura) {
39.
super(radio, altura);
40.
41.
42.
43.
44.
45.
}
float area() {
return ((float) 3.14 * dimension1 *
dimension1 * dimension2);
}
55.
56.
57.
Poligono poligono;
58.
59.
System.out.println(
"Area del cuadrado es: " +
60.
61.
62.
poligono = cu;
poligono.area());
poligono = t;
Core Java
63.
64.
65.
System.out.println(
"Area del triangulo es: " +
poligono.area());
66.
67.
68.
poligono = ci;
System.out.println(
69.
70.
71.
Core Java
implementar una interfaz. Una clase concreta que implemente la interfaz tiene que
proveer la implementacin para todos los mtodos declarados en la interfaz.
Si la implementacin no se proporciona para aunque sea uno de los mtodos definidos
en la interfaz entonces la clase deber ser declarada como clase abstracta.
Una clase puede implementar cualquier nmero de interfaces. Tambin una misma
interfaz puede ser implementada por cualquier nmero de clases. Las interfaces
implementadas por una clase especifican la interfaz que puede ser usada para la
comunicacin entre la clase y otros objetos. Una interfaz puede extender de otra
interfaz, lo que significa que se puede crear una jerarqua de interfaces. Sin embargo,
una interfaz no puede implementar otra interfaz, ya que la implementacin no es
provista por ninguno de los mtodos declarados en la interfaz.
Clases no relacionadas pueden implementar la misma interfaz, introducindose cierta
relacin entre las clases, sta es una de las ventajas de usar interfaces. Todas las
funcionalidades requeridas por diferentes aplicaciones se guardan dentro de una
interfaz. Por lo tanto, las interfaces actan como sustitutos de la herencia mltiple.
La definicin de interfaz es similar a la definicin de clases. La estructura general se
muestra a continuacin:
modificadorDeAcceso interface nombreInterfaz {
tipoDeDato nombreVar1 = valor;
tipoDeDato nombreVar2 = valor;
.
.
.
tipoDeDato nombreVarN = valor;
tipoDeRetorno nombreMetodo1(listaDeArgumentos);
tipoDeRetorno nombreMetodo2(listaDeArgumentos);
.
.
.
tipoDeRetorno nombreMetodoN(listaDeArgumentos);
}
Usualmente, el modificadorDeAcceso usado es public, de lo contrario no es
mencionado. Cuando el modificadorDeAcceso no se menciona, se considera
package por defecto. Cuando una interfaz se declara como public, cualquier otra
interfaz o clase presente en cualquier paquete puede usarla.
El nombre de una interfaz se especifica en nombreInterfaz, que es un identificador
vlido. Las interfaces pueden declarar variables que son final y static. De tal
forma que, las clases que implementen la interfaz no pueden cambiar sus valores. Las
Libro 1: Core Java
Core Java
variables definidas en una interfaz deben ser inicializadas con un valor constante. Si la
interfaz se declara como public, todas las variables y mtodos en la interfaz tienen
acceso pblico.
Considere la Figura 5.8, que muestra la definicin de la interfaz List de Java 1.4.
La Figura 5.8 muestra la interfaz List definida en el paquete java.util, que es parte
del marco de trabajo para colecciones de Java. Se discute el marco de trabajo para
colecciones en el Volumen 8, Unidad 1 API Colecciones. Esta figura slo muestra
algunos de los mtodos ms usados de la interfaz List.
La Figura 5.9 presenta la definicin de la interfaz List de java 1.4 en formato UML
(Unified Modeling Language). UML es un lenguaje de modelacin para el anlisis y
diseo orientado a objetos.
Core Java
UML hace uso del estereotipo <<interface>> para indicar que List es una interfaz y
no una clase.
La Figura 5.10 muestra la clase Vector, que implementa la interfaz List.
Core Java
por un triangulo hueco, esta es la notacin UML para indicar que Vector implementa la
interfaz List.
Dos otras clases, LinkedList y ArrayList, implementan tambin List. De manera
que si se entiende la interfaz List, se puede fcilmente entender la operacin de las
clases Vector, LinkedList y ArrayList.
No es obligatorio para los mtodos definidos en una interfaz usar la palabra reservada
abstract, ya que todos los mtodos definidos en una interfaz son abstractos por
definicin.
El siguiente cdigo da un ejemplo de declaracin de interfaz:
interface ContestadorAutomatico {
void grabarMensaje(String mensaje);
String getMensajeGrabado();
}
Esta es una declaracin simple de interfaz con dos mtodos, getMensajeGrabado()
y grabarMensaje() en ella. Se debe notar que la implementacin de los mtodos no
se proporciona aqu. Las clases que implementen esta interfaz deben proporcionar la
implementacin de los mtodos. A continuacin se entender por qu se usan las
interfaces.
Core Java
Vector, una clase HashTable y cualquier otra clase que requiera el protocolo definido
en la interfaz List puede implementar la interfaz List. Los usuarios de estas clases
saben que todas las clases que implementen la interfaz List proveern los mtodos
add, contains, get, remove, isEmpty etc., porque la interfaz List declara estos
mtodos.
implementa
la
interfaz
String mensaje;
4.
5.
6.
7.
8.
9.
Core Java
10.
11.
12.
13.
14.
15.
16.
}/* El metodo getMensajeGrabado termina aqui */
17. }/* Definicion de la clase Telefono termina aqui */
El cdigo Java termina aqu
Se debe notar que los mtodos en la clase anterior Telefono se declaran como
public dado que implementan los mtodos de la interfaz ContestadorAutomatico.
El ejemplo anterior, muestra a la clase Telefono implementando los dos mtodos
declarados en la interfaz ContestadorAutomatico. Cuando se observa la
declaracin de la clase Telefono, se sabe que implementa la interfaz
ContestadorAutomatico, lo que asegura que los dos mtodos declarados en
ContestadorAutomatico sern implementados.
Tambin es posible que la clase Telefono desee definir otras funcionalidades adems
de los mtodos declarados en la interfaz, esto se ilustra en el siguiente extracto de
cdigo:
El cdigo Java comienza aqu
1. /* Definicion de la clase Telefono comienza aqui */
2. public class Telefono implements ContestadorAutomatico{
3.
4.
5.
String mensaje;
String mensajeSaludo = "Regreso despues de las 11pm";
String mensajeBasico = "Hola";
6.
7.
8.
String mensajeInterlocutor1;
String mensajeInterlocutor2;
boolean interlocutor1 = false;
9.
10.
11.
12.
13.
14.
15.
16.
Core Java
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
String recibirMensajeInterlocutor1() {
return(mensajeInterlocutor1);
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
return(mensajeInterlocutor2);
}/* El metodo recibirMensajeInterlocutor2 termina aqui */
40.
41.
42.
43.
}/* El metodo enviarMensajeInterlocutor2 termina aqui */
44. }/* Definicion de la clase Telefono termina aqui */
El cdigo Java termina aqu
El segmento de cdigo anterior muestra que la clase Telefono tiene otros mtodos,
son
estos,
recibirMensajeInterlocutor1(),
enviarMensajeInterlocutor1(), etc.
Fin del Ejemplo 5.3
A continuacin se muestra cmo se usa una referencia a una interfaz.
Core Java
10.
}/* El metodo main termina aqui */
11. }/* Definicion de la clase InterfazEjemplo termina aqui */
El cdigo Java termina aqu
La salida de este programa es la siguiente:
Mensaje Saludo: Regreso despues de las 11pm
Mensaje grabado: Llegare a las 11am Pedro
Mensaje recibido: Regreso despues de las 11pm
En este programa, a pesar que la variable ca se declara del tipo de la interfaz
ContestadorAutomatico, se le asigna el objeto de la clase Telefono. La variable
ca slo puede usarse para acceder a los mtodos definidos por la interfaz
ContestadorAutomatico.
Cualquier otro mtodo definido en la clase Phone no puede ser accedido por la variable
ca, a pesar de que es asignado el objeto de la clase Telefono. El programa dado no
ilustra el poder polimrfico de una variable de referencia de interfaz. Esto se muestra en
el siguiente cdigo:
El cdigo Java comienza aqu
1. /* Definicion de la clase Telefono2 comienza aqui */
2. class Telefono2 implements ContestadorAutomatico{
Unidad 5: Clases Abstractas e Interfaces
Core Java
3.
4.
5.
String mensaje;
String mensajeSaludo = "Regreso despues de 1 hora";
// . . .
6.
7.
8.
9.
10.
11.
System.out.println(
"Mensaje grabado en Telefono2: " +
mensaje);
12.
13.
this.mensaje = mensaje;
}/* El metodo grabarMensaje termina aqui */
14.
15.
16.
17.
18.
19.
System.out.println(
"Mensaje Saludo de Telefono2: " +
mensajeSaludo);
20.
return mensajeSaludo;
21.
}/* El metodo getMensajeGrabado termina aqui */
22. }/* Definicion de la clase Telefono2 termina aqui */
23.
24. /* Definicion de la clase InterfazEjemplo2 comienza aqui */
25. public class InterfazEjemplo2 {
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
mensaje = ca.getMensajeGrabado();
System.out.println("Mensaje recibido: " + mensaje);
ca.grabarMensaje("Nos encontramos a la 1 pm David");
Core Java
40.
}/* El metodo main termina aqui */
41. }/* Definicion de la clase InterfazEjemplo2 termina aqui */
El cdigo Java termina aqu
La salida del programa es la siguiente:
Mensaje Saludo: Regreso despues de las 11pm
Mensaje recibido: Regreso despues de las 11pm
Mensaje grabado: Nos encontramos a las 11am Pedro
Mensaje Saludo de Telefono2: Regreso despues de 1 hora
Mensaje recibido: Regreso despues de 1 hora
Mensaje grabado en Telefono2: Nos encontramos a la 1 pm David
Del programa anterior se puede ver que la versin de la implementacin de
ContestadorAutomatico llamada depende del tipo de objeto al que la variable ca
est haciendo referencia en tiempo de ejecucin.
Fin del Ejemplo 5.4
Cuando una clase implementa una interfaz, puede escoger proveer implementacin slo
para algunos de los mtodos declarados en la interfaz. Esta clase entonces debe ser
declarada como una clase abstracta, ya que slo se realiza una implementacin parcial
de la interfaz. Se muestra esto con un ejemplo.
Ejemplo 5.5
Este ejemplo ilustra como una clase que provee implementacin parcial de una interfaz,
resulta en una clase abstracta.
El cdigo Java comienza aqu
1. /* Definicion de la clase Telefono3 comienza aqui */
2. abstract public class Telefono3
3.
4.
5.
implements ContestadorAutomatico {
String mensajeSaludo = "Regreso despues de 1 hora";
6.
7.
8.
9.
10.
11.
12.
mensajeSaludo);
return mensajeSaludo;
Core Java
13.
}/* El metodo getMensajeGrabado termina aqui */
14. }/* Definicion de la clase Telefono3 termina aqui */
El cdigo Java termina aqu
La clase Telefono3 implementa slo el mtodo getMensajeGrabado() de la
interfaz ContestadorAutomatico. No implementa el mtodo grabarMensaje()
que est definido en la interfaz ContestadorAutomatico. Como Telefono3 slo da
una implementacin parcial de la interfaz ContestadorAutomatico, debe declararse
como una clase abstracta.
Fin del Ejemplo 5.5
Se discute a continuacin qu son las interfaces marcadoras.
Core Java
interface J {
void metodo1();
3.
4. }
5.
void metodo2();
6. interface K extends J {
7.
void metodo3();
8.
void metodo4();
9. }
10.
11. interface L extends K {
12.
13.
14. }
void metodo4();
void metodo6();
15.
16. interface M {
17.
void metodo6();
18. }
19.
20. /* Definicion de la clase InterfazEjemplo comienza aqui */
21. class InterfazPrueba implements L, M {
22.
/* El metodo metodo1 comienza aqui */
23.
public void metodo1() {
24.
25.
System.out.println("Dentro de metodo1");
}/* El metodo metodo1 termina aqui */
26.
27.
28.
29.
30.
31.
System.out.println("Dentro de metodo2");
}/* El metodo metodo2 termina aqui */
32.
33.
34.
35.
36.
Core Java
37.
38.
39.
40.
41.
42.
43.
44.
45.
57.
ip.metodo6();
58.
}/* El metodo main termina aqui */
59. }/* Definicion de la clase InterfazEjemplo termina aqui */
El cdigo Java termina aqu
La salida del programa anterior es la siguiente:
Dentro de metodo1
Dentro de metodo2
Dentro de metodo3
Dentro de metodo4
Dentro de metodo6
En este programa, se ve que la interfaz K y la interfaz L declaran el mismo mtodo
metodo4, a pesar que la interfaz L hereda el metodo4 definido por K. Esto es similar
a sobrescribir mtodos en el caso de clases. La clase InterfazPrueba implementa
las interfaces L y M. Esta clase tiene que proporcionar la implementacin de los
mtodos metodo1, metodo2, metodo3, metodo4 y metodo6, ya que la interfaz L
declara implcitamente todos los mtodos anteriores, dado que los hereda de las
interfaces J y K. Tanto la interfaz L como M declaran el mtodo metodo6, sin embargo
Libro 1: Core Java
Core Java
la clase InterfazPrueba tiene que proporcionar slo una implementacin del mtodo
metodo6, de otro modo ocurre un error de compilacin (duplicate method declaration
error). En caso de que la clase InterfazPrueba no proporcione implementacin para
alguno de los mtodos declarados en las interfaces que implementa, entonces tiene que
ser declarada como abstracta.
Fin del Ejemplo 5.6
Una vez discutidas las clases concretas, abstractas y las interfaces, se van a resumir
las opciones de herencia en Java.
Cuando una clase hereda de otra clase concreta, usa la palabra clave extends. La
superclase concreta puede ser instanciada y adems debe implementar todos los
mtodos definidos en ella. La superclase concreta puede tener variables de instancia
definidas en ella.
Cuando una clase hereda de una clase abstracta, usa la palabra reservada extends.
La superclase abstracta no puede ser instanciada, puede proveer implementacin para
algunos de los mtodos definidos en ella, aunque no se requiere que proporcione
implementaciones para ninguno de sus mtodos. La superclase abstracta puede tener
variables de instancia definidas en ella.
Core Java
Cuando una clase implementa una interfaz, usa la palabra reservada implements. Una
clase puede implementar mltiples interfaces. La interfaz no puede ser instanciada y no
provee implementacin para ninguno de los mtodos en ella. La interfaz no puede
definir variables de instancia.
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Core Java
Core Java
Core Java
Core Java
Usar interfaces.
Core Java
Ejercicios de Laboratorio
1) Escribir un programa en Java que tenga una clase abstracta llamada Fotografia
y una interfaz llamada Clicking. La interfaz Clicking tiene los siguientes
mtodos en ella.
Escena marcoFoto(Escena);
Escena focoFoto(Escena);
Camara setAbertura(Camara);
Camara setVelocidadObturador(Camara);
Camara setVelocidadPelicula(Camara);
Core Java
Core Java
Unidad 7: Paquetes
Objetivos de Aprendizaje
Al final de esta unidad, usted ser capaz de:
Core Java
1. Introduccin
En la unidad anterior, se explicaron las clases abstractas e interfaces en Java. En esta
unidad se aprender acerca de cmo las clases e interfaces pueden ser agrupadas
usando el concepto de paquetes.
Los paquetes son un medio para agrupar clases, interfaces y otros paquetes en una
categora particular.
Un paquete Java es como un directorio, permite de una manera segura almacenar una
clase dentro de l.
Un paquete es un contenedor que almacena la funcionalidad relacionada con clases e
interfaces y otros paquetes, proporcionando acceso protegido y manejo de nombres de
espacio. Un paquete es bsicamente un mecanismo provisto por Java que ayuda a
dividir el espacio de nombre de clase en bloques manejables. Es un mecanismo de
denominacin as como de control de visibilidad. Un paquete no puede tener dos clases
con el mismo nombre.
Se va a explicar la necesidad del uso de los paquetes y las tareas involucradas en el
uso de paquetes.
Unidad 7: Paquetes
Core Java
2.2 Clasificacin
Suponga que se tiene que desarrollar varias aplicaciones Java. Se deben crear clases
para realizar operaciones matemticas y operaciones de transferencias de archivos
para estas aplicaciones. Por lo tanto, puede ser til agrupar todas las clases
relacionadas a las funciones matemticas en un paquete y agrupar todas las clases
relacionadas con las transferencias de archivos en otro paquete. Este tipo de
clasificacin no solo nos ayudar a localizar una clase fcilmente, sino que permitir en
forma fcil reutilizar clases entre las aplicaciones Java.
2.3 Despliegue
Asuma que se tiene que desarrollar una aplicacin y entregarla al cliente. La aplicacin
completa comprende varios mdulos y por tanto se tendrn muchos archivos de clases
(.class). Todas las clases requeridas para desplegar un componente en particular de la
aplicacin pueden ser agrupadas bajo un paquete determinado, esto ayudar al
despliegue de los componentes fcilmente.
Libro 1: Core Java
Core Java
Core Java
universalmente nico no es buena idea, hay ciertos lineamientos que deben seguirse
para nombrar un paquete.
Los nombres de los paquetes deben ser jerrquicos. El nombre puede contener
ms de una parte separada por puntos.
Core Java
package directorio.lista.miembros;
Cuando se especifica un nombre de paquete en un archivo, todas las clases definidas
en el archivo pertenecen al paquete especificado. No es obligatorio tener una
instruccin de paquete antes de toda definicin de clase. Sin embargo, un archivo
solamente puede tener una instruccin de paquete.
Dentro de un programa Java, la instruccin de paquete aparece antes de las
instrucciones import, que se usan para importar las clases requeridas por la
aplicacin, como se muestra en la Figura 7.3.
Core Java
}
La clase C es compilada y colocada en la carpeta X\Y\ bajo algn directorio en el
sistema, por ejemplo:
C:\Ejemplos\x\y\C.class
As, los paquetes corresponden a la estructura fsica de carpetas. Una excepcin a esto
es cuando las clases son empaquetadas dentro de archivos JAR. Se aprender acerca
de archivos JAR en la Unidad 9 Caractersticas Avanzadas del Volumen 8.
El nombre del directorio debe coincidir con el nombre del paquete letra por letra. Esta
correspondencia es sensible a maysculas y minsculas.
Ms de un archivo puede incluir la misma instruccin de paquete, porque la instruccin
de paquete simplemente indica donde las clases definidas pertenecen, y no evita que
otras clases en otros archivos pertenezcan al mismo paquete. Las clases en los
desarrollos del mundo real estn usualmente repartidas en varios archivos. Por ejemplo,
considere el siguiente fragmento de cdigo:
package x.y;
public class AA {
}
class BB {
}
class CC {
}
Este cdigo se almacenar en un archivo llamado AA.class, que es diferente del
anterior C.class, pero ambos tienen la misma instruccin de paquete al comienzo, y
AA.class estar presente en la carpeta fsica C:\Ejemplos\x\y\. As, es posible
tener cualquier nmero de archivos con diferentes definiciones de clases perteneciendo
al mismo paquete. Todo lo que se necesita es el mismo nombre de paquete al inicio del
archivo.
Los paquetes pueden ser comparados a los directorios usados para almacenar archivos
en el sistema de archivos de un sistema de operativo. En el sistema de archivos, es
posible tener subdirectorios dentro de un directorio. Pueden existir subdirectorios con el
mismo nombre bajo diferentes directorios. Sin embargo, no se pueden tener dos
subdirectorios con el mismo nombre bajo un mismo directorio. Reglas similares son
aplicables para los paquetes.
Considere la Figura 7.4, que representa los paquetes en el directorio en forma de rbol.
El paquete representado en la figura es com.ibm.libreria.a, este paquete tiene dos
archivos: Texto.java y Texto.class.
Core Java
Asuma que hay un directorio llamado Root que tiene un subdirectorio llamado
MiDirectorio, que a su vez tiene otro subdirectorio llamado MiSubDirectorio.
Este subdirectorio tiene un archivo llamado miArchivo.txt. Se puede representar
esta estructura como sigue:
Root\MiDirectorio\MiSubDirectorio\miArchivo.txt
Considere una estructura de paquete que tenga un paquete raz com que tiene un
subpaquete ibm, que a su vez tenga otro subpaquete libreria, con dos subpaquetes
a y b. Esta estructura de paquete se puede representar como:
com.ibm.libreria.a
com.ibm.libreria.b
A continuacin se estudia como referenciar a las clases definidas en los paquetes.
Core Java
El programador tiene que tener en cuenta que la jerarqua de paquete tambin tiene que
ser mantenida en el sistema de archivos del desarrollo en Java.
Ahora, se estudiar como los paquetes ayudan a proteger el acceso a las clases.
Existen diversas formas de producir los diferentes niveles de acceso requeridos por las
categoras antes descritas.
Los tres especificadores de acceso, private, public y protected, proveen los
diferentes niveles de acceso. Cualquier miembro de clases declarado como public
puede ser accedido desde cualquier sitio.
Core Java
Un miembro en una clase sin especificacin de acceso explcita ser visible a las
subclases y otras clases dentro del mismo paquete. Cuando un elemento se declara
protected, ser visible fuera del paquete actual, pero slo para las clases que son
subclases de la clase actual. Cualquier miembro de clases declarado como private
no ser visto fuera de su clase. Estos modificadores de acceso aplican a los miembros
de las clases.
Una clase (no anidada) solo tiene dos posibles niveles de acceso: default y public.
Cuando no se indica el modificador de acceso en la declaracin de la clase, implica que
el nivel de acceso es el acceso por defecto. De aqu que todas las clases que son parte
del paquete donde la clase esta presente, tienen acceso al cdigo de esa clase. Si una
clase es declarada como public, puede ser accedida por cualquier cdigo fuera del
paquete. No se puede declarar una clase (no anidada) como protected o private.
Considere la Figura 7.6, donde se muestra un conjunto de clases en paquetes
diferentes.
Core Java
Desde la clase A los cuatro mtodos pueden ser accedidos: uno(), dos(),
tres() y cuatro().
Desde la clase B tres mtodos pueden accederse: uno(), dos(), y tres().
Desde la clase C dos mtodos pueden accederse: uno() y dos().
Desde la clase D solo un mtodo puede accederse: uno().
Desde la clase E tres mtodos pueden accederse: uno(), dos(), y tres().
Los mtodos declarados como protected en la clase A pueden accederse por
clases que sean subclases de A.
package paquete1;
8.
9.
10.
11.
12.
13.
public MiClase() {
System.out.println(
"Dentro del constructor de MiClase");
14.
15.
16.
System.out.println(
"variableDePaquete = " + variableDePaquete);
System.out.println(
17.
18.
19.
20.
21.
22.
System.out.println(
"variablePublica = " + variablePublica);
}/* Constructor MiClase termina aqui */
Core Java
public DeribadaDelMismoPaquete() {
System.out.println(
"Dentro del constructor de DeribadaDelMismoPaquete");
System.out.println(
34.
35.
36.
37.
38.
39.
40.
41.
42.
System.out.println(
"variableProtegida = " + variableProtegida);
43.
44.
45.
System.out.println(
"variablePublica = " + variablePublica);
46.
}/* Constructor DeribadaDelMismoPaquete termina aqui */
47. }/* Definicion de la clase termina aqui */
48. package paquete1;
49.
50. /* Definicion de la clase comienza aqui */
51. public class SinRelacionDelMismoPaquete {
52.
/* Constructor SinRelacionDelMismoPaquete comienza aqui */
53.
public SinRelacionDelMismoPaquete() {
54.
55.
56.
57.
58.
59.
Unidad 7: Paquetes
Core Java
60.
61.
62.
63.
64.
65.
66.
67.
68.
System.out.println(
"variableProtegida = " + mc.variableProtegida);
69.
70.
System.out.println(
71.
"variablePublica = " + mc.variablePublica);
72.
}/* Constructor SinRelacionDelMismoPaquete termina aqui */
73. }/* Definicion de la clase termina aqui */
74. package paquete2;
75.
76. import paquete1.*;
77.
78. /* Definicion de la clase comienza aqui */
79. public class DeribadaDeDiferentePaquete extends MiClase{
80.
/* Constructor DeribadaDeDiferentePaquete comienza aqui */
81.
public DeribadaDeDiferentePaquete() {
82.
83.
84.
System.out.println(
"Dentro del constructor de " +
"DeribadaDeDiferentePaquete");
85.
86.
87.
88.
89.
90.
//System.out.println(
//
"variableDePaquete = " + variableDePaquete);
91.
92.
93.
94.
95.
// System.out.println(
//
"variablePrivada = " + variablePrivada);
96.
System.out.println(
Core Java
97.
98.
99.
100.
"variablePublica = " + variablePublica);
101.
}/* Constructor DeribadaDeDiferentePaquete termina
*/
102. }/* Definicion de la clase termina aqui */
aqui
comienza
112.
113.
114.
System.out.println(
"Dentro del constructor de " +
"SinRelacionDeDiferentePaquete");
115.
116.
117.
118.
119.
120.
//System.out.println(
//
"variableDePaquete = " + mc.variableDePaquete);
121.
122.
123.
124.
125.
//
126.
127.
128.
129.
130.
131.
//System.out.println(
//
"variableProtegida = " + mc.variableProtegida);
Unidad 7: Paquetes
Core Java
132.
System.out.println(
133.
"variablePublica = " + mc.variablePublica);
134.
}/*
Constructor
SinRelacionDeDiferentePaquete
aqui*/
135. }/* Definicion de la clase termina aqui */
termina
146.
new SinRelacionDelMismoPaquete();
147.
}/* El metodo main termina aqui */
148. }/* Definicion de la clase MainPaquete1 termina aqui */
149. package paquete2;
150.
151. /* Definicion de la clase MainPaquete2 comienza aqui */
152. public class MainPaquete2{
153.
/* El metodo main comienza aqui */
154.
155.
156.
157.
158.
159.
SinRelacionDeDiferentePaquete srd =
new SinRelacionDeDiferentePaquete();
}/* El metodo main termina aqui */
Core Java
variableProtegida = 30
variablePublica = 40
Dentro del constructor de MiClase
variableDePaquete = 10
variablePrivada = 20
variableProtegida = 30
variablePublica = 40
Dentro del constructor de DeribadaDelMismoPaquete
variableDePaquete = 10
variableProtegida = 30
variablePublica = 40
Dentro del constructor de MiClase
variableDePaquete = 10
variablePrivada = 20
variableProtegida = 30
variablePublica = 40
Dentro del constructor de SinRelacionDelMismoPaquete
variableDePaquete = 10
variableProtegida = 30
variablePublica = 40
Core Java
De esta salida se puede ver que el constructor de la clase MiClase se invoca cada vez
que una clase intenta acceder a sus variables, sea una subclase o una clase no
relacionada.
Fin del Ejemplo 7.1
Se va a discutir a continuacin cmo usar las clases definidas en el mismo paquete.
Core Java
Una vez que la clase es importada, puede ser referida directamente por su nombre.
Debe tenerse en cuenta, sin embargo, que la sentencia import no es obligatoria para
el programador, es un mtodo conveniente de programacin.
En un archivo fuente de Java, la instruccin import viene inmediatamente despus de
la instruccin package, y antes de cualquier definicin de clase. A continuacin se da la
forma general de la instruccin import:
import paquete1[.paquete2].(nombreClase/*);
Aqu, paquete1 es el nombre del paquete de ms alto nivel y paquete2, es un
paquete subordinado dentro del paquete externo. La jerarqua de paquetes no tiene un
lmite de profundidad en la prctica, ms que el que impone el sistema de archivos.
Despus de paquete2, un nombre de clase explcito o (*) se especifica. Esto indica
que el compilador Java debe importar la clase especificada o el paquete completo.
Puede usarse en cualquiera de las siguientes formas, como se muestra a continuacin:
import java.util.Random;
o
import java.util.*;
En Java 5.0, se puede importar tanto las variables estticas como los mtodos estticos
que posee una clase. Esto nos ahorra colocar como prefijo el nombre de la clase que
posee la variable o mtodo esttico. A continuacin, se presenta un ejemplo.
Ejemplo 7.2
El siguiente programa ilustra el uso del import esttico.
El cdigo Java comienza aqu...
1.
2.
3. /* Definicion de la clase Principal comienza aqui */
4. public class Principal {
5.
6.
7.
8.
9.
10.
11.
}/* El metodo main termina aqui */
12. }/* Definicion de la clase Principal termina aqui */
La salida del cdigo anterior es esta:
PI(3.141592653589793) elevado a la 2 es: 9.869604401089358
Unidad 7: Paquetes
Core Java
Core Java
package paquete1;
2.
3. /* Definicion de la clase A comienza aqui */
4. public class A {
5.
6.
7.
System.out.println("Mensaje: " + mensaje);
8.
}
9. }/* Definicion de la clase A termina aqui */
10. package paquete2;
11.
12. /* Definicion de la clase B comienza aqui */
13. public class B {
14.
String mensaje = "Clase en paquete2";
15.
16.
17.
public B() {
System.out.println("Mensaje: " + mensaje);
}
31.
}/* El metodo main termina aqui */
32. }/* Definicion de la clase Principal termina aqui */
Unidad 7: Paquetes
Core Java
7. Agrupar Paquetes
Las clases Java se almacenan en paquetes en aplicaciones de tiempo real, estos
paquetes usan una estructura de rbol de directorios cuando son instalados. Es difcil
almacenar y manejar esta estructura de rbol del directorio de rbol debido a los
aspectos de almacenamiento y rendimiento a considerar. Por esto, la estructura de
rbol de directorios se almacena dentro de un archivo plano que preserva la estructura
del directorio. Los cargadores de clase, en el momento de cargar las clases
empaquetadas, extraen la estructura de rbol del directorio desde el archivo plano.
El empaquetado (archives) es ventajoso porque permite reducir los tiempos de carga de
las clases. Comprimen las clases y por tanto ocupan menos memoria; adicionalmente
permite tener una unidad pequea y sencilla para el despliegue (un nico archivo de
empaquetado).
El empaquetado que soporta la mayora de los ambientes de desarrollo Java es el JAR.
La mayora de las caractersticas de los JAR son similares a las de los archivos TAR
usados en UNIX. JAR comprime los datos usando un formato ZIP, que pueden ser
visualizados usando WinZip.
El cargador de clases de Java sabe como buscar otros dos tipos de empaquetados
archivos zip y cab. Pkzip, Winzip y otros programas crean archivos zip. Los archivos cab
son creados con el utilitario de Microsoft MAKECAB. cab es un acrnimo para archivos
cabinet, estos archivos se usan normalmente cuando se trabaja con la implementacin
Java de Microsoft, JView.
A continuacin se discute cmo el paquete es desplegado.
8. Despliegue de Paquetes
Un paquete puede ser desplegado como una nica unidad. Se puede tambin
empaquetar varios paquetes y desplegarlos juntos. Si un paquete tiene miembros
interdependientes con otros paquetes, entonces stos miembros interdependientes
deben ser desplegados juntos.
Libro 1: Core Java
Core Java
Unidad 7: Paquetes
Core Java
export CLASSPATH=ruta1:ruta2
Donde ruta1 y ruta2, se sustituyen por las rutas especficas de los paquetes que se
deseen incluir. Ntese que cada ruta esta separada por el carcter :
Tambin se puede especificar el classpath usando las opciones cp o classpath,
como sigue:
java cp c:\ilscs01\lib com.ibm.ils.prueba.EjecutarExamen
Esto ejecutar el mtodo main de la clase EjecutarExamen en el paquete
com.ibm.ils.prueba. El cargador de la clase buscar el paquete en
c:\ilscs01\lib.
Libro 1: Core Java
Core Java
Existen varios tipos de despliegue que una aplicacin Java puede usar. El tipo de
despliegue puede ser un subrbol de directorio, un jar o un zip. Los archivos de
clase (.class) pueden existir en el directorio, o como un archivo zip o como un archivo
JAR. Las tres opciones se pueden usar en la misma aplicacin Java y no necesitan
estar en el mismo directorio, siempre que estn disponibles en el classpath.
Se ha introducido el trmino classpath. Se va a aprender qu son y qu hacen en la
prxima seccin.
8.1 Qu es el classpath?
Un classpath almacena la ubicacin particular que ser usada por Java como la raz
de la jerarqua de paquetes. Aunque los paquetes resuelven problemas desde el punto
de vista de control de acceso y conflictos de nombres, tambin crean dificultades al
compilar y ejecutar programas.
Usualmente los programadores mantienen todas las clases en el paquete por defecto
(sin nombre). Esto les permite compilar el cdigo fuente y luego ejecutar el intrprete de
Java usando el nombre de la clase en la lnea de comandos. El paquete por defecto se
hace corresponder con la carpeta fsica que est en el directorio actual de trabajo
Esto es factible debido a que el directorio actual de trabajo, por defecto (.), est
usualmente en la variable de entorno classpath, que es definida por defecto por el
sistema de tiempo de ejecucin de Java. No sucede lo mismo con paquetes.
Asuma que un programador crea una clase llamada MiClase en el paquete
miDirectorio. Idealmente, la estructura de directorios debe coincidir con el nombre
del paquete. Por lo tanto, el programador crea un directorio llamado miDirectorio
bajo el directorio actual, para guardar el archivo MiClase.java en l. Luego compila
MiClase.java despus de hacer a miDirectorio su directorio actual.
MiClase.class est ahora guardado en miDirectorio. Ahora, cuando se ejecuta
MiClase, se muestra el siguiente mensaje de error:
Exception in thread "main" java.lang.NoClassDefFoundError: MiClase (wrong name:
miDirectorio/MiClase).
Esto ocurre porque la clase ahora est almacenada en un paquete llamado
miDirectorio, y ya no puede ser llamada simplemente MiClase.
En vez de eso, tiene que ser referida nombrando su jerarqua de paquetes, es decir,
como miDirectorio.MiClase. Sin embargo, an esto mostrar un mensaje de error:
Exception in thread "main" java.lang.NoClassDefFoundError:
miDirectorio/MiClase.
La razn para esto estriba en la definicin de la variable classpath del sistema del
programador. El classpath, como se sabe, establece el tope de la jerarqua de clase.
Unidad 7: Paquetes
Core Java
package inversiones;
float calcularInteres(
float principio,
float anos,
float tarifa) {
return (float) principio * anos * tarifa / 100;
12.
}/* El metodo calcularInteres termina aqui */
13. }/* Definicion de la clase Interes termina aqui */
14. package inversiones;
15.
16. /* Definicion de la clase Inversionista comienza aqui */
17. public class Inversionista {
18.
/* El metodo main comienza aqui */
19.
public static void main(String[] args) {
20.
21.
float p, a, t, si;
p = (float) (Math.random() * 100000);
Core Java
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Unidad 7: Paquetes
Core Java
9.1 java.awt
Se pueden usar las clases que estn disponibles en el paquete java.awt para disear
interfaces de usuario para aplicaciones, son tambin tiles cuando se usan grficos e
imgenes en las aplicaciones.
9.2 java.applet
Las clases disponibles en el paquete java.applet definen las caractersticas de los
applets de Java y permite que se programen. Estas clases tambin permiten que un
applet se comunique con su contexto de applet. El contexto del applet es la aplicacin
que carga y corre el applet. El marco de trabajo de applets comprende el applet y el
contexto del applet.
9.3 java.beans
Los componentes Java beans son reutilizables y ampliamente usados en aplicaciones y
applets Java. Para el desarrollo y ejecucin de estos componentes reutilizables se
deben usar las clases disponibles en el paquete java.beans.
9.4 java.io
Se puede obtener entrada del usuario del teclado usando flujos de entrada,
adicionalmente se puede enviar la salida al monitor usando flujos de salida. Estos flujos
tambin son tiles durante la serializacin y la deserealizacin de objetos, as como
cuando se lee de o se escribe a un archivo. Las clases en java.io definen los
diferentes flujos de entrada y salida usados para las funciones descritas anteriormente.
Core Java
9.5 java.lang
El paquete java.lang tiene las clases que proveen la funcionalidad bsica de Java.
Este paquete tiene la clase Object, que es la superclase de todas las otras clases en
Java. Algunos mtodos en esta clase proveen implementaciones estndares de
algoritmos para equals(), hashCode(), y toString(). Este paquete tambin tiene
la clase Math, que proporciona la implementacin estndar para muchas funciones
matemticas tiles como: raz cuadrada, exponente, seno, coseno, tangente, etc. Las
clases String y StringBuffer de este paquete tienen varias operaciones que
pueden realizarse sobre cadenas de caracteres.
Puede haber situaciones cuando los tipos de datos primitivos como integer, float,
double, etc. se necesitan en la forma de objeto, para esto se tiene las clases
envolventes (wrapper), que tienen un campo para almacenar el valor del tipo de dato
primitivo.
Este paquete tiene la clase Throwable, que es la raz de todas las clases de errores y
excepciones. Este paquete tiene tambin muchas clases que permiten realizar
operaciones de sistema, como aplicar las polticas de seguridad, crear procesos
externos, etc.
9.6 java.util
Este paquete tiene esencialmente varias clases utilitarias que hacen el esfuerzo de la
programacin ms simple; tiene clases que soportan el modelo de evento, que se usa
en las interfaces de usuario de las aplicaciones. Tambin tiene el marco de trabajo
Collections, que permite manejar una coleccin (grupo) de objetos. Algunas de las
clases utilitarias disponibles en el paquete java.util permiten generar nmeros
aleatorios, buscar la fecha y hora local de acuerdo a la regin de la fecha y hora del
sistema, etc. Provee la clase Vector que almacena una coleccin de referencias a
objetos, puede variar en tamao y contener objetos de diferentes tipos.
9.7 java.math
El paquete math en Java contiene clases que nos ayudan a trabajar con aritmtica
sobre nmeros enteros y decimales de precisin arbitraria. Provee dos clases
BigInteger para enteros y BigDecimal para nmeros decimales.
9.8 java.text
Este paquete contiene clases para manipular texto, fechas, nmeros y mensajes. Las
clases estn diseadas para trabajar independientemente del lenguaje natural usado.
Algunas de las clases provistas en este paquete son: Annotation, DateFormat,
NumberFormat, MessageFormat, etc. Tambin proporciona dos interfaces que
realizan recorridos sobre datos textos.
Unidad 7: Paquetes
Core Java
9.9 java.net
Este paquete tiene varias clases que permiten construir aplicaciones en red. Usando las
clases Socket y ServerSocket se pueden implementar un sistema cliente/servidor.
Se pueden desarrollar aplicaciones para que un cliente se comunique con cualquier
servidor disponible en la Internet. Tambin, se pueden desarrollador aplicaciones para
un servidor y host en la Internet. La clase URL y otras clases relacionadas permiten
enviar datos a un URL as como recibir datos fcilmente.
9.10 java.rmi
La Invocacin a Mtodos Remota (Remote Method Invocation RMI) permite a un objeto
ejecutndose en una JVM invocar a un mtodo de otro objeto (objeto remoto) que se
est ejecutando en una JVM diferente.
Core Java
Resumen
Ahora que ha completado esta unidad, usted debe ser capaz de:
Unidad 7: Paquetes
Core Java
Core Java
Unidad 7: Paquetes
Core Java