Sunteți pe pagina 1din 66

Pontificia Universidad Católica del Perú

Dirección de Informática Académica


Instituto de Informática

1 Curso de Extensión

PROGRAMACIÓN EN J A V A
Java es en la actualidad el lenguaje orientado a objetos más utilizado en el desarrollo de
aplicaciones de ámbito empresarial, principalmente aquellas que manejen datos en red. Es un
lenguaje muy completo que incluye una gran cantidad de funcionalidades; y en este curso se
estudiarán fes más representativas para un nivel introductorio en este programa.
' «s* i I > • ñgi
Este curso está áiseñado'?fára^pTOgramadores con conodmientos suficientes de metodología de la
programación y de programación orientada a objetos que deseen introducirse en este lenguaje
multiplataforma con el que se puedeh realizar las más diversas aplicaciones, tanto para PC como |
para Internet y comercio electrónico. | | j| M’]

f A l O na
u M icrosoft.

Adobe AutoCAD aa0ff££ .llf f t jAVf


Pontificia Universidad Católica del Perú
Dirección de Informática Académica
Instituto de Informática

Curso de Extensión

PROGRAMACIÓN EN J A V A
Java es en la actualidad el lenguaje orientado a objetos más utilizado en el desarrollo de
aplicaciones de ámbito empresarial, principalmente aquellas que manejen datos en red Es un
lenguaje muy completo que incluye una gran cantidad de funcionalidades; y en este curso se
estudiarán í ¡ ! más representativas para un nivel introductorio en este programa.

Este curso está díseñado para programadores con conocimientos suficientes de metodolog la de la
programación y de programación orientada a objetos que deseen introducirse en este lenguaje
multiplataforma con el que se pueden realizar las más diversas aplicaciones, tanto para PC como
para Internet y comercio electrónico.

f A l K r f Micros o ft.
Adobe AutoCAD LjJ°ff^ .ñ S t EViewsS
INFOPUC
INSTITUTO DE INFORMÁTICA

p o n t if ic ia UNIVERSIDAD CATÓ LICA DEL perú

Apreciad@ participante,

Es grato dirigirnos a Usted para saludarle y a la vez darle la cordial bienvenida


al Instituto de Informática de la Pontificia Universidad Católica del Perú -
InfoPUC.

En esta oportunidad usted se integra a nuestra familia del InfoPUC por medio
del curso de extrensión: Programación en JAVA. Durante su permanencia en
el InfoPUC le pedimos el mayor compromiso para este curso de extensión, el
cual ha sido diseñado con un enfoque eminentemente práctico, con casos
reales que complementan el aprendizaje de las herramientas de computación y
enfocados al quehacer del profesional que las empresas requieren.

Sin más por el momento nos despedimos, confiando en que lo aprendido en


este curso, y en los futuros cursos que desee llevar con nosotros, le serán de
gran utilidad en su desempeño profesional.

Atentamente,

Francisc , /ásquez
Director del Instituto de
Inform ática
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

p o n tific ia UNIVERSIDAD C A T Ó L IC A D a PF.RÚ

Capítulo 1
Introducción a Java

1. ¿Qué es Java?
2. Ventajas frente a otros lenguajes
3. Comparación con otros lenguajes
4. Características de Java
5. Historia de Java
6. Componentes de Java2 SDK
7. La maquina virtual de Java
8. Áreas de la maquina virtual de Java
9. Compiladores JIT
10. La arquitectura neutral de Java
11. Paquetes - las librerías de clases
12. Malentendidos comunes sobre Java
JAVA Inicial ►IN F O P U C
INSTITUTO D£ INFORMÁTICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A del f


JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A c

1. ¿Qué es Java?

Java es un lenguaje de programación orientado a objetos, desarrollado por Sun


Microsystems.

Es un lenguaje de propósito general que puede ser empleado para desarrollar


cualquier tipo de aplicación principalmente aquellas referidas a Internet.

Es una máquina virtual que puede ser incrustada en navegadores y en sistemas


operativos.

Es un conjunto de Librerías de Clases Estandarizadas (paquetes) que soportan:


• Creación de interfaces gráficas de usuario.
• Comunicación en redes.
• Control y manejo de multimedia.

2. Ventajas frente a otros lenguajes

JAVA ES MEJOR MÁS POR LO QUE NO TIENE, QUE POR LO QUE TIENE!!

• Variables Globales (expuestas a todos)


En Java, el único espacio de nombres global es la jerarquía de clases. No es
posible crear una variable global que esté fuera de todas las clases.

• GoTo (para hacer tallarines)


Java reserva goto como palabra clave para EVITAR que los programadores
la utilicen de manera confusa. Por el contrario, tiene un concepto de
sentencias break y continué etiquetadas para cubrir los únicos usos
importantes del goto.

• Punteros (mentirosos y peligrosos)


A pesar que los descriptores de objetos de Java están implementados como
punteros, Java no tiene la capacidad de manipular punteros directamente,
impidiendo que puedan referenciarse direcciones de memoria de manera
arbitraria. Con esto impide lo que otros lenguajes (como C++) permiten: que
no existan datos privados de verdad.

• Asignación de memoria (buscando un sitio)


En C++ hay que preocuparse por la gestión de la memoria.
malloc() y new() asignan una cantidad de memoria (bytes) devolviendo la
dirección del bloque correspondiente.
free() y deleteQ liberan un bloque, para que esté disponible por el sistema
nuevamente.
JAVA Inicial INFOPUC
■ # INSTITUTO DE ¡NFORMÁTiCA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A d e l p er ú

3. Comparación con otros lenguajes

En Java cualquier estructura de datos compleja es un objeto que se crea a


través del operador new, que le asigna una cantidad de memoria de un
"montículo", por lo que el programador no debe preocuparse en una
secuencia de direcciones ascendentes. El operador de Java new obtiene,
más que una dirección de memoria, un "descriptor" de objeto, de manera que
el programador no debe preocuparse por ubicaciones. Incluso la memoria
real asignada a un objeto podría moverse en tiempo de ejecución y esto sería
transparente. Asimismo existe la facilidad para que el programador se
despreocupe de la devolución de memoria al sistema ya que en Java cuando
no existe referencia alguna a un objeto, la memoria que está ocupando queda
disponible. A esta facilidad se le denomina "recojo automático de basura"
(aunque un mejor término hubiera sido "reciclado permanente").

• Tipos de datos frágiles (dependencia del procesador)


Java eligió tamaños adecuados para todos los tipos numéricos de manera de
garantizar resultados independientes de la plataforma de hardware. La mayor
parte de los lenguajes hacen depender la implementación de los tipos al
tamaño natural de "palabra" de la máquina, diferenciándolos así de acuerdo
al procesador.

• Conversión de tipos (insegura)


Como los descriptores de objetos de Java incluyen información de la clase a
la que pertenecen, puede hacerse comprobaciones de compatibilidad de
tipos en tiempo de ejecución y controlarlo con excepciones. En C++ no hay
forma de detectar esto en tiempo de ejecución, pues los objetos son
simplemente punteros a direcciones de memoria. Algo parecido sucede con
las listas de argumentos de longitud variable donde la comprobación de tipos
queda bajo responsabilidad del programador.

• Archivos de cabecera (descabezados)


El lugar natural para la información de una clase es el mismo archivo
compilado. En Java no hay archivos de cabecera. El tipo y visibilidad de los
miembros de la clase se compilan en el archivo de la clase.

C++, al tener archivos de cabecera (compilados separados que contienen las


características o "prototipo" de una clase) permite la posibilidad de tener una
o más versiones distintas a la verdadera clase implementada. Como si esto
fuera poco, puesto que la interfaz a un programador a una clase compilada
es su archivo de cabecera, la clase está tan expuesta como para incluso
convertir datos privados en públicos.

• Preprocesador (innecesario)
Los compiladores de C y C++ recurren al preprocesador, que se encarga de
buscar comandos especiales (que empiezan con #).
JAVA Inicia)
PONTIFICIA
♦ INFOPUC
IN STITUTO D6 INFORMATICA

UNIVERSIDAD C A T Ó L IC A del PERÚ

Java no requiere de un preprocesador; dispone de una palabra clave final


para declarar constantes (en vez de usar#define).

Las características orientadas a objetos de Java son comparables con las de


C++. Una de las mayores diferencias entre Java y C++ radica en la herencia
múltiple (para lo cual Java ha encontrado una mejor solución).

Todo en Java (excepto tipos básicos como números) son objetos y clases, no
existe el concepto de estructuras de datos.

En resumen, Java:

• Es el siguiente paso al lenguaje C++.

• Soporta librerías de clases como C++.

• Es multípropósito como C o C++.

• Tiene, a diferencia de C++, un modelo de punteros que elimina la posibilidad


de sobrescribir la memoria o corromper la data.

• Soporta la mayoría de propiedades de un lenguaje orientado a objetos.

• Permite le creación de pantallas dinámicas. Existen herramientas como


Eclipse y Netbeans que permiten el desarrollo visual de aplicaciones.

• Soporta componentes especializados reutilizables: JavaBeans, los que son


comparables con ActiveX.

• Maneja programación concurrente.

• Controla excepciones como C++.

• Enlaza código en forma dinámica como Lisp.

• Permite definir interfaces como Objetive C.

• Administra en forma automática la asignación dinámica de memoria como


Lisp.

• Tiene sentencias simples como C.

• Genera código compacto como ensamblador.


JAVA Inicial
p o n t i f ic ia
♦ INFOPUC
IN STITUTO DE INFORMATICA

UNIVERSIDAD C A T Ó L IC A d e l p er ú

4. Características de Java

Simple
Java ha sido diseñado de modo cercano a C++, omitiendo características
confusas de éste, con el objeto de hacerlo un sistema más comprensible. La
sintaxis de Java es una versión más clara de la sintaxis de C++. No existe la
necesidad de usar archivos de cabecera, aritmética de punteros, estructuras,
uniones, sobrecarga de operadores, etc.

Tiene conceptos básicos de programación orientada a objetos, lo que


proporciona un paradigma de simplicidad, pero a su vez permite llegar a un nivel
lo suficientemente bajo (detalle) como para poder realizar casi cualquier cosa.

Uno de los grandes logros de Java que lo hace simple es que es pequeño. Java
puede desarrollar software que puede correr stand-alone en máquinas
pequeñas.

Seguro
Dado que Java ha sido implementado para ser usado en ambientes distribuidos
y de trabajo en red, se ha puesto gran empeño en lo que a seguridad se refiere.

Los programas de Java no pueden llamar a funciones globales y acceder a


recursos del sistema de manera arbitraria. Es decir, se puede ejercer un control
sobre los programas ejecutables de Java, lo que no es posible en otros sistemas.

No se puede corromper memoria fuera del espacio en el que corre el proceso.

Distribuido
Java posee librerías que permiten trabajar de manera sencilla con protocolos
TCP/IP tales como HTTP y FTP. Las aplicaciones Java pueden abrir y acceder
objetos que se encuentren en la red via URLs, de un modo tan simple como
acceder a un sistema local de archivos.

Las capacidades de trabajar con Java en la red son diversas y fáciles de usar.

Robusto
Java posee buena capacidad para la verificación de errores. No posee un
modelo de manejo de punteros lo cual no le permite sobrescribir la memoria ni
corromper la data.

Java verifica el código mientras se escribe y una vez más antes de ejecutarlo.
Esto permite que el programa se comporte de un manera predecible, bajo
diversas condiciones.
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A del PERÚ

Java ayuda a evitar fallas por condiciones excepcionales (división por cero,
acceso a un archivo no existente, etc.) mediante un manejo de excepciones
orientado a objetos integrados.

Java prácticamente elimina la posibilidad de falla en la gestión de memoria (no


liberarla o, peor aún, liberar aquella que no corresponde) mediante la facilidad de
“recojo de basura”.

Arquitectura Neutral
Cuando se diseñó Java se tomaron consideraciones, tanto para el lenguaje
como para el intérprete, de manera que un programa pueda “escribirse una sola
vez, ejecutarse en cualquier sitio, en cualquier momento y para siempre”.

Es multiplataforma: Solaris, Iris, Linux, HP/UX, OSF, Windows 95, Windows NT,
OS/2, Macintosh.

Interpretado y de alto rendimiento


Java compila a una representación intermedia llamada “código de byte”, el que
se puede interpretar en cualquier sistema que tenga un intérprete de Java. Este
código de byte fue diseñado de tal manera que sea sencilla la necesaria
traducción a código de máquina nativo. Con esto se logró que un intérprete sea
de alto rendimiento.

Cada parte de un programa Java se reduce a una secuencia de bytes que


representan instrucciones en una “máquina virtual” y no en una máquina
(procesador) específica.

Interactivo
Java tiene varias características que permiten escribir programas que hacen
muchas cosas al instante, sin perder el control de lo que debería suceder y
cuándo. El intérprete de Java soluciona esta necesidad de sincronización entre
múltiples procesos con “hilos múltiples” de sencilla utilización, que permiten
pensar en el comportamiento específico, sin tener que integrarlo en el clásico
modelo de programación global de “bucle para el evento”.

Óptimo para Internet


TCP/IP: Java provee clases para gestionar limpiamente protocolos de Internet.
Incluye implementaciones de ftp, http, nntp, smtp junto con conectores de red de
bajo nivel (sockets).

WWW y HTML: Java está diseñado para cumplir los requisitos de entrega de
contenidos interactivos usando applets insertadas en sus páginas HTML. Las
clases básicas de manejo de cadenas son especialmente adecuadas para el tipo
de manejo de texto basado en HTML.
JAVA Inicial
PONTIFICIA
<► INFOPUC
IN STITUTO DE INFORMATICA

UNIVERSIDAD C A T Ó L IC A DEL PERÚ

5. Historia de Java

1992:
La compañía Sun Microsystems lleva a cabo el proyecto “Green” para comunicar
diversos aparatos o dispositivos electrónicos.

El prototipo era un sistema operativo distribuido “Star7” donde cada dispositivo


era parte del todo.

Se crea el lenguaje “OAK”, un intérprete para este y clases con este lenguaje
para la GUI.

1993:
(Marzo) FirstPerson, susbsidiaria de Sun, responde a una petición de ofertas
para el proyecto de televisión interactiva de la compañía Time Warner, requerían
un pequeño sistema operativo en microcódigo, orientado a objetos, capaz de
suminsitrar flujos de video MPEG sobre redes ATM. Sun pierde este negocio y
tampoco llega a un acuerdo con otra Cia. de televisión por cable: 3DO.

1994:
Sun implementa un browser de Web, al que llamaron “WebRunner” que podía
ejecutar clases transferidas desde un servidor HTTP.

El 1er. Applet: la mascota “Duke” aparece saludando desde una página web.

1995:
En enero renombran a Oak por Java y a WebRunner por HotJava. En noviembre
aparece en la Web la 1ra. versión beta oficial: JDK 1.0

1996:
En diciembre se libera JDK 1.1.

1998:
En diciembre se lanza JDK 1.2 al cual se le conoce como Java2.

2001:

Más de 1 millón de descargas de Java Platform, Enterprise Edition (Java EE)


SDK.
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

p o n t if ic ia UNIVERSIDAD C A T Ó L IC A del PERÚ

2002 :
Las descargas de J2EE SDK llegan a los 2 millones.
2003:
La tecnología Java esta en casi 550 millones de computadoras de escritorio.
Casi el 75% de desabolladores profesionales usan Java como su lenguaje
primario de programación.

2004:
Se lanza JDK 5.

2005:
Aproximadamente 4.5 millones de desabolladores usan tecnología Java.
Más de 2.5 mil millones de dispositivos compatibles con Java están disponibles.

6. Componentes de Java2 SDK

Existen diversas aplicaciones que se encuentran en el Java Standard


Development Kit (JSDK) que permiten realizar diferentes funciones. Las dos
herramientas principales son:

• javac: Es el compilador Java por excelencia, es un compilador de línea de


comandos, que permite crear programas y applets en Java. Compila
código java a bytecodes.

• java: Es el intérprete que permite ejecutar las aplicaciones desarrolladas


en Java.

El JSDK también incluye:


• javap: Es un descompilador que permite ver el contenido de las clases
compiladas.
• javadoc: Produce documentación HTML a partir del código fuente.
• javah: Crea el encabezado para el enlace con otros lenguajes.
• jdb: Depurador (debugger).
• appletviewer: Es un visualizador de applets, con esto ya no es necesario cargar
los applets en un browser.
• keytool: Crea pares de claves usadas para “firmar” y autentificar programas.
• policytool: Define los criterios de autentificación y las funciones permitidas para
programas confiables.
• jar: crea un archivo que contiene a otros.
• jarsigner: prepara archivos jar para ser autentificados.
• native2ascii: convierte un archivo nativo a un Unicode.
JAVA Inicial
PONTIFICIA
<► INFOPUC
IN STITUTO DE INFORMATICA

UNIVERSIDAD C A T Ó L IC A DEL PERÚ

rmic: crea el esqueleto para RMI.


rmiregistry: inicia el registro remoto de objetos.

7. La maquina virtual de Java

Una máquina virtual es el procesador en el cual se ejecuta el código (bytecode)


de Java. Es un conjunto de instrucciones que entiende al intérprete de Java.

El compilador javac produce los bytecodes a partir del archivo fuente .java. Los
bytecodes corresponden al lenguaje de la máquina virtual.

La máquina virtual no corresponde a un sistema operativo o plataforma de


hardware en particular, el archivo .class es portable a cualquier implementación
de la máquina virtual.

La máquina virtual puede ser integrada (incrustada) dentro de otro ambiente tal
como un web browser o un sistema operativo.

La máquina virtual utiliza un verificador de bytecode cuando se leen los


bytecodes.

8. Áreas de la maquina virtual de Java

STATIC
Las variables o métodos que son especificados mediante la palabra reservada
STATIC son ubicadas en esta área. Los elementos estáticos son cargados sólo
una vez al momento que la clase es instanciada por primera vez o cuando la
variable o método estático son referenciados por primera vez.

STACK
Las variables locales declaradas dentro de un método (incluyendo los
parámetros de los métodos) son alojadas en esta área. Las variables locales son
almacenadas cuando el método es ingresado.

HEAP
Todos los objetos son instanciados en esta área denominada de
almacenamiento dinámico. Un objeto es instanciado desde las partes no-
estáticas de una clase. Cuando un objeto es recogido por el colector de basura
es el heap quien es retornado al sistema.
JAVA Inicial INFOPUC
| £ | g | g !| j| § P ’ IN STITUTO DE INFORMATICA

PO NTIHC1A UNIVERSIDAD C A T Ó L IC A DEL p e r ú

2002:
Las descargas de J2EE SDK llegan a los 2 millones.
2003:
La tecnología Java esta en casi 550 millones de computadoras de escritorio.
Casi el 75% de desabolladores profesionales usan Java como su lenguaje
primario de programación.

2004:
Se lanza JDK 5.

2005:
Aproximadamente 4.5 millones de desarrolladores usan tecnología Java.
Más de 2.5 mil millones de dispositivos compatibles con Java están disponibles.

6. Componentes de Java2 SDK

Existen diversas aplicaciones que se encuentran en el Java Standard


Development Kit (JSDK) que permiten realizar diferentes funciones. Las dos
herramientas principales son:

• javac: Es el compilador Java por excelencia, es un compilador de línea de


comandos, que permite crear programas y applets en Java. Compila
código java a bytecodes.

• java: Es el intérprete que permite ejecutar las aplicaciones desarrolladas


en Java.

El JSDK también incluye:


• javap: Es un descompilador que permite ver el contenido de las clases
compiladas.
• javadoc: Produce documentación HTML a partir del código fuente.
• javah: Crea el encabezado para el enlace con otros lenguajes.
• jdb: Depurador (debugger).
• appletviewer: Es un visualizador de applets, con esto ya no es necesario cargar
los applets en un browser.
• keytool: Crea pares de claves usadas para “firmar” y autentificar programas.
• policytool: Define los criterios de autentificación y las funciones permitidas para
programas confiables.
• jar: crea un archivo que contiene a otros.
• jarsigner: prepara archivos jar para ser autentificados.
• native2ascii: convierte un archivo nativo a un Unicode.
JAVA inicial Í.6 B B v^ I L f
IN F O P U C
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A del perú

• rmic: crea el esqueleto para RMI.


• rmiregistry: inicia el registro remoto de objetos.

7. La maquina virtual de Java

Una máquina virtual es el procesador en el cual se ejecuta el código (bytecode)


de Java. Es un conjunto de instrucciones que entiende al intérprete de Java.

El compilador javac produce los bytecodes a partir del archivo fuente .java. Los
bytecodes corresponden al lenguaje de la máquina virtual.

La máquina virtual no corresponde a un sistema operativo o plataforma de


hardware en particular, el archivo .class es portable a cualquier implementación
de la máquina virtual.

La máquina virtual puede ser integrada (incrustada) dentro de otro ambiente tal
como un web browser o un sistema operativo.

La máquina virtual utiliza un verificador de bytecode cuando se leen los


bytecodes.

8. Áreas de la maquina virtual de Java

STATIC
Las variables o métodos que son especificados mediante la palabra reservada
STATIC son ubicadas en esta área. Los elementos estáticos son cargados sólo
una vez al momento que la clase es instanciada por primera vez o cuando la
variable o método estático son referenciados por primera vez.

STACK
Las variables locales declaradas dentro de un método (incluyendo los
parámetros de los métodos) son alojadas en esta área. Las variables locales son
almacenadas cuando el método es ingresado.

HEAP
Todos los objetos son instanciados en esta área denominada de
almacenamiento dinámico. Un objeto es instanciado desde las partes no-
estáticas de una clase. Cuando un objeto es recogido por el colector de basura
es el heap quien es retornado al sistema.
JAVA Inicial
PONTIFICIA
<► INFOPUC
INSTITUTO DE INFORMATICA

UNIVERSIDAD C A T Ó L IC A del PERÚ

9. Compiladores JIT

Aún cuando Java es interpretado, compiladores Just In Time (J.I.T.) ofrecen del
lado del cliente compilación de bytecodes a código máquina (instrucciones
binarias nativas).

Estos compiladores mejoran la performance para un hardware específico.

Si se utiliza el intérprete estándar de Java no se puede hablar de “alta


performance”.

Si se conoce con seguridad de que la aplicación desarrollada será puesta en una


máquina específica existen compiladores de Java disponibles, los cuales
compilan los bytecodes a código nativo una vez, guardan el resultado y lo llaman
cada vez que sea necesario.

Esta tecnología se está mejorando continuamente y puede llegar a resultados


que no van a ser superados fácilmente por un compilador tradicional.

Un compilador JIT puede monitorear qué código se ejecuta frecuentemente y


optimizar ese código para obtener mayor velocidad.

10. La arquitectura neutral de Java

El problema de la incompatibilidad de plataformas

Un programa funciona sólo en la plataforma para la cual fue diseñado.

Se han normalizado algunos lenguajes de programación (por ejemplo ANSI C)


con lo que se mantiene cierta compatibilidad, sin embargo siempre es necesaria
la recompilación del código fuente.

Cada fabricante agrega funcionalidad no estándar a un lenguaje de


programación. Cada sistema operativo restringe a los programas en los servicios
y capacidades de los mismos.

En general todo programa se tiene que rehacer o adaptar para que funcione en
una plataforma diferente para la que se diseñó.

La estrategia de Java

Java fue diseñado para funcionar en sistemas heterogéneos.

Java no depende de la plataforma de hardware/software en la que se ejecuta.


JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

p o n t if ic ia UNIVERSIDAD C A T Ó L IC A D a per ú

Java provee las mismas librerías (API) para cada sistema operativo en el que se
ejecuta.

Java no requiere de recompilar el código, se programa y compila sólo una vez.

Java es de arquitectura neutral.

Java trabaja con un código objeto (bytecode) que representa instrucciones de


máquina para un procesador virtual.

Java requiere de un intérprete (JVM por las siglas en inglés de Java Virtual
Machine) para cada sistema operativo en el que se ejecuta.

El beneficio de esta arquitectura es la de comprar una vez, se ejecuta en


cualquier sitio, se escribe una vez y se vende para cualquier plataforma.

Relación de Sistemas Operativos que soportan Java

Como se ha mencionado, Java es multiplataforma y soporta prácticamente todos


los sistemas operativos (SOs) disponibles en el mercado. Entre los SOs que
soporta Java están:

Solaris
Iris
Unix
Linux
HP/UX
OSF
Windows 95/98
Windows NT/2000/XP
OS/2
Macintosh

11. Paquetes - las librerías de clases

Un paquete es un medio de encapsulamiento de mayor nivel que las clases, que


puede contener clases, interfaces y también a otros paquetes.

Los paquetes se usan también como un mecanismo para evitar conflictos entre
nombres: se puede tener dos clases con el mismo nombre pero en diferentes
paquetes.

El API de Java es un grupo de paquetes.


JAVA Inicial
PONTIFICIA
4^ INFOPUC
INSTITUTO DE INFORMÁTICA

UNIVERSIDAD C A T Ó L IC A d e l p er ú

Físicamente un paquete representa a un directorio. Si el nombre del paquete


está compuesto por palabras divididas por puntos, cada palabra representará un
directorio que contendrá a otro directorio que será la siguiente palabra, así hasta
la última palabra que será el directorio que contenga los archivos con el código
fuente o compilado de las clases que forman parte de este paquete.

12. Malentendidos comunes sobre Java

Java es una extensión de HTML...


Java es un lenguaje de programación mientras que HTML es una manera de
describir la estructura de una página web.

Java se convertirá en un lenguaje de programación para todas las


plataformas...
En teoría es posible que Java se convierta en un lenguaje universal para todas
las plataformas, sin embargo existen muchas aplicaciones que trabajan muy bien
en ciertas plataformas que podrían no hacerlo en otros dispositivos o en
browsers.

Java es interpretado así que es muy lento para una aplicación seria en una
plataforma específica...
Si existe un compilador JIT una aplicación escrita en Java puede ser tan rápida
como cualquier otra.

Todos los programas de Java se ejecutan en una página web...


Todos los applets se ejecutan en un web browser (por definición) sin embargo se
pueden desarrollar aplicaciones que no necesitan un browser para ejecutarse.

JavaScript es una versión simple de Java...


JavaScript es un lenguaje desarrollado por Netscape (originalmente denominado
LiveScript) que puede ser usado en páginas web, sin embargo no tiene ninguna
relación con Java excepto por la similitud del nombre.
JAVA Inicial INFOPUC
IN STITUTO DE INFORMÁTICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A DEL r w ú


JAVA Inicial INFOPUC
IN STITUTO DE INFORMÁTICA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A d e l p er ú

Capítulo 2
Estructuras fundamentales

1. Tipos de datos en Java


2. Literales
3. Variables e identificadores
4. Palabras clave
5. Comentarios
6. Operadores numéricos y lógicos
7. Inicializaciones y asignaciones
8. Conversiones de tipos primitivos
9. Arreglos
10. Cadenas de caracteres
11. Ámbitos o bloques
12.for
13.if-else
14.switch
15.while y do-while
16.break, continué y return
JAVA Inicial J> INFOPUC
IN STITUTO DE INFORftATSCA

UNIVERSIDAD C A T Ó L IC A Da Pf.ftú
p o n t if ic ia UNIVERSIDAD C A T Ó L IC A del PERÚ

1. Tipos de datos en Java

Java tiene 8 tipos primitivos de datos, de los cuales 6 son de tipo numérico (4 de
enteros y 2 de punto flotante), 1 es de tipo caracter y 1 de tipo lógico o booleano.

El tipo caracter representa caracteres Unicode de 16 bits y se le puede


considerar como un entero sin signo para la mayoría de propósitos. Todos los
tipos enteros son tratados como signados, con un tamaño que está entre los 8 y
64 bits. Los tipos de punto flotante se representan en el formato estándar IEEE
754 de un tamaño de 32 y 64 bits.

Enteros

Tipo Contenido Tamaño Rango de Valores


byte Entero con signo 8 bits -128 a 127
short Entero con signo 16 bits -32768 a 32767
int Entero con signo 32 bits -231 a 231-1
long Entero con signo 64 bits -2e:5 a 263- 1

Punto Flotante

Máximos y
Tipo Contenido Tamaño mínimos
aproximados
IEEE estándar de precisión ±3.4x1038 a
float 32 bits
simple ±1.4x10-45
IEEE estándar de precisión ±1.8x10308 a
double 64 bits
doble ±4.9x10'324

Caracter

Tipo Contenido Tamaño Rango de Valores


char Caracter Unicode sin signo 16 bits \u0000 a \uFFFF

Booleano

Tipo Contenido Tamaño Valores posibles


boolean Tipo booleano 8 bits true o false
JAVA Inicial INFOPUC
INSTITUTO D£ ¡NFORMAT íC A

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A del PERÚ

Valores por defecto para variables de instancia.

Cuando se declara una variable y no se le asigna ningún valor, ésta se inicializa


con cierto valor dependiendo del tipo que tenga dicha variable:

• Todos los tipos de datos enteros, se inicializan en 0.


• Tipos de datos de punto flotante
float -» O.OOf
double —> O.OOd
• Tipo de dato lógico
boolean —►false
• Tipo de dato caracter
char —*• \u0000

2. Literales

En Java, un valor constante se crea utilizando una representación literal de él. La


constante puede ser un número, un caracter o una cadena de caracteres.

Literales Enteros

Se pueden expresar en:

• Formato Decimal (baselO)


Sin notación especial. Ejemplo: 345.

• Formato Hexadecimal (basel 6)


Número precedido de Ox. Ejemplo: OxFFFF representa 655535.

• Formato Octal (base8)


Número precedido de 0. Ejemplo: 014 representa 12.

Por defecto los literales enteros se almacenan como tipo int (entero con signo de
32 bits). Para representar números mayores que 216 o menores que -216
(aproximadamente 2,000’000,000) se puede usar la extensión L (o I minúscula)
al final del número y en cualquiera de las bases disponibles, esto indicará un tipo
long (entero con signo de 64 bits). Ejemplos: 69L, 0x7f5a965l, 034L.

Literales de Punto Flotante

Representan valores numéricos que tienen parte fraccionaria. Pueden


expresarse en:
JAVA Inicial 1 ». INFOPUC
IN STITUTO DE INFORMÁTICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A del f

• Notación Estándar

Dígitos seguidos de un punto y más dígitos para la fracción. Ejemplo:


2.67.

• Notación Científica

Número en notación estándar con una notación adicional para indicar la


potencia de 10 a la que hay que elevar el número anterior. Esta potencia o
exponente se indica con una E seguida por un entero con o sin signo.
Ejemplo: 2.3E-5.

Por defecto, se guardan como tipo double, almacenándose en 64 bits y


aunque no es necesario puede redundarse la especificación agregando una D (o
d) al final. Ejemplo: 3.51 D.

Para usar el tipo float, de 32 bits de tamaño, debe especificarse una F (o f) al


final. Ejemplo: 7.94F.

Literales booleanos

Representan los valores lógicos de verdadero o falso. Para este efecto, Java
proporciona las palabras reservadas true y false, respectivamente.

Literales de un caracter

Representan índices en el conjunto de caracteres Unicode.

Son valores de 16 bits que pueden convertirse a enteros y operarse como


tales. Los caracteres ASCII (visibles en los teclados) pueden expresarse
directamente entre dos comillas simples. Ejemplo: ‘x’.

Otros caracteres (como los dependientes del idioma) deben representarse


por su valor Unicode en representación octal o hexadecimal, la cual tiene la
siguiente forma:

• Octal -* ’\ddd’
• Hexadecimal -» ’\udddd’

Ejemplo:
‘H’ = ‘\u0048’ = ‘\1 10’, dado que ocupa la posición 72 en la tabla Unicode.
JAVA Inicial INFOPUC
INSTITUTO DE INFORMATICA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A d e l pf.RÚ

Valor Unicode de algunos caracteres especiales:

Secuencia de Escape Nombre Valor Unicode


\b retroceso(backspace) \u0008
\t tab \u0009
\n cambio de línea \u000a
\r retorno de carro \u000d
\” comilla doble \u0022
V comilla simple \u0027
\\ barra invertida (backslash) \u005c

Literales de Cadenas de Caracteres

Representan un texto y se expresan entre comillas dobles. Deben terminar en la


misma línea del programa donde comenzaron. En realidad, el compilador las
implementa como instancias de la clase String con el valor textual encontrado,
aunque esto es transparente al programador. Ejemplo: “cadena de caracteres”.

3. Identificadores y Variables

Identificadores

Los identificadores son palabras que se usan para nombrar:

• Variables : para almacenamiento de datos


• Métodos : para especificación de funciones
• Clases : para especificación de objetos
• Interfaces: para especificación de protocolos
• Paquetes : para agrupación de clases

Los identificadores están sujetos a reglas estrictas de formación, tales como:

• Ninguna palabra clave o reservada de Java puede ser usada como


identificador.

• Un identificador debe comenzar con una letra, el símbolo de dólar ($) o el


caracter de subrayado (_). Se generará un error si se trata de usar un
dígito o cualquier otro símbolo (que no sea $ o _) para iniciar un
identificador. El resto de caracteres del identificador podrán ser, además
de los caracteres mencionados, dígitos.
JAVA Inicial a lK ffl INFOPUC
IN STITUTO DE INFORMÁTICA

PO N TIF IC IA UNIVERSIDAD C A T Ó L IC A del PERÚ

• Los identificadores son case-sensitíve. En Java las mayúsculas y


minúsculas son distintas, bastará una diferencia de este tipo para que el
compilador reconozca un nombre como un objeto diferente.

Es recomendable:

• No usar los caracteres _ ni $ como primer caracter de un identificador, de


manera que se puedan utilizar librerías de C/C++ sin temor de “cruzarse”
con alguna de sus variables utilizadas, las que precisamente suelen
comenzar con alguno de estos caracteres.

• Usar minúsculas para los identificadores y de estar conformado por varias


palabras, para dar mayor significado al objeto, colocar mayúsculas en la
primera letra de cada palabra (menos en la primera).

Ejemplos:
numero, matrizCuadrada, miPrimeraClase.

Variables

Java es un lenguaje fuertemente tipeado lo que significa que cada variable debe
tener un tipo declarado. Para declarar una variable se coloca en primer lugar el
tipo, seguido del nombre que la identificará.

Ejemplos:
int valorE n t e r o ;
float valorDecimal;
char chl,ch2;

Una variable puede contener:

• Un valor de un tipo primitivo, o

• Una referencia a un objeto (instancia de una clase o de un tipo arreglo).

4. Palabras clave

Las palabras clave (o keywords) son de uso exclusivo del sistema Java, por esta
razón no pueden ser utilizados como identificadores.

Palabras clave: abstract, assert, boolean, break, byte, case, catch, char, class,
const, continué, default, do, double, else, enum, extends, final, finally, float, for,
goto, if, implements, import, instanceof, int, interface, long, native, new, package,
prívate, protected, public, return, short, static, strictfp, super, switch,
synchronized, this, throw, throws, transient, try, void, volatile, y while.

true, false y nuil no son palabras clave, pero si son palabras reservadas, y
tampoco es posible usarlas como identificadores.
JAVA Inicial áÉ5 | <4x l y ^F INSTITUTO
IN F O PUC
D£ INFORMATICA

p o n t ir c ja UNIVERSIDAD C A T Ó L IC A d e l per ú

5. Comentarios

Java tiene 3 maneras de representar los comentarios.

• La forma más común es utilizando //. Esto se usa para comentar un texto
a partir de // hasta el final de la línea.

• Cuando el comentario es más largo (varias líneas), se puede marcar cada


línea con //, sin embargo es más simple utilizar /* y 7 (al inicio y al fin del
comentario) para delimitarlo.

• La tercera clase de comentario que posee Java es de la forma: /**


comentario */, el cual se utiliza para generar documentación de manera
automática utilizando la aplicación javadoc.

6. Operadores numéricos y lógicos

Los operadores especifican una operación o evaluación sobre uno o más objetos
(datos u objetos) para generar un resultado.

Aritméticos y de conversión

+-*/ Adición, sustracción, multiplicación y


división.
% Módulo
++ Incremento en 1
Decremento en 1
Cambio de signo
Complemento al bit
& Y binario (AND al bit)
| O inclusivo binario (OR al bit)
A O exclusivo binario (XOR al bit)
« Desplazamiento de bits a la izquierda
» Desplazamiento de bits a la derecha
»> Desplazamiento de bits a la derecha
(sin considerar signo)
JAVA Inicial ¿isr^¡fc -INFOPUC
IN STITUTO DE INFORMATICA

PO N TIFIC IA UNIVERSIDAD C A T Ó L IC A del p

De Comparación

n— Igual
!= Diferente
< Menor que
<= Menor o igual que
> Mayor que
>= Mayor o igual que

Lógicos

& Y lógico (AND) de evaluación completa


| O lógico inclusivo (OR) de evaluación
completa
A O lógico exclusivo (XOR)
&& Y lógico (AND) de evaluación
“suficiente”
|| O lógico inclusivo (OR) de evaluación
“suficiente”
I Negación lógica
== Igual
!= Diferente
?: Condicional ternario (sintaxis:
ExpBooleana ? ExpSiTrue :
ExpSiFalse)

De Asignación

= Asignación
+= Suma y asigna
_=
Resta y asigna
* _
Multiplica y asigna
/= Divide y asigna
%= Módulo y asigna
&= Y lógico (AND) y asigna
1= 0 lógico inclusivo (OR) y asigna
A=
0 lógico exclusivo (XOR) y asigna
JAVA Inicia! INFOPUC
INSTITUTO D£ INFORMATICA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A d e l p er ú

Tipos válidos de los operandos

Aritméticos y de conversión De comparación Lógicos De asignación

+ i & b & = i

- 1 1 i, f t= b
± ,£
‘ += I
í , f
★ i A
i, f < b A
-= |
i, f / i « i-,£ <= b && *=

i, f % i » í / f > b 1
/=
l, f ++ 1 » > í , £ >= b f %=

i, f __ b = &=
Tipos válidos de los operandos
i — i = Entero (byte, small, int, b f= i=
long)
i f = Punto Flotante (float, b ?:
A _
double’
b = Lógico (boolean)

7. Inicializaciones y asignaciones

Luego de declarar una variable es conveniente inicializarla explícitamente a


través de una sentencia de asignación.

Para asignar un valor a una variable declarada previamente se coloca el nombre


de la variable a la izquierda seguido del símbolo de igual (=), luego se coloca un
literal o una expresión que tenga como resultado un valor apropiado (del mismo
tipo o compatible que el indicado) a la derecha.

Ejemplos:
int v a l o r ; //declaración
v a l o r = 50; //asignación

Java permite declarar e inicializar una variable en la misma línea.

Ejemplo:
char letra = 'A'; //inicialización

Las declaraciones de variables se pueden hacer en cualquier parte del código,


pero una variable sólo puede ser declarada una vez en cualquier bloque de un
método.
JAVA Inicial INFOPUC
IN STITUTO DE ¡NFORMÁTÍCA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A d e l p er ú

8. Conversiones de tipos primitivos

Las conversiones también son conocidas como casting. Java automáticamente


cambia el tipo de un dato a otro cuando es pertinente. Por ejemplo, si se asigna
un valor entero a una variable declarada como flotante, el compilador convierte
automáticamente el int a float. El casting permite hacer esto explícitamente, o
forzarlo cuando normalmente no se haría.

Para realizar un casting, se coloca el tipo de dato que se desea (incluyendo


todos los modificadores) dentro de paréntesis a la izquierda del valor. Por
ejemplo:

int i = 100;
long I = (long)i;
long 12 = (long)200;

En Java, el casting es seguro, con la excepción de cuando se realiza una


conversión estrecha, es decir, cuando se quiere pasar de un dato que contiene
mucha información a otro que no puede contener tanta, en donde se corre el
riesgo de perder información. Aquí es donde el compilador fuerza a que se
coloque un casting expreso, indicando al programador que "esto puede ser algo
peligroso, así que si quieres que lo haga, dímelo expresamente".

Cuando se trata de una conversión ancha, no es necesario el casting explícito,


ya que el nuevo tipo podrá contener más información que la que contiene el tipo
original, no ocasionándose ninguna pérdida de información, así que el
compilador puede realizar el casting explícitamente, sin la intervención del
programador para confirmar la acción.

Java permite el casting de cualquier tipo primitivo en otro tipo primitivo, excepto
en el caso de los booleanos, en que no se permite casting alguno.
JAVA Inicial INFOPUC
IN STITUTO D6 INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A del PERÚ

9. Arreglos

Un arreglo es un tipo compuesto (o una construcción) de variables del mismo


tipo. Estas variables pueden ser a su vez de tipo simple o compuesto y se
referenciarán con el mismo identificador.

Un arreglo puede ser de una o más dimensiones (multidimensionales que en


realidad son matrices de matrices) y cada dimensión se especifica con corchetes
seguidos al tipo de datos o seguidos al identificador.

Ejemplos:
int n ú m e r o s [];
char[] l e t r a s ;

A diferencia de otros lenguajes, en Java no se permite especificar el tamaño de


una arreglo vacío directamente. Para esto debe usarse el operador new o
asignarle una lista de items a su tipo.

Ejemplos:
c h a r c a r a c t e r A l f a b e t i c o [] = n e w c h a r [27];
int d í g i t o s = {0, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ;

Los arreglos tienen una variable denominada length, la cual guarda el número
de elementos que tiene el arreglo.

Ejemplo:
i n t [ ] n ú m e r o s = n e w i n t [10];
f o r (int i = 0 ; i < n u m e r o s .l e n g t h ; i + + )
números[i]=i;

10. Cadenas de caracteres

En Java las cadenas son manejadas por la clase String. Incluso los literales tipo
cadena, son en realidad instancias de la clase String.

Las cadenas de caracteres son objetos y son construidas a partir de literales,


arreglo de caracteres o arreglo de bytes.

Poseen un método denominado length() el cual retorna el número de caracteres


que tiene la cadena.

Ejemplo:
S t r i n g si = " C u r s o " ;
i n t 1 = s i . l e n g t h (); // l o n g i t u d = 5
Lv-,w0<c¿b i )
La concatenación de cadenas se realiza utilizando el operador +.
JAVA Inicial IN F O P U C
(NSTiTUTO D£ ¡NíFORMÁTiCA

p o n t ih c ia UNIVERSIDAD C A T Ó L IC A del psrú

Ejemplo: jOl
S t r i n g s2 = si + de i*
Cv
s2 += " J a v a . " ;

La comparación de cadenas se realiza mediante, el operador == para comparar


las referencias y el método equals() para comparar el contenido.

Ejemplo:
if (sl==s2) // c o m p a r a l a s r e f e r e n c i a s
i f (s i .e g u a l s ( s 2 )) // c o m p a r a e l c o n t e n i d o

í A » * 1' 0
11. Ámbitos o bloques
i?
tjh

En Java, el código se divide en bloques delimitados por llaves { } .

Un bloque es un conjunto de sentencias entre llaves.

Un bloque puede contener a otros bloques.

Alcance y visibilidad

Las variables existen desde su definición hasta el final del


bloque donde fueron declaradas y no pueden ser
invocadas en el exterior de este ámbito.

Una variable declarada en un ámbito sigue existiendo en


los ámbitos internos (sub-bloques), desde donde “es
visible”, es decir se le puede invocar, acceder a su valor y
modificarla.

Por el motivo anterior, y a diferencia de otros lenguajes,


una variable no puede llevar el mismo nombre
(identificador) que una de un ámbito exterior al que
pertenece.

Las variables declaradas en ámbitos internos no son


visibles ni siquiera en el bloque exterior al que pertenece.

Las sentencias se ejecutan en el mismo orden en que son


especificadas en el bloque. Un bloque es tratado como
una sentencia. La ejecución de bloques también es
secuencial.
JAVA Inicial ►
INFOPUC
IN STITUTO DE INFORMATICA

p o n t if ic ia UNIVERSIDAD C A T Ó L IC A d e l per ú

No hay límite para la creación y anidamiento de bloques.

Separadores

{ }
Las llaves sirven para contener los valores de arreglos inicializados
automáticamente y para definir bloques de código para clases, métodos y
ámbitos locales. , ,, fut ce <^

T\
i 0í ^
El punto y coma separa sentencias. ^v

La coma separa identificadores consecutivos en declaraciones de variables,


también ítems de una lista.

12. for

for (inicialización; condición; iteración o incremento)


{ sentencias; }

for (TipoElementos elementoAuxiliar: estructuraElementos)


{ sentencias; }

La sentencia for permite ejecutar repetidamente


Evaluación de la una sentencia o bloque (de varias sentencias). La
expresión de
inicialización repetición se llevará a cabo mientras que la
condición sea verdadera.

Existe una forma alternativa de usar la sentencia


for, la cual proporciona una sintaxis muy sencilla
para recorrer los elementos de un array o cualquier
estructura que implemente el interfaz Iterable (por
ejemplo las colecciones).

La simplicidad se logra por la iteración automática


Evaluación de la sobre los elementos. Esto tiene como contrapartida
expresión de una pérdida de flexibilidad, pero para eso sigue
iteración
disponible la sentencia for tradicional.
JAVA Inicial -INFOPUC
IN STITUTO DE INFORMATICA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A d e l p er ú

13. if-else

if (condición) {sentencias;}
else {sentencias;}

La sentencia if ejecuta una sentencia o bloque if (ExpLogica)


en caso que la expresión lógica (condición) sentencia; (1)
especificada resulte verdadera (true). else
sentencia; (2)
Si la cláusula else es especificada, se ejecuta
la sentencia o bloque seguida ésta en caso que
la condición de la sentencia if resulte falsa true false
(false). V
sentencia;o sentencla;o
Se puede anidar sentencias if (else if). En este bloque (1) bloque (1)
caso se recomienda indentar el código para
hacerlo más legible.

En caso de requerir un anidamiento


considerable, es preferible el uso de la
sentencia switch.

14. switch

ú&
switch (Expresión) { u ív ‘
case Constantel:
sentencias; *
break;
case Constante2:
sentencias;
break;

default:
sentencias;
}
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A del PERÚ

switch (Expresión){
case constante 1: lista-de-sentencias (1)
Evaluación de la
Expresión
case constante2: lista de sentencias (2)

defauIt: lista-de-sentencias

lista de sentencias
( 1)
false

lista de sentencias
( 2)

false

lista de sentencias
(D)

La sentencia switch permite ejecutar una lista de sentencias de acuerdo al


resultado de una expresión entera o un tipo enumerado.

Si no se coloca la cláusula break, el flujo sigue “cayendo” a las demás listas de


sentencias.

Si es colocada la cláusula default, su lista de sentencias se ejecutará en caso de


no cumplirse ninguno de los valores case.

La ejecución de la sentencia switch es más eficiente que la misma lógica


programada a través de encadenamiento de sentencias if-else.

Sin embargo es un error común olvidar que el flujo sigue “cayendo” una vez
ejecutado el case que resultó verdadero (es frecuente olvidar colocar un break a
cada case). Por este motivo es casi una convención que cuando no hay breaks,
se colocan comentarios “continúa” que informan que no es un error de omisión.
jí'* i0 -i

,*• <1V / ' -*


i* f p °l
15. while y do-while

while (condición) { do {
sentencias; sentencias;
} } while (condición);
JAVA Inicial INFOPUC
IN STITUTO DE íNFORMATICA

p o n t ih c ia UNIVERSIDAD C A T Ó L IC A d e l per ú

while (ExpLogicaParaSeguir) do
sentencia; o bloque sentencia; o bloque
while (ExpLogicaParaSeguir)

16. break, continué y return

break

La sentencia break hace que el control pase


fuera del bucle (a la siguiente sentencia o
bloque).

También puede usarse para pasar el control


fuera de un ámbito etiquetado:

etiquetal: {
etiqueta2: {
etiqueta3: {
// á m b i t o d e la e t i q u e t a 3
if (true)
break etiqueta2;
/ / s e n t e n c i a s a q u i n u n c a se e j e c u t a r í a n
}
/ / s e n t e n c i a s a q u í n u n c a se e j e c u t a r í a n
}
//el control pasa aquí luego del break
JAVA Inicial
PONTIFICIA
<► INFOPUC
INSTITUTO DE INFORMATICA

UNIVERSIDAD C A T Ó L IC A DEL PERÚ

continué

continué label;

La sentencia continué hace que el flujo no


continúe la iteración en proceso dentro de un
bucle, pero sin salirse de éste.

En un while o un do-while el control saltará a la


condición (a evaluar la condición) y de acuerdo
al resultado se continuará o terminará el bucle.

En un for, la tercera cláusula (la expresión de


iteración) se ejecuta después del continué.

return a

return expresión;

La sentencia return hace que el control pase al objeto que invocó al método que
contiene la sentencia.
JAVA Inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A d e l per ú

Capítulo 3
Objetos y clases

1 . Clase y objeto
2 . Persistencia
3. Encapsulamiento de la información
4. Herencia
5. Mensajes y comunicación entre objetos
6 . Polimorfismo
7. Ventajas de la POO
8 . Definición de una clase
9. Modificadores de clase
10. Constructores
11 .Variables de instancia
12. Métodos
13. Modificadores para miembros de clase
14. Métodos predefinidos
15. Unidades de compilación
16. Paquetes
17. Recolección de basura
18. El método finalize
19. Tipos enumerados
JAVA Inicial IN F O P U C
INSTITUTO DE INFORMÁTICA

p o n t ih c ia UNIVERSIDAD C A T Ó L IC A d e l p er ú
JAVA Inicial INFOPUC
tNSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A DEL PERÚ

‘'-'«''fe* — 'ff#
1. Clase y objeto

Una CLASE describe un grupo de objetos con propiedades (atributos)


similares, relaciones comunes con otros y con una semántica común. Una clase
es una generalización de las características de un objeto. Los objetos de una
clase tienen los mismos atributos y los mismos patrones de comportamiento.

Existen dos tipos de características:


i n* (f II
• Atributos: información de identificación o de descripción o de estado. t
• Comportamiento: funcionalidad o conducta ante solicitudes. 4 ^ 4
üt ¿,
Una clase hace referencia a los objetos que presentan los mismos tipos de datos
y métodos para manejarlos y comunicarse con otros objetos.

Una clase es una abstracción que representa un conjunto de objetos de igual


estructura (datos) y comportamiento (métodos).

Un OBJETO es una instancia particular de una clase. Posee las mismas


características que aquellos de su misma clase distinguiéndose por los valores
de estas características.

Un objeto es una instancia creada a partir de su clase que ocupa espacio


(memoria) y tiene una duración: se crea y puede dejar de existir (se destruye).

Se distingue de otros objetos de su misma clase por los valores de sus datos
que reflejan atributos y estados del comportamiento.

Un objeto es una instancia única (identificable) que mantiene la estructura y


comportamiento definidos por la Clase a la que pertenece, como si ésta última
hubiera servido de molde o plantilla. Es por este motivo que los objetos también .
son llamados instancias de clase.

En todos los lenguajes 0 0 , cada clase tiene un método por el cual se pueden
crear (“a su imagen y semejanza”) instancias (objetos de esa clase).

Los objetos de software pueden servir para representar objetos del mundo real
así como para modelar objetos abstractos para resolución de problemas.

Cuando un objeto del mundo real es modelado como un objeto de software sus
propiedades son descritas por variables de instancia y su comportamiento es
especificado mediante métodos.

Cada objeto creado mantiene un juego de variables de instancia con un único


conjunto de valores en cada momento. Sin embargo todos los objetos comparten
la misma implementación de los métodos de la clase.
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A del PERÚ

2. Persistencia

Tomando como ejemplo a una persona (“objeto del mundo real”) se puede
mencionar las siguientes características, nace (técnicamente se podría decir que
es creado por sus padres) y muere (técnicamente se podría decir que
funcionalmente es destruido).

Asimismo puede cambiar de ubicación y sigue siendo la misma persona


(trasciende el espacio).

Cuando mueren los padres de una persona, ésta sigue existiendo (trasciende la
muerte de su creador).

Un objeto, que es una instancia creada a partir de su clase, ocupa espacio


(memoria) y a pesar que cambie de ubicación de memoria seguirá siendo el
mismo objeto, es decir trasciende el espacio.

Un objeto tiene una duración, se crea y puede dejar de existir (se destruye). Del
mismo modo trasciende el tiempo dado que sigue existiendo a pesar que su
clase ya no exista más.

3. Encapsulamiento de la información

El ocultamiento de la información permite la resolución de problemas complejos,


dado que precisamente oculta esta complejidad en niveles altos de abstracción,
de manera que sólo se vea la interacción del sistema (producto o solución del
problema) con su entorno.

El encapsulamiento de la información permite ocultar la complejidad, protegiendo


a los componentes de otros, los que sólo conocerán lo que el componente les
permita en su interfaz exterior.

Un objeto no exhibe toda su información ni muestra todos los detalles de su


funcionamiento.

En un programa 0 0 , tanto los datos (declaración y almacenamiento) como el


código (que especifica la lógica) que los manipula son “encapsulados” en una
Clase que define el comportamiento y protege a los datos y código de otro
código que trate de acceder a éstos de manera arbitraria.

Además de esta importante ventaja de seguridad, el objeto de software provee


una interface de mensajes a través de la cual puede solicitársele haga algo, lo
que permite que otros objetos de software lo utilicen sin necesidad de conocer
los detalles de implementación.
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA,

PO NTIH C IA UNIVERSIDAD C A T Ó L IC A d e l p er ú

Los objetos encapsulan datos que sólo pueden accesarse a través de métodos
que el consumidor de software debe invocar (con el protocolo o conjunto de
mensajes correspondientes) para obtener un servicio específico
("funcionalidad"). Entonces el consumidor debe conocer QUE hace cada
componente, dejando a nivel "interno" el COMO.

Los objetos pueden simular entes del mundo real implementándose como
bloques de software que encapsulan tanto datos como procesos.

Un objeto puede contener otros objetos.

Quien desarrolla puede hacer cambios a la implementación de una clase, sin que
esto lo noten los usuarios de la misma.

4. Herencia

Herencia es compartir atributos y operaciones entre clases tomando como base


una relación jerárquica. Una clase (superclase) se va refinando sucesivamente
para producir subclases. Todas las subclases poseen todas y cada una de las
características (atributos y comportamiento) de su superclase añadiendo
además, sus propiedades exclusivas.

En el contexto de objetos de software, se ha mencionado que cada Clase


encapsula datos y métodos, entonces cualquier subclase tendrá las mismas
características MAS cualquier otra como parte de su especialización (que
precisamente la haga especial).

Los objetos de una "clase" heredan características (datos y/o métodos) de clases
más generales.

Ante un cambio, es fácil identificar la necesidad de "especializar" o particularizar


una clase existente o "Generalizar" una clase para una mayor cobertura de
utilización (y reutilización).

En OOP la herencia está siempre implícita cuando se define una clase en base a
otra. En este caso, la primera será una subclase de la segunda (que será su
superclase).

Una subclase puede:

• Añadir propiedades (datos) y funcionalidad (métodos) adicionales.


• Modificar métodos heredados.
• Incluso desactivar algunos métodos heredados.

Una clase puede ser tan abstracta que incluso nunca genere objetos (serán sus
subclases las que los generen).
JAVA Inicial
PONTIFICIA
♦ IN F O P U C
INSTITUTO DE INFORMÁTICA

UNIVERSIDAD C A T Ó L IC A DEL PERÚ

5. Mensajes y comunicación entre objetos

Los objetos de la realidad interactúan a través de la comunicación.

El envío y recepción de mensajes:


• Pueden no ser entendidos por el receptor
• Pueden ser entendidos pero no atendidos
• Pueden ser entendidos y atendidos

Para que se establezca comunicación entre dos objetos de la realidad, se


requiere un protocolo (conjunto de mensajes) que sea conocido por ambos.

La comunicación entre objetos de software también se da a través de mensajes.

El objeto emisor (más conocido como “cliente”) solicita algo (a veces llamado
“servicio”) a un objeto “servidor” quien provee dicho servicio a través del método
que se invocó en el mensaje.

El mensaje es el nombre del método y la especificación del servicio se da a


través de los parámetros pasados al método.

El objeto cliente debe conocer la “manera correcta” de solicitar el servicio:


especificando los tipos de datos correspondientes a los parámetros del método
en cuestión.

6. Polimorfismo

Polimorfismo significa que una misma operación puede comportarse de modos


distintos en clases distintas.

El Polimorfismo se traduce como: un objeto y muchas formas.

Es la abstracción o similitud con el caso de la realidad donde un objeto reacciona


ante un mismo mensaje de diversas formas.

En la realidad puede observarse polimorfismo en dos circunstancias:

• Polimorfismo en la misma clase


• Polimorfismo en las subclases de una clase

En OOP se simulan ambos casos.


JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

PO NTIHCIA UNIVERSIDAD C A T Ó L IC A DEL r

Polimorfismo en la misma clase

Un objeto de la realidad puede reaccionar (comportarse) a un mismo mensaje de


acuerdo al tipo de información contenido:

En OOP se denomina: Sobrecarga estática de métodos lo cual significa que un


objeto de una clase puede reaccionar a un mismo mensaje de acuerdo a éste
último (al tipo de dato, que es un objeto, en el mensaje).

Por lo tanto en una misma clase puede existir más de una implementación de un
mismo método. Las diferentes implementaciones del método tendrán el mismo
nombre pero no la misma especificación.

Polimorfismo en las subclases de una clase

En la realidad, objetos de la misma clase pueden reaccionar ante un mismo


mensaje de manera diferente sólo por el hecho de pertenecer a subclases
diferentes.

En OOP se denomina: Polimorfismo dinámico por niveles (sobreescritura de


métodos en las subclases) esto significa que usando subclases puede
construirse por niveles un polimorfismo dinámico y en tiempo de ejecución,
cubriendo la falta de flexibilidad anterior (sobrecarga estática de métodos).

Aunque no se tenga el código fuente, siempre se podrá implementar una


subclase con un método cambiado o especializado (se sobreescribe el método).

Cualquier objeto que llame al método, ni siquiera tiene que saber qué subclase
ejecutará el método, simplemente deberá invocarlo.

7. Ventajas de la POO

Objetivismo (Simulación):
• Riqueza y precisión en la documentación de Análisis y Diseño.
• Mejor comunicación entre técnicos y usuarios.

Herencia y reutilización de código:


• Mayor capacidad para construir software complejo.
• Mayor facilidad para mantenimiento de software.

Ocultamiento - Encapsulamiento:
• Mayor velocidad en la creación de software.
• Minimización de fallas: CALIDAD.
JAVA Inicial
p o n t i f ic ia
♦ INFOPUC
INSTITUTO DE INFORMÁTICA

UNIVERSIDAD C A T Ó L IC A d e l per ú

8. Definición de una clase

Sintaxis:
class IdentificadorDeClase {
cuerpo-de-la-clase
}

Cuando se usa la palabra reservada class, el identificador usado se registra


como nuevo tipo de datos (compuesto). La creación de variables de este tipo es
similar que para variables de tipos primitivos: Para crear una variable de
referencia a una clase se especifica el identificador de la clase seguido del
identificador para la variable de referencia.

Sintaxis:
IdentificadorDeClase IdentificadorVariableReferencia;

Creación de instancias

Para crear un objeto de una clase y tener una variable de referencia asociada al
objeto se usa el operador new.

Sintaxis:
IdentDeClase IdentVarReferencia = new ldentDeClase();

Con esto se está reservando la memoria necesaria para las propiedades


(variables de instancia) del objeto. Así es como se crea o construye una
instancia.

9. Modificadores de clase

La visibilidad de miembros de una clase se determina o modifica en relación a


otras clases.

La visibilidad entre clases está determinada en relación a los paquetes.

Por omisión una clase es visible a todas las demás que se encuentren en el
mismo paquete.

Si se requiere que una clase sea visible fuera del paquete donde pertenece,
debe especificarse el modificador public en la declaración de la clase.

Sintaxis:
public class IdentificadorDeLaClase { . . . }
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

p o n t ih c ia UNIVERSIDAD C A T Ó L IC A d e l per ú

Si una clase tiene modificador de acceso public, puede restringirse el acceso a


los miembros de esta clase, anteponiendo los correspondientes modificadores
en las declaraciones de variables y métodos. Con esto se sobrepone (o
sobreescribe) el modificador de la clase.

final : la versión final de clases

El modificador final en una clase especifica que ésta no pueda extenderse, esto
es que no puede tener subclases.

10. Constructores

El constructor de una clase es un método que reserva recursos para las


variables de instancia del objeto que se está creando. Tiene el mismo nombre
que la clase a la que pertenece. Es invocado cuando se crea un objeto con el
operador new, por lo que generalmente su función es la de inicialización de
variables.

Puede tener varias implementaciones.

Un método constructor no incluye un tipo de retorno, debido a que nunca


devuelven valor.

Los métodos constructores no pueden ser invocados directamente como


cualquier otro método, sino siempre cuando se esté creando un nuevo objeto. Al
usar el operador new para crear objetos, los valores usados como parámetros
deben coincidir con los tipos definidos en el correspondiente método constructor.

Se puede observar que las variables de referencia pueden apuntar a diferentes


objetos en forma dinámica. Estos objetos también pueden ser parte de una lista
de parámetros de algún método. En estos casos estos objetos se pasarán por
referencia, a diferencia que las variables de tipos primitivos, que se manejan por
valor.

11. Variables de instancia

Cada objeto creado mantiene un juego de variables de instancia con un único


conjunto de valores en cada momento.
IN F O P U C
JAVA Inicial
p o n t ih c ia
# INSTITUTO D£ INFORMATICA

UNIVERSIDAD C A T Ó L IC A d e l p er ú

Las variables de instancia se declaran dentro del bloque principal (entre las
llaves de apertura y cierre de la declaración de la clase).

Las variables de instancia no sólo se pueden declarar como cualquiera de los


tipos primitivos, sino también como tipos de clase.

12. Métodos

Sintaxis:

TipoDeRetorno IdentificadorDeMetodo (parámetros) {


cuerpo-del-método;
}

13. Modificadores para miembros de clase

Modificadores de acceso

Los modificadores de acceso definen niveles de visibilidad entre miembros


(variables y métodos) de una clase y otros objetos.

El modificador de acceso se especifica inmediatamente antes que el tipo de una


variable de instancia o antes del tipo de retorno de un método.

Sin modificador de acceso (por omisión)

Si no se especifica modificador, las variables y métodos de una clase sólo


podrán ser accedidas por clases del mismo paquete.

public

Especifica que las variables y métodos de una clase podrán ser accedidas por
todos los objetos, aunque sean de clases de otros paquetes diferentes al de la
clase.

protected

Especifica que las variables y métodos de una clase podrán ser accedidas,
además de los métodos de la misma clase, por los métodos de todas las clases
del mismo paquete y por las subclases de ésta aunque no se encuentren en el
mismo paquete.
,*2¡¡¡§tev
JAVA Inicial ¿TV INFOPUC
IN STITUTO DE iNFORMATICA

pontihcia UNIVERSIDAD C A T Ó L IC A del perú

prívate

Especifica que las variables y métodos de una clase podrán ser accedidas sólo
por los métodos de la misma clase.

entonces
Si un miembro tiene el acceso modficado a :
1
podrá ser accedido por métodos de: public protected private
(omitido)
la misma clase SI SI SI
SI
subclases del mismo paquete SI -
SI SI
otras clases del mismo paquete SI SI SI -

subclases en otros paquetes SI -


SI -

otras clases de otros paquetes SI - - -

static: Variables de clase

En algunas ocasiones las clases presentan propiedades que son siempre


comunes a todas las instancias. Con el modificador static se especifica que una
variable es común (la misma) para todas las instancias de la clase.

Sintaxis:
static tipo identificadorDeVariable;

Por omisión (sin modificador), cada objeto (instancia de clase) reserva memoria
para sus variables de instancia cuando es creado; por cada nuevo objeto,
nuevos espacios de memoria son reservados. Las variables estáticas reservan
un sólo espacio independientemente de cuántas instancias de la clase se hayan
creado o vayan a crearse y son comunes a todas las instancias de la clase. Es
por esto que también se les conoce como variables de clase.

Entonces, como la variable es compartida, cambiar su valor implica cambiar la


propiedad de todas las instancias existentes de esa clase. Además, como la
variable de clase se crea cuando la clase se declara no es necesario que existan
instancias para hacer referencia (acceder) a una variable de instancia.

Asimismo, para hacer referencia a éstas, puede usarse el identificador de la


clase o también el de un objeto de esa misma clase.
JAVA Inicial INFOPUC
INSTITUTO DE INFORMÁTICA

PO NTIH C IA UNIVERSIDAD C A T Ó L IC A d e l p er ú

static: Métodos de clase

Los métodos de una clase son generalmente invocados para actuar sobre una
instancia determinada de esa clase; esto es, para que modifiquen las variables
de instancia de una instancia en particular.

En ocasiones se requiere funcionalidad fuera del contexto de instancias. Con el


modificador static se especifica que un método es “independiente” de cualquier
instancia, por lo que también sólo podrá acceder a variables estáticas y podrá
invocar directamente sólo métodos estáticos de su clase.

Al igual que una variable de clase puede ser accedida sin que exista una
instancia, un método estático o método de clase, puede ser invocado sin
necesidad que existan instancias.

Asimismo, para invocar a un método estático puede hacerse referencia (calificar


el método) a la clase o a algún objeto existente de ésta.

Los métodos static no pueden referirse a this ni super.

El modificador static podría verse como la forma con que Java permite definir
tanto variables como funciones globales.

En este aspecto Java tiene una ventaja sobre el código de biblioteca y variables
globales de C/C++; y es que las clases contienen el ámbito de los identificadores
y así se evitan colisiones. C permite que se vuelvan a definir funciones de
biblioteca del sistema pues todas las funciones ocupan el mismo espacio de
nombres.

fin a l: la versión final de variables y métodos

Con el modificador final se especifica que una variable tiene un valor constante
(su valor no puede ser modificado) o que un método tiene una implementación
constante, esto es que no puede ser sobreescrito por subclase alguna.

Al igual que en el caso de variables static, las variables final no ocupan espacio
para cada instancia.

Para una variable o método puede decirse que es la "versión final".

Una vez inicializadas, el valor de las variables modificadas con final no puede ser
alterado. Una trasgresión a lo anterior causa un error de compilación.

Una buena convención es usar identificadores con todas sus letras en


mayúscula para variables final.
JAVA Inicial INFOPÜC
IN STITUTO DE INFORMATICA

PO NTiH C fA UNIVERSIDAD C A T Ó L IC A d e l per ú

14. Métodos predefinidos

main()

El método main() permite ejecutar el código de un archivo fuente. Dado que en


Java todo son ciases, el método main tiene que formar parte de una de ellas.
Tiene los modificadores void y static, esto quiere decir que la función main no
retorna ningún valor y que es independiente de cualquier instancia de la clase.

clone()

El método clone() crea un clon del objeto que invoca al método, creándole un
espacio de memoria y asignando a este los valores correspondientes al objeto
“clonado”.

toString()

El método toString() es proporcionado para ser sobreescrito y retorna una


cadena representando el valor del objeto. Como los valores de los objetos
dependen de la clase a la que pertenezcan, cada clase debe sobreescribir este
método para brindar información que pueda ser útil por ejemplo a la hora del
desarrollo y depuración de código (debugging).

15. Unidades de compilación

Una unidad de compilación es la base de toda aplicación Java.

Una unidad de compilación tiene tres partes que van en secuencia:

• La declaración de un paquete (el paquete al que pertenece la unidad).


• La importación de paquetes (permitiendo usar clases definidas en otros
paquetes)
• La declaración de tipos (área en la que se definen las clases e interfaces).

Hay que tener en cuenta que se generará un archivo .class por cada archivo
.java, razón por la cual sólo puede existir una clase pública en el archivo .java.
Tanto el archivo .java como el .class tendrán como nombre aquel que identifica a
dicha clase pública.

Directorios

Los nombres de paquetes Java son “traducidos” a una ruta del sistema donde
residen, teniendo en cuenta el operador (que en este caso actúa de separador)
punto.
JAVA Inicial ►
INFOPUC
INSTITUTO DE INFORMÁTICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A d e l per ú

16. Paquetes

Un Paquete es un medio de encapsulamiento de mayor nivel que las clases. Un


paquete puede contener clases y también a otros paquetes. Los paquetes
también agrupan interfaces.

Los paquetes brindan un mecanismo para evitar conflictos entre nombres: Se


puede tener dos clases con el mismo nombre pero en diferentes paquetes. El
API de Java es un grupo de paquetes.

Sintaxis:
package ldentificadorDelPaquete[.paq2[...] ];

Se debe declarar al inicio de un fuente de compilación, antes que cualquier


declaración de clase. Estas últimas estarán contenidas en el paquete. Puede
observarse que pueden definirse subpaquetes (paquetes dentro de paquetes).

Los paquetes no sólo sirven para facilitar la organización de las clases, sino
también para el manejo de las mismas durante compilación, donde se requerirán
muchas clases de locaciones diferentes. En compilación Java encuentra los
correspondientes archivos en bytecode y los pone disponibles para el programa
que se desea compilar.

Uso de clases de otros paquetes

Referencia explícita:
Paquete.subpaquete.Clase.Miembro

El inconveniente es que debe colocarse toda la referencia cada vez que desee
usarse un miembro o clase.

Importación de paquetes

Permite importar clases de otros paquetes (o incluso paquetes) a una unidad de


compilación.

Sintaxis:
import IdentificadorDeLaClaseOPaqueteAImportar;

Sintaxis para importar todas las clases de un paquete:

import Paquete.subpaquete.*

Teniendo en cuenta que no puede usarse * para importar todos los subpaquetes
JAVA Inicial INFOPUC
INSTITUTO D£ ¡NrORMÁTICA

PO NTIRCIA UNIVERSIDAD C A T Ó L IC A DEL p er ú

17. Recolección de basura

Muchos lenguajes tienen, a diferencia de Java, métodos destructores explícitos


para limpiar el código cuando sea necesario. La labor fundamental de estos
métodos es recuperar la memoria que fue asignada a ese objeto. Dado que Java
realiza automáticamente el proceso de recojo de basura, la solicitud manual de
memoria no es necesaria. Se debe mencionar también que Java no soporta
destructores.

Los objetos no son recogidos por el colector de basura mientras haya por lo
menos una referencia a ellos.

En Java cualquier estructura de datos compleja es un objeto que se crea a


través del operador new, que le asigna una cantidad de memoria de un
"montículo", por lo que el programador no debe preocuparse en una secuencia
de direcciones ascendentes. El operador de Java new obtiene, más que una
dirección de memoria, un "descriptor" de objeto, de manera que el programador
no debe preocuparse por ubicaciones. Incluso la memoria real asignada a un
objeto podría moverse en tiempo de ejecución y esto sería transparente.
Asimismo existe la facilidad para que el programador se despreocupe de la
devolución de memoria al sistema ya que en Java cuando no existe referencia
alguna a un objeto, la memoria que está ocupando queda disponible. A esta
facilidad se le denomina "recojo automático de basura" (aunque un mejor término
hubiera sido "reciclado permanente").

Java permite añadir un método finalize() a cualquier clase. Este método será
llamado antes que el colector de basura elimine al objeto. En la práctica no nos
podemos confiar del método finalize() para reciclar cualquier recurso dado que
no se sabe con certeza en que momento este método será llamado.

18. El método finalize

Cuando un objeto no es referenciado fuera del ámbito, es automáticamente


removido. Sin embargo Java provee la facilidad adicional de definir un método
finalize, de manera de incorporar lógica asociada a la destrucción del objeto.

La destrucción de objetos no es inmediata sino está supeditada al proceso de


recolección de basura de Java, el mismo que es ejecutado a intervalos no
controlados por el programador, por lo que incluso el método finalize será
ejecutado sólo en ese entonces.
JAVA Inicial ►
INFOPUC
INSTITUTO DE INFORMÁTSCA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A d e l per ú

19. Tipos enumerados

Los tipos enumerados son una nueva "especie" de tipos (como los tipos clase y
los tipos interface) del lenguaje que se caracterizan por tener un número finito y
normalmente bajo de posibles valores.

Los enumerados implementan el concepto de constante, de uso frecuente en


programación, que usualmente se implementaba con variables static final int. La
formalización que proporcionan los tipos enumerados lleva a otro nivel de
seguridad y funcionalidad el uso de constantes en Java.

Definición de tipos enumerados simples

La palabra reservada para la definición de tipos enumerados es enum. Va


seguida del nombre del tipo y del cuerpo de la declaración donde se listarán los
posibles valores separados por comas.

Ejemplo:
public enum NotasMusicales { DO,RE,MI,FA,SOL,LA,SI};

Valores enumerados

Los valores enumerados son los valores que puede tomar el tipo enumerado.
Conceptualmente son constantes del lenguaje. Normalmente se definen con
letras mayúsculas y se accede a ellos de esta forma:

NombreTipoEnum.NOMBRE_VALOR

Ejemplo:
NotasMusicales notaActual = NotasMusicales.FA;

Particularidades de los tipos enumerados

Los tipos enumerados en el fondo son clases. Unas clases muy especiales y con
un comportamiento limitado en algunos aspectos. Algunas particularidades
importantes de los tipos enumerados son:

• Las únicas instancias de un tipo enumerado son las que se crean en


su definición.
• Los tipos enumerados no tienen constructor público.
• Las instancias son inmutables.
• Es seguro comparar instancias con el comparador ==.
• Es más el método equals() está implementado con == y es final por
lo que no puede ser modificado.
JAVA Inicial \ IN F O P U C
INSTITUTODE INFORMATICA

PO NTIH C IA UNIVERSIDAD C A T Ó L IC A del PERÚ

Los tipos enumerados implementan el método toString() que


devuelve el nombre del valor. No es final y puede reescribirse.
También implementa el método estático valueOf() que hace lo
contrario.
No es posible extender un tipo enumerado, ya que es final por
definición (no es necesario especificarlo).
Los tipos enumerados pueden implementar interfaces.
JAVA inicial *INFOPUC
INSTITUTO DE INFORMÁTICA

PO N TIFIC IA UNIVERSIDAD C A T Ó L IC A d e l per ú


JAVA Inicia! INFOPUC
IN STITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A DEL f

Capítulo 4
Herencia,
Clases internas,
Interfaces y
Colecciones

1. Herencia. Derivación de clases


2. Conversiones de tipos de objetos
3. Clases y métodos abstractos y finales
4. Sobrecarga y sobre escritura de métodos
5. Selección de métodos en forma dinámica
6. La superclase Object
7. Clases internas
8. Clases internas estáticas
9. Clases internas anónimas
10. Acceso e instanciación de clases internas
11. Interfaces: Roles y herencia múltiple
12.lmplementación de interfaces
13. Colecciones de objetos
14. Objetos envolventes
JAVA Inicial üíEbí INFOPUC
(NSTITUTO DE INFORMÁTICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A d e l p er ú
va S S s

JAVA Inicial INFOPUC


INSTITUTO De INFORMATICA

p o n t if ic ia UNIVERSIDAD C A T Ó L IC A d e l per ú

1. Herencia. Derivación de clases

Definición, Sintaxis

La herencia es una metodología que permite la definición de una clase a partir


de la definición de otra ya existente. Permite relacionar un conjunto de clases
bajo las mismas características, de manera que puedan ser consideradas y
manejadas colectivamente.

La herencia permite el refinamiento o especialización de una clase existente:


• Se pueden definir los miembros.
• Se pueden ocultar los miembros.
• Se pueden añadir nuevos miembros.

La herencia es una forma de especialización en la que las clases hijas son


refinadas para tener el comportamiento y atributos adecuados para la aplicación
de que se trate. Al poder las clases derivadas añadir, redefinir y ocultar
miembros, la herencia se convierte en reusabilidad programable.

Sintaxis:
class IdentificadorDeClase extends IdentificadorDeSuperclase {
cuerpo-de-la-clase;
}

La subclase así definida “hereda” los atributos (variables) y métodos de la


superclase que “extiende” o de la cual se deriva.

La real potencia de la herencia no es sólo el hecho de adquisición de


propiedades y métodos de la superclase, sino la facilidad de “especializar” la
subclase con propiedades y métodos adicionales.

En el caso de los métodos se permitirá incluso redefinir los heredados


(polimorfismo con sobreescritura de métodos en subclases).

Una clase hereda desde su inmediata super clase todas las declaraciones de los
campos en el ámbito de la superclase, excepto:

• Campos y constructores privados (no son accesibles).


• Campos idénticamente declarados, sobre aquéllos en la super clase.

Cada campo tiene un acceso específico:

• El campo public es accedido siempre que el nombre de la clase sea


accesible.
• El campo protected es accesible al cuerpo de cualquier subclase (sea
dentro o fuera del paquete) y a todos los métodos dentro del paquete.
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A DEL PERÚ

• El campo package es accesible a todos los métodos dentro del paquete.


Si la clave de acceso no es especificada el acceso al paquete es asumido.
• El campo prívate es restringido a la clase en el cual se declara.

Herencia Simple

Java no soporta herencia múltiple, aunque se pueden utilizar las posibilidades


que ofrece el uso de interfaces para emplear las ventajas que ofrece la herencia
múltiple, evitando los inconvenientes que se derivan de su uso. La herencia
simple es similar en Java y en C++, aunque la forma en que se implementa es
bastante diferente, especialmente en lo que respecta a la utilización de los
constructores en la cadena de herencia.

Utilización de this() y super()

this
La palabra reservada this se usa para referenciar al objeto del instante de la
invocación.

Sintaxis:
this.miembro

super
La palabra reservada super se usa para referenciar a la superclase de la clase
del momento.

Sintaxis:
super.miembro

Dicho de otra forma:

this hace referencia al objeto del momento como una instancia de la clase del
momento.

super hace referencia al objeto del momento pero como una instancia de la
superclase de la clase del momento.
JAVA Inicial
p o n t i f ic ia
%!► INFOPUC
INSTITUTO DE ¡N-FORMATICA

UNIVERSIDAD C A T Ó L IC A del PERÚ

2. Conversiones de tipos de objetos

Upcasting

La razón para el término upcasting es histórica y está basado en la manera de


hacer los diagramas de herencia de la clase, que ha sido tradicionalmente
dibujado: con la raíz en la cima de la página, creciendo descendente. Ejemplo: el
diagrama de herencia para las clases Instrumento y Guitarra es como sigue:

Es casting de una subclase hacia una clase, se mueve


hacia arriba en el diagrama de herencia.

Upcasting es siempre seguro porque se hace desde un


tipo específico a un tipo más general. La clase derivada
es una subclase de la clase base. Esta clase derivada
puede contener más métodos que la super clase pero al
menos debe contener los métodos de la super clase.

Downcasting
Base
void f ( )
En el caso de upcasting, vimos que se void g ( )
pierde la información del tipo específico.
Upcast Downcast
Para el caso de downcasting, la clase
Subclase
base no puede ser mas grande que su
vold fO
clase derivada. Por ejemplo, no se sabe void g ( )
realmente si un instrumento es void u ( )
actualmente una guitarra, podría ser otra void v o
void w()
subclase, por ejemplo, batería o
trompeta.

Casting de datos de referencia : instanceOf

La palabra clave instanceof nos sirve para indicar si un objeto es una instancia
de un tipo particular. Devuelve un boolean para que usarlo en la forma de una
pregunta, así:

if(x instanceof Clase)


((Clase)x).metodo();

En este ejemplo se verifica si el objeto “x” pertenece a la clase Clase antes hacer
casting del objeto “x” a Clase. Es importante usar instanceof antes de aplicar el
downcasting al objeto cuando no se tiene otra información que le indique el tipo
de objeto; en caso contrario, se terminará en un ClassCastException.
JAVA Inicial INFOPUC
INSTITUTO OS INFORMATICA

p o n t i f ic ia UNIVERSIDAD C A T Ó L IC A d e l p er ú

3. Clases y métodos abstractos y finales

Clases y métodos abstractos

Una clase abstracta está compuesta de uno o más métodos abstractos, los que
son declarados pero no implementados: No tienen cuerpo, pues las
implementaciones se encuentran en (son responsabilidad de) las subclases.
Puede tener también métodos no abstractos, los que serían comunes para sus
subclases.

Tanto a la clase como a los métodos abstractos debe anteponerse el modificador


abstracten su declaración.

Bastará que una clase contenga un método abstracto para que tenga que ser
declarada también abstracta. Generalmente se requieren por conveniencia en el
diseño de aplicaciones.

Restricciones:

• No puede tener métodos constructores (de creación de objetos).

• Los métodos abstractos no pueden especificarse estáticos. Sería


contradictorio pues los métodos estáticos son declarados para todas las
subclases y no habría forma de proveer una implementación derivada.

• Métodos privados no pueden especificarse como abstract.

Cualquier subclase de una clase abstract debe implementar todos los métodos
abstract de la misma o en todo caso declararlos también como abstract.

Clases y métodos finales

El modificador final es posible aplicar a la declaración de una clase. En este


caso especifica que la clase no puede extenderse, esto es que no puede tener
subclases. No será posible aplicar el concepto de herencia para estas clases.

En el caso de métodos, con el modificador final se especifica que un método


tiene una implementación constante, es decir, no puede ser sobreescrito por
subclase alguna. Puede decirse que es la "versión final".
JAVA Inicial INFOPUC
INSTITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A d e l p er ú

4. Sobrecarga y sobrescritura de métodos

Sobrescritura de métodos (Overriding)

Puede sobrescribirse (volver a especificarse) un método en cada subclase (clase


derivada) de una clase, de manera que cuando sea invocado, se ejecute de
acuerdo a la subclase del objeto en la invocación.

En un árbol de herencia las variables, métodos y constructores son usualmente


sobrescritos, esto es que llevan el mismo nombre que los de la superclase. Al
momento de hacer referencia a un miembro, generalmente se requerirá
especificar el identificador (variable de referencia) de la subclase más reciente,
así:

IdentificadorDeObjeto.Miembro

donde Miembro es una variable o método.

Sin embargo en algunas circunstancias será necesario referirse al miembro de la


superclase. Asimismo existirán ocasiones donde sea necesario establecer
claramente que se quiere hacer referencia al nivel de especialización del
momento.

Para estos casos y con el fin de resolver esta situación, donde dos clases
presentan iguales identificadores para sus miembros, Java provee las facilidades
de referencia this y super.

El árbol de herencia es también llamado jerarquía de clasificación, jerarquía de


especialización, extensión de una clase y otros nombres.

Sobrecarga de métodos (Overloading)

Puede llamarse con el mismo identificador, diferentes implementaciones de un


método en una misma clase, la diferencia debe encontrarse en los parámetros.
El objeto “sabrá” qué implementación ejecutar por el mensaje recibido (por los
parámetros). La sobrecarga también es aplicable al método constructor.

5. Selección de métodos en forma dinámica

Tal como vimos anteriormente, para invocar a un método se utiliza el operador


punto con la variable de referencia de un objeto.

Cuando esto se especifica, el tipo (clase) declarado de la referencia de objeto se


comprueba durante la compilación, para asegurarse de que el método declarado
existe en la clase declarada.
JAVA Inicial INFOPUC
INSTITUTO DE INFORMATICA

p o n t ih c ia UNIVERSIDAD C A T Ó L IC A d e l per ú

Durante la ejecución, la variable de referencia se podría referir a una instancia de


alguna subclase del tipo de referencia declarado. En estos casos Java utiliza la
instancia real para decidir qué método llamar en el caso de que la subclase
sobreescriba el método al que se invoca.

En la figura puede observarse que:

La clase C es subclase de A.

La subclase C sobreescribe el método


m() de A.

En un método main() cualquiera se ha


declarado una variable de referencia
“objetoC” del tipo A, pero se ha
almacenado en esta una referencia a
una instancia de la clase C.

El compilador verificará que A tiene un método llamado m(), pero el intérprete


observa que la referencia es realmente una instancia de C, por lo que llama al
método m() de C.

En caso que el tipo con el que se declara una variable de referencia no tiene un
método, se irá “barriendo” el árbol de herencia hacia las superclases hasta
llamar al método contenido en una clase a la que se extendió.

En el ejemplo de la figura, esto puede apreciarse al invocar al método m() de un


objeto de la subclase F, la que no tenía una implementación (sobreescrita) de
dicho método. El método que finalmente se ejecuta es el de la superclase A.

6. La superclase Object

La clase Object es la clase raíz de todo el árbol de la jerarquía de clases Java, y


proporciona un cierto número de métodos de utilidad general que pueden utilizar
todos los objetos. Por ejemplo, Object proporciona:
• Un método por el que un objeto se puede comparar con otro objeto.
• Un método para convertir un objeto a una cadena de caracteres.
• Un método para esperar a que ocurra una determinada condición.
• Un método para notificar a otros objetos que una condición ha cambiado.
• Un método para devolver la clase de un objeto.

El método equals()
public boolean equals( Object o b j );
JAVA Inicial INFOPUC
IN STITUTO DE INFORMATICA

PONTIFICIA UNIVERSIDAD C A T Ó L IC A c

Todas las clases que se definan en Java heredarán el método equals(), que se
puede utilizar para comparar dos objetos. Esta comparación no es la misma que
proporciona el operador ==, que solamente compara si dos referencias a objetos
apuntan al mismo objeto.

El método equals() se utiliza para saber si dos objetos separados son del mismo
tipo y contienen los mismos datos. El método devuelve true si los objetos son
iguales y false en caso contrario.

Java ya sabe de antemano cómo aplicar el método a todas las clases estándar y
a todos los objetos de los que el compilador tiene conocimiento. Por ejemplo, se
puede usar directamente para saber si dos objetos String son iguales.

Las subclases pueden sobreescribir el método equalsf) para realizar la adecuada


comparación entre dos objetos de un tipo que haya sido definido por el
programador.

Hay que observar que en la lista de argumentos del método equals() hay que
pasarle un argumento de tipo Object. Si se define un método con un argumento
de tipo diferente, se estará sobrecargando el método, no sobreescribiéndolo.

El método toString()
public String toString();

La clase Object dispone de este método que puede usarse para convertir todos
los objetos conocidos por el compilador a algún tipo de representación de
cadena de caracteres, que dependerá del objeto.

Por ejemplo, el método toString() extrae el entero contenido en un objeto Integer.


De forma similar, si se aplica el método toStríng() al objeto Thread, se puede
obtener información importante acerca de los threads y presentarla como cadena
de caracteres.

Este método también se puede sobreescribir, o redefinir, para convertir los


objetos definidos por el programador a cadenas de caracteres.

Otros Métodos

Hay otros métodos útiles en la clase Object. Por ejemplo, el método


protected void finalize();
O también, los métodos que se utilizan en la programación de threads para
hacer que varios threads se sincronicen, como son:

public final void wait();


public final native void wait( long tim eout);
JAVA Inicial
p o n t ir c ia
♦ INFOPUC
INSTITUTO DE INFORMATICA

UNIVERSIDAD C A T Ó L IC A d e l per ú

public final native void notify();


public final native void notifyAII();
que se tratarán cuando se hable del multithreading en Java.

7. Clases internas

Definición.

La clase interna se define dentro de una clase, como si fuera un atributo o un


método adicional de la clase externa. Por esta razón, la clase interna puede
acceder a las variables de instancia (atributos) y métodos declarados en la clase
externa que la contiene.

La relación de una clase interna respecto a la clase externa que la contiene es:
La clase Interna “pertenece a” la clase Externa.

Los modificadores de acceso válidos para la clase interna son: public, protected,
package and prívate.

Construyendo instancia de clase interna

Una clase interna implica un relación entre las clases interna y externa. Una
instancia de una clase interna es asociada con una instancia de su inmediata
clase externa.

Un especial expresión “new” ha sido agregado al lenguaje para soportar este


enlace, por ejemplo:

Externa.Interna varlnterna = varExterna.new lnterna([argumentos]);

Ejemplo de clases internas

En el siguiente ejemplo, la clase "Libro" se encuentra definida dentro de la clase


"Biblioteca" y tiene acceso a todas las variables de instancias y métodos de
"Biblioteca" que la contiene.

public class Biblioteca {


public String dirección = "Av Arequipa 1234 Lince";
public class Libro {
public String titulo = “Java 2”;
public void obtenerTitulo() {
System.out.printlnfEstoy dentro de la clase interna Libro.");
System.out.println("Valor de título es "+titulo);
}
}
public void obtenerDireccion(){
¿S2¡¡¡£& r

JAVA Inicial INFOPUC


IN STITUTO D6 INFORMATICA

PON TIFIC IA UNIVERSIDAD C A T Ó L IC A d e l p er ú

System.out.printlnfEstoy en la clase externa Biblioteca");


}
}
Las referencias a la clase interna se dan de la siguiente manera:

Biblioteca.Libro varLibro = new Biblioteca().new Libro();


System.out.println(“Titulo:” + varLibro.titulo);

La referencia al objeto externo es reemplazada automáticamente como un


parámetro implícito para todos los constructores de la clase interna. Durante la
construcción de la clase interna, se graba con una especial referencia “this” al
objeto externo.

Entonces, hay múltiples referencias “this” (instancia actual) en el ámbito de un


método no estático de la clase interna.

La sintaxis para la referencia automática es Externa.this

Esta referencia habilita el acceso directo a todos los atributos (variables de


instancia) de todos los objetos de la clase externa, por ejemplo
Externa.this.variable.

Múltiples referencias de instancia.

Es posible acceder explícitamente el objeto(s) encerrado, sus campos están


dentro del ámbito del objeto interno. Se podría usar las siguientes referencias
explícitas:

clase Externa{
prívate Date fecha;
private int cant;
class lnterna{
prívate int cant;
prívate Date método(){
int incantidad = cant; // o this.cant, Interna.cant, lnterna.this.cant
int excantidad = Externa.cant; // o Externa.this.cant
return fecha; // o this.fecha, Externa.fecha, Externa.this.fecha
}
}
}

8. Clases internas estáticas

Las clases internas estáticas son utilizadas para el manejo de métodos, sin
necesidad de instanciar la clase interna.

S-ar putea să vă placă și