Facultad de Ingeniería - FI

Anuncio
Facultad de Ingeniería
Java
Autor:
Ing. Israel Durán Martínez
Facultad de Ingeniería
Java
ÍNDICE
ÍNDICE ........................................................................................................................................................... 2
CAPÍTULO 1:
INTRODUCCIÓN A JAVA ...................................................................................... 4
1.1 ORÍGENES ................................................................................................................................................. 4
1.2 ¿QUÉ ES JAVA? ......................................................................................................................................... 5
1.3 CARACTERÍSTICAS .................................................................................................................................... 7
1.4 ¿QUÉ SE PUEDE HACER CON JAVA? ......................................................................................................... 11
CAPÍTULO 2: PROGRAMACIÓN ORIENTADA A OBJETOS Y JAVA ............................... 12
2.1 CLASES ................................................................................................................................................... 12
2.2 OBJETOS ................................................................................................................................................. 13
2.3 ATRIBUTOS Y MÉTODOS .......................................................................................................................... 13
2.4 HERENCIA............................................................................................................................................... 15
2.5 INTERFACES Y PAQUETES ....................................................................................................................... 18
CAPÍTULO 3: FUNDAMENTOS Y SINTAXIS .............................................................................. 21
3.1 COMENTARIOS ........................................................................................................................................ 21
3.2 TIPOS DE DATOS PRIMITIVOS................................................................................................................... 21
3.3 VARIABLES ............................................................................................................................................. 21
3.4 CONSTANTES .......................................................................................................................................... 23
3.5 LITERALES .............................................................................................................................................. 23
3.6 PALABRAS RESERVADAS ......................................................................................................................... 24
3.7 OPERADORES .......................................................................................................................................... 24
3.8 ARREGLOS .............................................................................................................................................. 27
CAPÍTULO 4. CONTROL DE FLUJO ................................................................................................ 30
4.1 SENTENCIA IF-ELSE ................................................................................................................................. 30
4.3 BUCLE FOR ............................................................................................................................................. 30
4.4 BUCLE WHILE ......................................................................................................................................... 31
4.5 BUCLE DO-WHILE ................................................................................................................................... 31
4.6 CONTROL GENERAL DE FLUJO ................................................................................................................. 32
CAPÍTULO 5: CLASES ........................................................................................................................... 34
5.1 DEFINICIÓN DE CLASES ........................................................................................................................... 34
5.2 TIPOS DE CLASE ...................................................................................................................................... 36
5.3 MODIFICADORES DE ACCESO .................................................................................................................. 38
CAPÍTULO 6: OBJETOS........................................................................................................................ 41
6.1 CICLO DE VIDA DE LOS OBJETOS ............................................................................................................. 41
6.2 COMPARACIÓN DE OBJETOS .................................................................................................................... 42
CAPÍTULO 7: MÉTODOS ...................................................................................................................... 44
7.1 IMPLEMENTACIÓN DE MÉTODOS ............................................................................................................. 44
7.2 TIPOS DE MÉTODOS ................................................................................................................................. 45
7.3 RETORNO POR VALOR Y POR REFERENCIA............................................................................................... 46
7.4 SOBREESCRIBIR Y SOBRECARGAR MÉTODOS ........................................................................................... 46
7.5 CONSTRUCTORES .................................................................................................................................... 48
7.6 THIS Y SUPER .......................................................................................................................................... 49
7.7 INTERFACES ............................................................................................................................................ 49
CAPÍTULO 8: EXCEPCIONES ............................................................................................................ 51
Ing. Israel Durán Martínez
2
Facultad de Ingeniería
Java
8.1 CAPTURAR Y MANEJAR EXCEPCIONES..................................................................................................... 52
8.2 LAS SENTENCIAS THROW ........................................................................................................................ 54
8.3 LA CLASE THROWABLE Y SUS SUBCLASES .............................................................................................. 54
8.4 EXCEPCIONES EN TIEMPO DE EJECUCIÓN................................................................................................ 56
CAPÍTULO 9: EJEMPLOS ..................................................................................................................... 58
Ing. Israel Durán Martínez
3
Facultad de Ingeniería
CAPÍTULO 1:
Java
INTRODUCCIÓN A JAVA
1.1 Orígenes
Hace algunos años Sun Microsystems decidió intentar introducirse en el
mercado de la electrónica de consumo y desarrollar programas para pequeños
dispositivos electrónicos. Tras unos comienzos dudosos, Sun decidió crear una filial,
denominada FirstPerson Inc., para dar margen de maniobra al equipo responsable del
proyecto.
El mercado inicialmente previsto para los programas de FirstPerson eran los
equipos
domésticos:
microondas,
tostadoras
y,
fundamentalmente,
televisión
interactiva. Este mercado, dada la falta de sofisticación de los usuarios, requería unas
interfaces mucho más cómodas e intuitivas que los sistemas de ventanas que
proliferaban en el momento.
Otros requisitos importantes eran la fiabilidad del código y la facilidad de
desarrollo. James Gosling, el miembro del equipo con más experiencia en lenguajes de
programación, decidió que las ventajas de eficiencia de C++ no compensaban el gran
coste de pruebas y depuración. Gosling había estado trabajando en su tiempo libre en
un lenguaje de programación que él había llamado Oak, el cual, aun partiendo de la
sintaxis de C++, intentaba remediar las deficiencias que había observado.
Los lenguajes al uso, como C o C++, deben ser compilados para un chip, y si se
cambia el chip, todo el software debe compilarse de nuevo. Esto encarece mucho los
desarrollos y el problema es especialmente acusado en el campo de la electrónica de
consumo. La aparición de un chip más barato y, generalmente, más eficiente, conduce
inmediatamente a los fabricantes a incluirlo en las nuevas series de sus cadenas de
producción, por pequeña que sea la diferencia en precio, ya que, multiplicada por la
tirada masiva de los aparatos, supone un ahorro considerable. Por tanto, Gosling
decidió mejorar las características de Oak y utilizarlo.
El primer proyecto en que se aplicó este lenguaje recibió el nombre de proyecto
Green y consistía en un sistema de control completo de los aparatos electrónicos y el
Ing. Israel Durán Martínez
4
Facultad de Ingeniería
Java
entorno de un hogar. Para ello se construyo un computador experimental denominado
*7(start seven). El sistema presentaba una interfaz basada en la representación de la
casa de forma animada y el control se llevaba a cabo mediante un apantalla sensible al
tacto. En le sistema aparecía Duke. La actual mascota de Java. Posteriormente se
aplicó a otro proyecto denominado VOD(Video On Demand) en el que se empleaba
como interfaz para la televisión interactiva. Ninguno de estos proyectos se convirtió
nunca en un sistema comercial, pero fueron desarrollados enteramente en un Java
primitivo y fueron como su bautismo de fuego.
Una vez que en Sun se dieron cuenta de que a corto plazo la televisión
interactiva no iba a ser un gran éxito, urgieron a FirstPerson a desarrollar con rapidez
nuevas estrategias que produjeran beneficios. No lo consiguieron y FirstPerson cerró
en la primavera de 1994.
Pese a lo que parecía un olvido definitivo, Bill Joy, cofundador de Sun y uno de
los desarrolladores principales de Unix de Berkeley, juzgó que internet podría llegar a
ser el campo de juego adecuado para disputar a Microsoft su primacía casi absoluta en
el terreno del software, y vio en Oak el instrumento idóneo para llevar a cabo estos
planes. Tras un cambio de nombre y algunos de diseño, el lenguaje Java fue
presentado en agosto de 1995.
1.2 ¿Qué es Java?
La tecnología Java consta de un lenguaje de programación y una plataforma.
Lenguaje de Programación
Java es un lenguaje de programación de alto nivel, además de que es orientado
a objetos tiene las siguientes características:

Simple

Orientado a Objetos

Distribuido

Robusto

Seguro

Portátil

interpretado
Ing. Israel Durán Martínez
5
Facultad de Ingeniería

Independiente de la plataforma

Multihilos

Dinámico
Java
Java tiene la característica de que el compilador es el encargado de convertir el
código fuente de un programa en un código intermedio llamado bytecode que es
independiente de la plataforma en que se trabaje y que es ejecutado por el intérprete
de Java que forma parte de la Máquina Virtual de Java.
Ing. Israel Durán Martínez
6
Facultad de Ingeniería
Java
La plataforma Java
Una plataforma es el ambiente de hardware o software en el cual se ejecutan
los programas. En general, la mayoría de las plataformas pueden ser descritas como
una combinación de hardware y sistema operativo. Algunas de las plataformas más
populares son Windows, Solaris, Linux y MacOS.
La plataforma Java difiere de las anteriores en que ésta es una plataforma
basada únicamente en software que corre por encima de las plataformas basadas en
hardware.
La plataforma Java consta de dos componentes:

La Máquina Virtual de Java (JVM): es la que interactúa con el hardware y el
sistema operativo para interpretar el programa.

La Interfaz de Programación de Aplicaciones de Java (API Java): que
son todas aquellas clases ya definidas.
A continuación se muestra una representación de los elementos que forman
parte de la plataforma Java.
1.3 Características
Al igual que otros lenguajes de programación, Java tiene un compilador que se
encarga de realizar un análisis sintáctico y léxico del texto de nuestro programa, entre
otras etapas de la traducción. Una característica especial de Java es que cuando se
compila un programa de Java, no se produce un programa ejecutable (en lenguaje de
maquina) que se pueda correr de inmediato, Java trabajo algo diferente.
Ing. Israel Durán Martínez
7
Facultad de Ingeniería
Java
La mayoría de los lenguajes de programación se caracterizan por ser
interpretados o compilados, lo que determina la manera en como serán ejecutados en
una computadora.
Principales Características:

Simple – Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las
características menos usadas y más confusas de éstos. C++ no es un lenguaje
conveniente por razones de seguridad, pero C y C++ son los lenguajes más
difundidos, por ello Java se diseño para ser parecido a C++ y así facilitar un
rápido y fácil aprendizaje.
Java elimina muchas de las características de otros lenguajes de programación
como C++, para mantener reducidas las especificaciones del lenguaje y añadir
características muy útiles como el garbage collector (reciclador de memoria
dinámica). No es necesario preocuparse de liberar memoria, el reciclador se
encarga de ello y como es de baja prioridad, cuando entra en acción, permite
liberar bloques de memoria muy grandes, lo que limita mucho la fragmentación
de la memoria.
Java reduce en un 50% los errores más comunes de programación con
lenguajes como C y C++ al eliminar muchas de las características de éstos,
entre las que destacan:


Aritmética de punteros.

Registros (struct)

Definición de tipos (typedef)

Macros (#define)

Necesidad de liberar memoria (free)
Orientado a objetos – para algunas personas, la técnica de programación
orientada a objetos (OOP) es meramente una manera de organizar programas,
y que puede ser completada con un lenguaje. El trabajar en un ambiente y
lenguaje orientado a objetos, nos da todas las ventajas de aprovechar todas las
capacidades para crear programas flexibles, modulares, además de poder
reutilizar código.

Distribuido – java se ha construido con extensas capacidades de interconexión
TCP/IP. Existen librerías de rutinas para acceder e interactuar con protocolos
Ing. Israel Durán Martínez
8
Facultad de Ingeniería
Java
como http y ftp. Esto permite a los programadores acceder a la información a
través de la red con tanta facilidad como a los archivos locales.

Robusto – Java realiza verificaciones tanto en tiempo de compilación como en
tiempo de ejecución. La comprobación de tipos en Java ayuda a detectar
errores, lo antes posible, en el ciclo de desarrollo. Java obliga a la declaración
explícita de métodos, reduciendo así las posibilidades de error. Maneja la
memoria para eliminar las preocupaciones por parte del programador de la
liberación o corrupción de memoria.
Además, para asegurar el funcionamiento de la aplicación, realiza una
verificación de los ByteCodes, que son el resultado de la compilación de un
programa Java.

Seguro – el código Java pasa muchas comprobaciones antes de ejecutarse en
una máquina. El código se pasa a través de un verificador de ByteCode que
comprueba el formato de los fragmentos de código y aplica un probador de
teoremas para detectar fragmentos de código ilegal (código que falsea
punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o
clase de un objeto).
Java imposibilita, también, abrir archivos de la máquina local (siempre que se
realizan operaciones con archivos, éstas trabajan sobre el disco duro de la
máquina de donde partió el applet), no permite ejecutar ninguna aplicación
nativa de una plataforma e impide que se utilicen otros computadores como
puente, es decir, nadie puede utilizar una máquina para hacer peticiones o
realizar operaciones con otra. Además, los intérpretes que incorporan los
navegadores Web son aún más restrictivos y por lo tanto los applets están
libres de virus.
Respecto a la seguridad del código fuente, no ya del lenguaje, el propio JDK
proporciona un desemsamblador de ByteCode, que hace que cualquier
programa pueda ser convertido a código fuente, lo que para el programador
significa
una
vulnerabilidad
total
a
su
código.
La
protección
de
los
programadores ante esto es utilizar llamadas a programas nativos, externos
(incluso C y C++) de forma que no sea descompilable todo el código; aunque
así se pierda portabilidad.
Ing. Israel Durán Martínez
9
Facultad de Ingeniería

Java
Portátil – más allá de la portabilidad básica por ser de arquitectura
independiente, Java implementa otros estándares de portabilidad para facilitar
el desarrollo. Los enteros son siempre enteros y, además, enteros de 32 bits en
complemento a 2. Además, Java construye sus interfaces de usuario a través
de un sistema abstracto de ventanas de forma que éstas puedan ser
implementadas en entornos Unís, Pc o Mac.

Interpretado
–
el
intérprete
Java
(sistema
run-time)
puede
ejecutar
directamente el código objeto. Enlazar (linkar) un programa normalmente
consume menos recursos que compilarlo, por lo que los desarrolladores con
Java pasarán más tiempo desarrollando y menos esperando por el computador.
No obstante, el compilador actual del JDK es bastante lento. Por ahora, en que
todavía no hay compiladores específicos de Java para las diversas plataformas,
Java es más lento que otros lenguajes de programación, como C++, ya que
debe ser interpretado y no ejecutado como sucede en cualquier programa
tradicional. No obstante, este panorama está cambiando a pasos agigantados, y
aunque Java sigue siendo básicamente un lenguaje interpretado, la situación se
acerca mucho a la de los programas compilados, sobre todo en lo que se refiere
a la rapidez en la ejecución del código se refiere.

Independiente de la plataforma – nos dice que debido a la forma que java
compila e interpreta los programas, los programas creados en java tienen la
capacidad de poder ser ejecutados en cualquier sistema operativo, sin tener
que volver a compilarlo en un sistema operativo específico.
 Multi-hilos – con java no tenemos la limitación de escribir programas que solo
hagan una cosa a la vez. El soporte para hilos múltiples y sincronizados está
construido directamente en el lenguaje java y el ambiente de ejecución. Los
hilos sincronizados son extremadamente útiles al crear aplicaciones distribuidas
y con soporte para red. Tal es el caso de una aplicación que establece
comunicación con un servidor remoto en un hilo mientras que interactúa con el
usuario en otro hilo.
 Dinámico - Java se beneficia todo lo posible de la tecnología orientada a
objetos y no intenta conectar todos los módulos que comprenden una aplicación
hasta el mismo tiempo de ejecución. Las librerías nuevas o actualizadas no
Ing. Israel Durán Martínez
10
Facultad de Ingeniería
Java
paralizarán la ejecución de las aplicaciones actuales siempre que mantengan el
API anterior.
1.4 ¿Qué se puede hacer con Java?
Con Java se pueden crear applets, servlets, jsp y aplicaciones.
Applet – un applet es un pequeño programa creado en java capaz de ejecutarse en la
máquina cliente por medio del explorador de internet, ya sea Netscape o Internet
Explorer o cualquier browser que tenga la habilidad de manejar java. Los applets son
insertados mediante código HTML en la página de internet, con el fin de que el usuario
que consulte esa página pueda ver en ejecución el applet.
Aplicaciones -
una aplicación en Java es mucho más que un simple programa en
Java, es todo un conjunto de programas que pueden comunicarse entre sí, de manera
que proporcionen toda una interfaz entre el usuario y la computadora.
Servlet – esta tecnología proporciona un mecanismo simple a los desarrolladores web
para extender la funcionalidad de un servidor web y para acceder a sistemas de
negocios existentes. Un servlet puede ser imaginado como un applet que corre del lado
del servidor. Los servlets de java han hecho posible muchas aplicaciones web.
JSP - JavaServer Pages (JSP) es una tecnología basada en el lenguaje java que da la
posibilidad de desarrollar sitios web dinámicos. Esta tecnología fue desarrollada para
permitir el desarrollo del lado del servidor. Los archivos JSP son archivos HTML con
etiquetas especiales que contienen código fuente en java para proporcional el
contenido dinámico.
1.5 Entornos de desarrollo
Entornos de desarrollo integrados para Java hay muchos:

Sun ONE y netbeans de Sun.

Visual Café de Symantec.

JBuilder de Borland.

Kawa de TekTools.

Visual Age Windows de IBM
Ing. Israel Durán Martínez
11
Facultad de Ingeniería
Java
CAPÍTULO 2: PROGRAMACIÓN ORIENTADA A OBJETOS Y JAVA
La programación orientada a objetos es una de las más grandes ideas en el
campo de la programación durante los años recientes, y en cierta forma es más fácil
de manejar que la forma antigua de programación. Todo se reduce a organizar sus
programas en formas que reproducen la manera en que las cosas se unen en el mundo
real.
La programación orientada a objetos (OOP) está modelada sobre cómo, en el mundo
real, los objetos están compuestos de muchos otros tipos pequeños objetos. Esta
capacidad de combinar objetos, sin embargo, solo es un aspecto muy general de la
programación orientada a objetos. La OOP proporciona muchos otros conceptos y
características para crear y usar objetos de manera fácil y flexible, y la más importante
de estas características es el concepto de clase.
2.1 Clases
Definición
Una clase es una plantilla para múltiples objetos con características similares.
Las clases engloban todas las características de una serie particular de objetos.
Cuando se escribe un programa en un lenguaje orientado a objetos, no
definimos objetos en realidad, lo que definimos son clases de objetos.
Por ejemplo, uno podría tener la clase Árbol que describe las características de todos
los árboles (que tienen hojas y raíces, que crece, que produce clorofila, etc.). La clase
Árbol sirve como un modelo abstracto para el concepto de un árbol. Pero para poder
interactuar con un árbol, es decir, para poder tocarlo, cortarlo, etc. debemos de tener
una instancia concreta de ese árbol. Una vez que tenemos la clase Árbol, podemos
crear tantas instancias de un árbol como deseemos, pudiendo cada instancia de la
clase Árbol tener características diferentes (por ejemplo, altura, tipo, etc.) pero lo
importante de esto es que tiene las características y comportamientos de un árbol.
Ing. Israel Durán Martínez
12
Facultad de Ingeniería
Java
2.2 Objetos
Una instancia de una clase es otra palabra para referirse a los objetos. Si una
clase es la representación genérica de un objeto, una instancia es su representación
concreta.
Entonces, ¿Cuál es la diferencia entre una instancia y un objeto? En realidad
ninguna. Objeto es un término más general, pero tanto las instancias como los objetos
son la representación concreta de una clase. De hecho, los términos instancia y objeto
son usados intercambiablemente en un lenguaje de programación orientado a objetos.
Cuando se escribe un programa en Java, se diseña y construye un conjunto de
clases. Luego, cuando el programa se ejecuta, instancias de esas clases son creadas y
manipulados como sea necesario. La tarea de un programador en java, es crear el
conjunto correcto de clases para realizar lo que nuestro programa tenga que realizar.
Afortunadamente, no tenemos que empezar desde cero: el ambiente de java
viene con una librería de clases que implementan mucho del comportamiento básico
que necesita, no solo para las tareas de programación básicas (clases que ofrecen
funciones matemáticas elementales, arreglos, cadenas, entre otros), sino también para
complejas tareas de cómputo, por ejemplo gráficos, trabajo en red, etc. En muchos
casos las bibliotecas de clases Java serán suficientes para que sólo se requiera crear
una clase en el programa Java que utiliza las bibliotecas de clase estándares. Para
otros programas Java más complejos, quizá se tenga que crear un conjunto completo
de clases, con interacciones definidas entre ellas.
2.3 Atributos y métodos
Cada clase que se escribe en java esta generalmente compuesta de dos
componentes: atributos y métodos. Para poder comprender lo anterior, se explicará a
la par con un ejemplo, se trata de una clase llamada Motocicleta.
Atributos
Los atributos son las características individuales que diferencian a un objeto de
otro, y determina la apariencia, el estado u otras cualidades de ese objeto. Los
atributos de una motocicleta podrían incluir los siguientes:
Ing. Israel Durán Martínez
13
Facultad de Ingeniería



Java
Color: rojo, verde, plata, café
Estilo: estándar, moto deportiva
Fabricante: Honda, BMW, Bultaco.
Los atributos de un objeto pueden también incluir información acerca de su
estado; por ejemplo, puede contar con características como condición del motor
(apagado o encendido) o velocidad actual seleccionada.
Los atributos son definidos por variables; de hecho, puede considerarceles
análogos a las variables globales del objeto completo. Puesto que cada instancia de
una clase puede tener diferentes valores para sus variables, a cada variable se le llama
una variable de instancia.
Definición
Las variables de instancia definen los atributos de un objeto. La clase define
el tipo de atributo, y cada instancia almacena su propio valor para ese atributo.
Cada atributo cuenta con una correspondiente variable de instancia; así que, al
cambiar el valor de una variable se cambia el atributo de ese objeto. Las variables de
instancia pueden fijarse cuando se crea un objeto y permanecen constantes durante la
vida del objeto, o bien se pueden habilitar para cambiar como se desee al ejecutarse el
programa.
Métodos (Comportamiento)
El comportamiento de una clase determina que instancias de esa clase
requieran cambiar su estado interno o cuando esa instancia es llamada para realizar
algo por otra clase u objeto. El comportamiento es la única manera en que los objetos
pueden hacerse algo a sí mismos o tener que hacerles algo. Por ejemplo, regresando al
ejemplo de la clase Motocicleta, aquí están algunos comportamientos:





Encender el motor
Apagar el motor
Acelerar
Frenar
Cambiar velocidades
Para definir el comportamiento de un objeto, se crean métodos, los cuales se
parecen y comportan como funciones en otros lenguajes de programación, pero son
Ing. Israel Durán Martínez
14
Facultad de Ingeniería
Java
definidos dentro de una clase. Java no tiene funciones definidas fuera de las clases
(como C++ lo hace).
Definición
Los métodos son funciones definidas dentro de las clases que operan en las
instancias de esas clases.
Los métodos no siempre afectan a un solo objeto; los objetos también se
comunican entre sí mediante el uso de métodos. Una clase u objeto puede llamar a
métodos en otra clase u objeto para avisar sobre los cambios en el ambiente o para
solicitarle a ese objeto que cambie su estado.
2.4 Herencia
La herencia es uno de los conceptos más importantes de la programación
orientada a objetos y tiene un efecto demasiado directo en la forma en que usted
diseña y escribe sus clases Java. La herencia es un poderoso mecanismo, lo que
significa que cuando se escribe una clase, sólo tiene que especificar como esa clase es
diferente de otra case; por tanto, la herencia le dará acceso automático a la
información contenida en esa otra clase.
Con la herencia, todas las clases, están en una jerarquía estricta.
Cada clase tiene una superclase (la clase superior en la jerarquía), y cada clase puede
tener una o más subclases (clases abajo en la jerarquía). Se dice que las clase
inferiores en la jerarquía, heredan de las clases más altas.
Ing. Israel Durán Martínez
15
Facultad de Ingeniería
Java
Jerarquía de Clases




Clase A es la superclase
de B
Clase B es la subclase de A
Clase B es la superclase de
C, D, y E
Las clases C,D, y E son
subclases de B
Las subclases heredan todos los métodos y variables de las superclases; es
decir, en cualquier clase particular, si la superclase define un comportamiento que la
clase necesita, no se tiene que volver a definir o copiar ese código de alguna otra
clase. La clase, en forma automática, obtiene ese comportamiento de la superclase, y
así sucesivamente, hacia arriba de la jerarquía. La clase se convierte entonces en una
combinación de todas las características de las clases arriba de ella, en la jerarquía.
En la cima de la jerarquía de clases en Java esta la clase Object; todas las
clases heredan de esta superclase. Object es la clase más general en la jerarquía de
clases, ya que define el comportamiento heredado por todas las clases en la jerarquía
de clase Java. Cada clase hacia abajo añade más información y se vuelve cada vez
mas de propósito específico. De esta manera se puede pensar en una jerarquía de
clases como la definición de conceptos demasiados abstractos en lo alto de la
jerarquía, y esas ideas se convierten en algo más concreto conforme desciende por la
cadena de la superclase.
La forma en que hereda Java se llama herencia sencilla, lo cual quiere decir que
cada clase Java puede tener sólo una superclase aunque cualquier superclase puede
tener múltiples subclases.
Ing. Israel Durán Martínez
16
Facultad de Ingeniería
Java
Si se va a crear un conjunto más grande de clases, tiene sentido que las clases
no sólo hereden de la jerarquía de clases existentes, sino que también hagan por sí
mismas una jerarquía. Esto podría implicar una planeación previa al organizar el código
Java.
Ejemplo:
Object
Vehículo
Vehículo movidos por
Vehículos movidos
el hombre
por motor
De dos ruedas
Motoneta
De cuatro
ruedas
Motocicleta
Como funciona la herencia
En las variables de instancia, cuando crea una nueva instancia de una clase,
obtiene una “ranura” para cada variable definida en la clase actual, y para cada
variable definida en todas sus superclases. De esta manera, todas las clases se
combinan para formar una plantilla para el objeto actual, y después cada objeto llena
el hueco de la información adecuada para su situación.
Los métodos operan en forma similar: los objetos nuevos tienen acceso a todos
los nombres de métodos de su clase y sus superclases, pero las definiciones de
métodos se eligen en forma dinámica cuando se llama a un método. Es decir, si se
llama a un método de un objeto en particular, Java primero revisa en la clase del
objeto al buscar la definición de ese método. Si no esta definida la clase del objeto,
Ing. Israel Durán Martínez
17
Facultad de Ingeniería
Java
busca en la superclase de la clase, y así en lo sucesivo hacia arriba de la cadena, hasta
que encuentra la definición del método.
Definición del método
Clase
Clase
Clase
Clase
Clase
El mensaje se envía al objeto
y se transmite a las clases
superiores de la jerarquía
hasta encontrar una definición
Objet
o
2.5 Interfaces y Paquetes
Interfaces
Las clases en Java tienen sólo una superclase, y heredan variables y métodos
de esa superclase y de todas sus superclases. Aunque la herencia sencilla hace la
relación entre clases, y la funcionalidad que esas clases implantan es fácil de entender
y de diseñar, también puede ser de alguna manera restrictiva; en particular, cuando
tiene un comportamiento similar que necesita duplicarse mediante diferentes ramas de
la jerarquía de clase. Java soluciona este problema al utilizar el concepto de interfaz.
Definición
Una interfaz es una colección de nombres de métodos, sin definición en
realidad, que indican que una clase tiene un conjunto de comportamientos en adición a
los comportamientos que hereda de su superclase.
Ing. Israel Durán Martínez
18
Facultad de Ingeniería
Java
Aunque una clase Java puede tener sólo una superclase (a causa de la herencia
sencilla), esa clase también puede implantar cualquier número de interfaces. Al
implantar una interfaz, una clase proporciona implantaciones de métodos para los
nombres de métodos definidos por la interfaz. Si dos clases muy diferentes implantan
la misma interfaz, ambas pueden responder a la misma llamada del método, aunque lo
que cada clase hace en respuesta a esas llamadas del método puede ser distinto.
Paquetes
El elemento fundamental de este lenguaje son las clases. Existe, sin embargo,
un elemento de mayor rango llamado paquete, que no es más que un contenedor de
clases. Actúan a modo de librerías y existen más que nada por comodidad. Para
agrupar varios ficheros fuente de Java en un sólo paquete incluiremos una línea al
comienzo de los mismos:
package mipaquete;
Y el código resultante (los ficheros con extensión class) se situarían en el
directorio mipaquete. Pertenecerían al paquete mipaquete. Para poder utilizarlos desde
otro programa deberíamos utilizar la sentencia import, que también se coloca al
principio del programa (aunque después de package):
import mipaquete.*;
Hay que indicar que import es una palabra clave que indica las clases que
deseamos cargar, no los paquetes. Sin embargo, al admitir el uso del comodín *, se
puede utilizar para cargar paquetes enteros. Por ejemplo, si deseamos utilizar la clase
Date, situada en el paquete java.util, podemos cargarla de dos maneras:
import java.util.Date;
import java.util.*;
Algunos paquetes de Java
Ing. Israel Durán Martínez
19
Facultad de Ingeniería
Java
Existen muchos paquetes en la librería estándar de Java, paquetes que,
además, han ido variando según se sucedían las versiones del mismo. Así, pues,
vamos a destacar algunos paquetes presentes en todos los JDK:
java.lang
Este paquete incluye las clases imprescindibles para que el lenguaje Java
funcione como tal, es decir, clases como Object, Thread, Exception, System, Integer,
Float, Math, Package, String, etc., que implementan la base del lenguaje. No es
necesario importar nada desde ese paquete porque se carga por defecto.
java.util
Este paquete es el segundo en importancia, ya que incluye muchas clases útiles
como pueda ser Date (fecha) y, sobre todo, diversas clases que permiten el
almacenamiento dinámico de información, como Vector, LinkedList, HashMap, etc..
java.applet
Contiene la archifamosa clase Applet, que nos permite crear applets para verlos
en nuestro navegador.
java.awt
Este paquete, cuyo nombre corresponde a las siglas de Abstract Windowing
Toolkit, contiene las clases necesarias para crear interfaces de usuario, por medio de
menús, botones, áreas de texto, cajas de confirmación, etc..
java.io
Este paquete contiene las clases necesarias para realizar las operaciones de
entrada/salida, ya sea a pantalla o a ficheros, clases heredadas de FileInputStream y
FileOutputStream.
java.net
Paquete que permite la programación de aplicaciones que accedan a bajo nivel
a redes TCP/IP.
Ing. Israel Durán Martínez
20
Facultad de Ingeniería
Java
CAPÍTULO 3: FUNDAMENTOS Y SINTAXIS
3.1 Comentarios
/* Este es un comentario
de varias líneas */
// Este es un comentario de una sola línea
/** Comentario de documentación que interpreta Javadoc */
O
tr
o
s
R
ea
le
s
En
te
ro
s
3.2 Tipos de datos primitivos
Tipo
byte
short
int
long
float
double
char
boolean
Descripción
Entero de 1 Byte
Entero corto
Entero
Entero largo
Punto flotante precisión sencilla
Punto flotante doble precisión
Caracter
valor booleano (true o false)
Formato
8 bits en complemento a dos
16 bits en complemento a dos
32 bits en complemento a dos
64 bits en complemento a dos
32 bits según IEEE 754
64 bits según IEEE 754
Código Unicode de 16 bits
En otros lenguajes de programación, el formato y el tamaño de los tipos
primitivos de datos dependerá de la plataforma en la cual se corra el programa. En
contraste, Java especifica el tamaño y el formato de estos tipos primitivos de datos.
Por lo tanto, no importa en la plataforma en que sé este trabajando ya que los tipos
primitivos de datos siempre conservaran el mismo valor.
3.3 Variables
Declaración
Tipo_dato nombre_variable = valor_inicio;
Tipos de Variables
Ing. Israel Durán Martínez
21
Facultad de Ingeniería
Java
Las variables son localidades de memoria en las que pueden almacenarse datos.
Cada una tiene un nombre, un tipo y valor. Java tiene tres tipos de variables: de
instancia, de clase y locales.

Variables de instancia.
Se utilizan para definir los atributos de un objeto.

Variables de clase.
Son similares a las variables de instancia, con la excepción de que sus valores
son los mismos para todas las instancias de la clase.

Variable locales.
Se declaran y se utilizan dentro de las definiciones de los métodos.
Nombre de las variables

El nombre de las variables no debe de pertenecer al conjunto de las
palabras reservadas.

El nombre de las variables empiezan con una letra minúscula y los
nombres de las clases empiezan con una letra mayúscula. Si el nombre
de la variable consiste en más de una palabra, las palabras van unidas y
la primera letra después de la primera palabra se empieza con una letra
mayúscula; al igual que en el nombre de las clases.
Ejemplo:
int varEntera;
int varEntera = 2;
String varCadena = “variable de cadena”;
boolean varBooleana = true;
char varChar = ‘a’;
En caso de que no se inicialicen las variables de instancia y de clase con algún
valor, el compilador de java les asignará los siguientes valores por default:
Cadenas: null;
Números: 0;
Booleanos: false;
Carácter: ‘\0’;
Las variables locales siempre se inicializan.
Ing. Israel Durán Martínez
22
Facultad de Ingeniería
Java
Alcance de las Variables
3.4 Constantes
Las constantes son útiles para definir valores comunes para todos los métodos
de un objeto (para dar nombres significativos a valores de objetos generales que
nunca cambiarán). En Java, puede crear constantes sólo para variables de instancia o
de clase, no para variables locales.
Para declarar una constante se utiliza la palabra clave final antes de la
declaración de la variable.
Ejemplos:
final flota PI = 3.141592;
final bolean DERECHA = true,
final int MAXIMO_VALOR = 100;
3.5 Literales
número
número[l|L]
0[X|x]hex
0octal
[número].número
número[D|d]
número[F|f]
[+|-] número
Ing. Israel Durán Martínez
Tipo int
Tipo long
Entero hexadecimal
Entero octal
Tipo double
Tipo double
Tipo float
Con signo
23
Facultad de Ingeniería
númeroenúmero
númeroEnúmero
‘caracter’
“caracteres”
\b
\t
\n
\r
\”
\’
\\
\uNNNN
true
false
Java
Exponencial
Exponencial
Tipo char
Cadena (String)
Caracter retroceso
Tabulador
Salto de línea (Enter)
Regreso de carro
Comillas
Comilla sencilla
Diagonal inversa
Caracter en Unicode (NNNN es hexadecimal)
Booleano
Booleano
3.6 Palabras reservadas
abstract
boolean
break
byte
case
catch
char
class
const*
continue
default
do
double
else
extends
final
finally
float
for
goto*
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
strictfp**
super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while
3.7 Operadores
Operadores Aritméticos
Operador
+
*
/
%
Sintaxis
op1 + op2
+op
op1 - op2
-op
op1 * op2
op1 / op2
op1 % op2
Ing. Israel Durán Martínez
Descripción
Suma de op1 y op2
Convierte op a int, si este es byte, short o char
Resta op2 de op1
Regresa el valor negativo de op
Multiplicación de op1 por op2
División de op1 entre op2
Residuo de dividir op1 por op2
24
Facultad de Ingeniería
Java
Operadores Incremento y Decremento
Operador
Sintaxis
++
op++
++
++op
--
op--
--
--op
Descripción
Incremento de op en 1. Se toma el valor de op
antes de incrementarse
Incremento de op en 1. Se toma el valor de op
después de incrementarse
Decremento de op en 1. Se toma el valor de
op antes de Decrementarse
Decremento de op en 1. Se toma el valor de
op después de Decrementarse
Operadores Relacionales
Operador
>
>=
<
<=
==
!=
Sintaxis
op1 > op2
op1 >= op2
op1 < op2
op1 <= op2
op1 == op2
op1 != op2
Regresa true si:
op1 es mayor que op2
op1 es mayor o igual a op2
op1 es menor que op2
op1 es menor o igual a op2
op1 y op2 son iguales
op1 y op2 son diferentes
Operadores Condicionales
Operador
Regresa true si:
Sintaxis
&&
op1 && op2
op1 y op2 son ambos true. Condicionalmente evalua op2.
||
op1 || op2
op1 ó op2 es true. Condicionalmente evalua op2.
!
!op
op es false
&
op1 & op2
op1 y op2 son ambos true.Siempre evalua op1 y op2.
|
op1 | op2
op1 ó op2 es true.Siempre evalua op1 y op2.
^
op1 ^ op2
op1 y op2 son diferentes
Estas expresiones regresan true o false.
Ing. Israel Durán Martínez
25
Facultad de Ingeniería
Java
Operadores a nivel de bits
Operador
Sintaxis
Operación
&
op1 & op2
and a nivel de bits
|
op1 | op2
or a nivel de bits
^
op1 ^ op2
xor a nivel de bits
~
~op2
complemento a uno
>>
op1 >> op2
Corrimiento de bits a la derecha de op1 en op2 posiciones
<<
op1 << op2
Corrimiento de bits a la izquierda de op1 en op2 posiciones
>>>
op1 >>> op2
Corrimiento de bits a la derecha de op1 en op2 posiciones (unsigned)
Otros Operadores
Operador
Descripción
?:
Operador condicional. Simulación de if-else.
[]
Para declarar, crear y accesar arreglos.
.
Acceso a miembros de instancia y de clase
( params )
Lista de parámetros separados por coma.
( tipo )
Conversión de tipo al tipo específicado (cast)
new
instanceof
Crea un nuevo objeto o arreglo
Determina si un operando es una instancia de otro.
Ing. Israel Durán Martínez
26
Facultad de Ingeniería
Java
Menor precedencia <---------------->Mayor Precedencia
Precedencia de operadores
Operadores posfijos
[] . (params ) expr ++ expr --
Operadores unarios
++expr --expr +expr -expr ~ !
Creación o cast
new (type )expr
Multiplicativos
* / %
Aditivos
+ -
Corrimiento
<< >> >>>
Relacionales
< > <= >= instanceof
Igualdad
== !=
AND a nivel de bits
&
XOR a nivel de bits
^
OR a nivel de bits
|
AND lógico
&&
OR lógico
||
Op. Condicional
Asignación
? :
= += -= *= /= %= &= ^= |= <<= >>= >>>=
3.8 Arreglos
Los arreglos en java son diferentes con respecto a los de otros lenguajes de
programación; en Java son verdaderos objetos que pueden pasarse y tratarse de la
misma manera que otros objetos.
Los arreglos son una forma de almacenar una lista de elementos. Cada espacio
del arreglo guarda un elemento individual en el cual se pueden colocar los elementos o
cambiar el contenido de esos espacios según se necesite.
Los arreglos pueden tener cualquier tipo de valor de elemento (tipo primitivo u
objetos), pero no podrá almacenar diferentes tipos en un solo arreglo. Es factible tener
un arreglo de enteros o un arreglo de cadenas, o un arreglo de arreglos, pero no
tendrá un arreglo que contenga, por ejemplo, cadenas y enteros.
El tamaño de un arreglo es establecido cuando el arreglo es creado.
Ing. Israel Durán Martínez
27
Facultad de Ingeniería
Java
Cómo declarar variables de arreglo
El primer paso para crear un arreglo es crear una variable que guarde el
arreglo, justo como lo haría con cualquier otra variable. Así como cuando se declaran
variables de otro tipo, la declaración de un arreglo consta de dos componentes: el tipo
de arreglo y el nombre del arreglo. Un tipo de arreglo es escrito así: tipo[], donde tipo
es el tipo de dato de los elementos del arreglo, y los corchetes ([]) indican que es un
arreglo. Recuerde que los elementos de un arreglo son de un mismo tipo. Los
siguientes son enunciados de variables de arreglo comunes:
Tipo_arreglo nombre_arreglo[];


String palabras[];
int numeros[];
Un método alterno para definir una variable de arreglo es colocar los corchetes
después del tipo, en lugar de en seguida de la variable. Estos dos métodos son
equivalentes, pero con frecuencia el segundo es más legible.
Tipo_arreglo[] nombre_arreglo;


String[] palabras;
int[] numeros;
Cómo crear objetos de arreglo
Existen dos formas de crear un objeto de arreglo y asignarlo a una variable. Las
dos formas son las siguientes:


Usar new.
Inicializar de manera directa el contenido de ese arreglo.
La primera forma de hacerlo implica el uso del operador new para crear una
nueva instancia de un arreglo:
tipo_arreglo[] nombre_arreglo = new tipo_arreglo[tamaño_arreglo];
o también:
tipo_arreglo[] nombre_arreglo;
nombre_arreglo = new tipo_arreglo[tamaño_arreglo];
String colores[];  Declaración
colores = new String[5];  Creación del arreglo
Ing. Israel Durán Martínez
28
Facultad de Ingeniería
Java
String[] colores = new String[5];
La línea crea un nuevo arreglo de Strings con cinco slots (casillas) conteniendo
los elementos. Cuando crea un nuevo objeto de arreglo con new deberá indicar
cuantas casillas tendrá ese arreglo.
Los objetos de arreglo pueden contener tipos primitivos o boléanos, de la
misma forma que contienen objetos.
Cuando se crean objetos de arreglo mediante el uso de new, todas sus casillas
se inicializan por default(0 para arreglos numéricos, false para booleanos, ‘\0’ para
arreglos de caracteres y null para objetos). También puede crear e inicializar un
arreglo al mismo tiempo; en lugar de utilizar new para crear un objeto de arreglo
distinto, encierre los elementos del arreglo dentro de llaves, separados por comas:
String[] colores = {“azul”, “rojo”, “amarillo”, “negro”, “blanco”};
Cada uno de los elementos dentro de las llaves debe ser del mismo tipo y debe
coincidir con el tipo de la variable que contiene ese arreglo.
Acceso a los elementos del arreglo
Una vez que se tenga un arreglo con valores iniciales, puede probar y cambiar
los valores de cada casilla de ese arreglo. Para lograr lo anterior se hace lo siguiente:
nombreArreglo[indice]=dato_a_ingresar;
Recuérdese que los índices comienzan desde cero y que el dato a ingresar debe
ser del tipo de dato del arreglo.
Obtener el tamaño de un arreglo
Para obtener el tamaño de un arreglo se hace lo siguiente:
nombreArreglo.length
Se debe de tomar en cuenta que length no es un método sino que es una
propiedad que proviene de la plataforma de java para todos los arreglos.
Ing. Israel Durán Martínez
29
Facultad de Ingeniería
Java
CAPÍTULO 4. CONTROL DE FLUJO
El control de flujo es la manera que tiene un lenguaje de programación de hacer
que el flujo de la ejecución avance y se ramifique en función de los cambios de estado
de los datos. Java, en este aspecto, no utiliza los principios de diseño orientado a
objetos, sino que las sentencias de control de flujo del programa se han tomado de
C/C++. A continuación se tratan todos los mecanismos que proporciona Java para
conseguir este control y decidir qué partes del código ejecutar.
4.1 Sentencia if-else
If (expresión booleana)
{
sentencias;
}
[else
{
sentencias;
}]
La cláusula else es opcional. Cada una de las sentencias puede ser compuesta y
la expresión booleana podría ser una variable simple declarada como bolean, o bien
una expresión que utilice operadores relacionales para generar el resultado de una
comparación.
4.2 Sentencia switch
switch (expresión)
{
case valor1: sentencias;
break;
case valor2: sentencias;
break;
[default: sentencias;]
}
La expresión puede devolver cualquier tipo básico, y cada uno de los valores
especificados en las sentencias case debe ser de un tipo compatible.
4.3 Bucle for
Ing. Israel Durán Martínez
30
Facultad de Ingeniería
Java
for (inicialización; terminación; iteración)
{
sentencias;
}
Un bucle for, normalmente, involucra a tres acciones en su ejecución:

Inicialización de la variable de control.

Comprobación del valor de la variable de control en una expresión condicional.

Actualización de la variable de control.
La cláusula de inicio y la cláusula de incremento pueden estar compuestas por
varias expresiones separadas mediante el operador coma (,), que en estos bucles Java
también soportan.
for(a=0, b=1; a < 7; a++; b+=2)
4.4 Bucle while
[inicialización;]
while (terminación expresión booleana)
{
sentencias;
[iteración;]
}
El bucle while es la sentencia de bucle más básica en Java. Ejecuta
repetidamente una vez tras otra una sentencia mientras una expresión booleana sea
verdadera. Las partes de inicialización e iteración, que se presentan entre corchetes,
son opcionales.
4.5 Bucle do-while
[inicialización;]
do
{
sentencias;
[iteración;]
}
while(terminación expresión booleana)
Ing. Israel Durán Martínez
31
Facultad de Ingeniería
Java
A veces se puede desear el ejecutar el cuerpo de un bucle while al menos una
vez, incluso si la expresión booleana de terminación tiene el valor false la primera vez;
es decir, si se desea evaluar la expresión de terminación al final del bucle en vez de al
principio como en el bucle while.
4.6 Control general de flujo
break
break [etiqueta];
La sentencia break puede utilizarse en una sentencia switch o en un bucle.
Cuando se encuentra en una sentencia switch, break hace que el control del flujo del
programa pase a la siguiente sentencia que se encuentra fuera del entorno del switch.
Si se encuentra en un bucle, hace que el flujo de ejecución del programa deje el
ámbito del bucle y pase a la siguiente sentencia que venga a continuación del bucle.
Java incorpora la posibilidad de etiquetar la sentencia break, de forma que el
control pasa a sentencias que no se encuentran inmediatamente después de la
sentencia switch o del bucle, es decir, saltará a la sentencia en donde se encuentre
situada la etiqueta. La sintaxis de una sentencia etiquetada es la siguiente:
etiqueta: sentencia;
continue
continue [etiqueta];
La sentencia continue no se puede utilizar en una sentencia switch, sino
solamente en bucles. Cuando se encuentra esta sentencia en el discurrir normal de un
programa Java, la iteración en que se encuentre el bucle finaliza y se inicia la
siguiente.
Java permite el uso de etiquetas en la sentencia continue, de forma que el
funcionamiento normal se ve alterado y el salto en la ejecución del flujo del programa
se realizará a la sentencia en la que se encuentra colocada la etiqueta.
Ing. Israel Durán Martínez
32
Facultad de Ingeniería
Java
Ejemplo:
uno: for( )
{
dos: for( )
{
continue;
//seguiría en el bucle interno
continue uno; //seguiría en el bucle principal
break uno;
//se saldría del bucle principal
}
}
return
return expresión;
La
sentencia
return
se
utiliza
para
terminar
un
método
o
función
y
opcionalmente devolver un valor al método de llamada.
Ing. Israel Durán Martínez
33
Facultad de Ingeniería
Java
CAPÍTULO 5: CLASES
Las clases son lo más simple de Java. Todo en Java forma parte de una clase,
es una clase o describe como funciona una clase. El conocimiento de las clases es
fundamental para poder entender los programas Java.
5.1 Definición de clases
Todas las acciones de los programas Java se colocan dentro del bloque de una
clase o un Objeto. Un objeto es una instancia de una clase. Todos los métodos se
definen dentro del bloque de la clase, Java no soporta funciones o variables globales.
Así pues, el esqueleto de cualquier aplicación Java se basa en la definición de una
clase.
Para crear una clase sólo se necesita un archivo fuente que contenga la palabra
clave reservada class seguida de un identificador legal y un bloque delimitado por dos
llaves para el cuerpo de la clase.
Ejemplo:
class MiClase
{
//Cuerpo de la clase
}
Un archivo de Java debe tener el mismo nombre que la clase que contiene, y se
les suele asignar la extensión ".java". Por ejemplo la clase llamada MiClase se
guardaría en un fichero que se llamase MiClase.java. Hay que tener presente que en
Java se diferencia entre mayúsculas y minúsculas; el nombre de la clase y el de
archivo fuente han de ser exactamente iguales.
Aunque la clase MiClase es sintácticamente correcta, lo que se viene a llamar
una clase vacía, es decir, una clase que no hace nada. Las clases típicas de Java
incluirán variables y métodos de instancia. Los programas en Java completos
constarán por lo general de varias clases de Java en distintos archivos fuente.
Ing. Israel Durán Martínez
34
Facultad de Ingeniería
Java
La forma general de una definición de clase es:
En la declaración de una clase se utiliza la palabra clave extends para
especificar la superclase, de la siguiente forma:
class MiClase extends SuperClase
{
// Cuerpo de la clase
}
Una clase puede implementar una o más interfaces, declarándose esto
utilizando la palabra clave implements, seguida de la lista de interfaces que
implementa, separadas por coma (,), de la forma:
class MiClase extends SuperClase implements MiInterfaz, TuInterfaz
{
// Cuerpo de la clase
}
Ing. Israel Durán Martínez
35
Facultad de Ingeniería
Java
El cuerpo de la clase contiene las declaraciones, y posiblemente la inicialización,
de todos los datos miembro, tanto variables de clase como variables de instancia, así
como la definición completa de todos los métodos.
5.2 Tipos de clase
public
Las clases public son accesibles desde otras clases, bien sea directamente o por
herencia, desde clases declaradas fuera del paquete que contiene a esas clases
públicas, ya que, por defecto, las clases solamente son accesibles por otras clases
declaradas dentro del mismo paquete en el que se han declarado. Para acceder desde
otros paquetes, primero tienen que ser importadas. La sintaxis es:
public class MiClase extends SuperClase implements MiInterfaz, TuInterfaz
{
// cuerpo de la clase
}
abstract
Una clase abstract tiene al menos un método abstracto. Una clase abstracta no
se instancia, sino que se utiliza como clase base para la herencia.
final
Una clase final se declara como la clase que termina una cadena de herencia, es
lo contrario a una clase abstracta. Nadie puede heredar de una clase final. Por
ejemplo, la clase Math es una clase final.
synchronizable
Este modificador especifica que todos los métodos definidos en la clase son
sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde
distintas tareas; el sistema se encarga de colocar los flags necesarios para evitarlo.
Ing. Israel Durán Martínez
36
Facultad de Ingeniería
Java
Este mecanismo hace que desde tareas diferentes se puedan modificar las
mismas variables sin que haya problemas de que se sobrescriban.
Si no se utiliza alguno de los modificadores expuestos, por defecto, Java asume
que una clase es:

No final

No abstracta

Subclase de la clase object

No implementa interfaz alguna
5.2.1 Clase Abstractas
Hay ocasiones en las que se quiere definir una superclase en la que se declare
la estructura de una determinada abstracción sin implementar completamente
cada método, es decir, en la que sólo se defina una forma generalizada que
será compartida por todas las subclase, dejando que cada subclase complete los
detalles necesarios. Una clase de este tipo determina la naturaleza de los
métodos que las subclases deben implementar.
Por lo tanto son clases cuya definición es incompleta. Una clase abstracta
declara métodos pero no tiene que implementarlos.

Los métodos no implementados se declaran como abstract.
abstract tipo nombre(parámetros);

Una clase con un método abstracto debe declararse como clase
abstracta.
abstract class NombreClase{}

Una clase puede declararse como abstracta aunque no tenga ningún
método abstracto.

Las subclases de una clase abstracta deben sobreescribir todos los
métodos abstractos de la superclase, o bien, ser declaradas como clases
abstractas.

Una clase abstracta no puede instanciarse.
5.2.2 Interfaces
Ing. Israel Durán Martínez
37
Facultad de Ingeniería
Java
Con el uso de interfaces se puede especificar lo que una clase debe hacer, pero
no cómo hacerlo. Solo se declara el comportamiento pero no se implementa.
Una interfaz se define como una clase pero carecen de variables de instancia.
Una vez definida, cualquier número de clases pueden implementar una interfaz.
modificador_acceso interface NombreInterfaz
{
Código de la interfaz
}
class NombreClase implements NombreInterfaz1, NombreInterfaz2
{
}

Una clase puede implementar cualquier número de interfaces

Por defecto todos sus métodos son públicos y abstractos.
public abstract tipo nombre(parámetros);

Por defecto todos sus atributos son públicos, constantes y de clase.
public static final NOMBRE = valor;

Permite simular algunos aspectos de la herencia múltiple.

La clase que implemente una interfaz debe de hacer la implementación
de todos los métodos de la interfaz.

Si la clase no implementa a todos los métodos de la interfaz debe ser
declarada como abstracta.
5.3 Modificadores de acceso
El control de acceso se aplica siempre a nivel de clase, no a nivel de objeto. Es
decir, los métodos de instancia de un objeto de una clase determinada tienen acceso
directo a los miembros privados de cualquier otro objeto de la misma clase.
Ing. Israel Durán Martínez
38
Facultad de Ingeniería
Java
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso
que se quiere para las variables de instancia y los métodos definidos en la clase:
private, protected, public y package.
La siguiente tabla muestra el nivel de acceso que está permitido a cada uno de
los especificadotes:
Nivel de acceso
clase
subclase
paquete
private
X
protected
X
X*
X
public
X
X
X
package
X
Todos
X
X
Se puede observar en la tabla que la columna clase indica que todos los
métodos de una clase tienen acceso a todos los otros miembros de la misma clase,
independientemente del nivel de acceso especificado.
La columna subclase se aplica a todas las clases heredadas de la clase,
independientemente del paquete en que residan. Los miembros de una subclase tienen
acceso a todos los miembros de la superclase que se hayan designado como public. El
asterisco (*) en la intersección subclase-protected quiere decir que si una clase es a la
vez subclase y está en el mismo paquete que la clase con un miembro protected,
entonces la clase tiene acceso a ese miembro protegido.
En general, si la subclase no se encuentra en el mismo paquete que la
superclase, no tiene acceso a los miembros protegidos de la superclase. Los miembros
de una subclase no tienen acceso a los miembros de la superclase catalogados como
private o package, excepto a los miembros de la superclase designados como package.
La columna paquete indica que las clases del mismo paquete tienen acceso a los
miembros de una clase, independientemente de su árbol de herencia. La tabla indica
que todos los miembros protected, public y package de una clase pueden ser accedidos
por otra clase que se encuentre en el mismo paquete excepto las descritas como
private.
Ing. Israel Durán Martínez
39
Facultad de Ingeniería
Java
La columna todos indica que los privilegios de acceso para métodos que no
están en la misma clase, ni en una subclase, ni en el mismo paquete, se encuentran
restringidos a los miembros públicos de la clase.
Private
Sin modificador
protected
Public
Misma clase
Sí
Sí
Sí
Sí
Misma subclase de paquete
No
Sí
Sí
Sí
Misma no-subclase de paquete
No
Sí
Sí
Sí
Subclase de diferente paquete
No
No
Sí
Sí
diferente No
No
No
Sí
No-subclase
de
paquete
Ing. Israel Durán Martínez
40
Facultad de Ingeniería
Java
CAPÍTULO 6: OBJETOS
6.1 Ciclo de vida de los objetos
Un objeto es una instancia de una clase. En Java la creación de un objeto se
realiza en tres pasos:

Declaración, proporcionar un nombre al objeto.
NombreClase nombreObjeto;

Instanciación, asignar memoria al objeto.
nombreObjeto = new NombreClase();

Inicialización, opcionalmente se pueden proporcionar valores iniciales a las
variables de instancia del objeto.
NombreObjeto = new NombreClase(/*parámetros del constructor*/);
Cómo obtener valores
Para obtener el valor de una variable de instancia se utiliza la notación de
punto.
Con la notación de punto, un nombre de variable de instancia o de clase tendrá
dos partes: el objeto, al lado izquierdo del punto y la variable, al lado derecho.
Por ejemplo, si se tiene un objeto llamado objeto1 y ese objeto tiene una
variable llamada var, se referirá al valor de esta manera:
objeto1.var;
Esta forma de tener acceso a las variables es una expresión, asimismo son
expresiones a ambos lados del punto. Es decir, puede anidar el acceso a las variables
de instancia. Si var mantiene un objeto, y éste tiene su propia variable de instancia
llamada estado, puede hacerse referencia a él de esta manera:
objeto1.var.estado;
Ing. Israel Durán Martínez
41
Facultad de Ingeniería
Java
Las expresiones de punto se evalúan de izquierda a derecha, así que se
empieza con la variable var de objeto1, la cual se dirige a otro objeto con la variable
estado. Al final se tendrá el valor de esa variable.
Cómo cambiar valores
Asignar un valor a una variable también se utiliza el operador punto. Solo se le
agrega el operador de asignación al lado derecho de la expresión.
objeto1.var.estado = true;
6.2 Comparación de objetos
Los únicos operadores que nos servirán para comparar objetos serán los de
igualdad: == (igual) y != (diferente). Estos operadores cuando se utilizan con objetos,
prueban si los dos operandos se refieren con exactitud al mismo objeto.
Un buen ejemplo de lo anterior es la clase String. Es posible tener dos cadenas,
dos objetos independientes en memoria con los mismos valores; es decir, los mismos
caracteres en el mismo orden. De acuerdo con el operador ==, no obstante, estos dos
objetos String no serán iguales, ya que aunque su contenido es el mismo, no serán el
mismo objeto.
En consecuencia, la clase String define un método llamado equals() que
examina cada carácter en la cadena true, si las dos cadenas tienen los mismos valores.
class ComparacionObjetos
{
public static void main(String args[])
{
String cad1, cad2;
cad1 = "Cadena numero uno";
cad2 = cad1;
System.out.println("Cadena 1: " + cad1);
System.out.println("Cadena 2: " + cad2 + "\n");
System.out.println("¿Es el mismo objeto? " + (cad1==cad2) + "\n");
cad2 = new String(cad1);
System.out.println("Cadena 1: " + cad1);
Ing. Israel Durán Martínez
42
Facultad de Ingeniería
Java
System.out.println("Cadena 2: " + cad2 + "\n");
System.out.println("¿Es el mismo objeto? " + (cad1==cad2));
System.out.println("¿Tienen el mismo valor? " + cad1.equals(cad2));
}
}
La salida es la siguiente:
Cadena 1: Cadena numero uno
Cadena 2: Cadena numero uno
¿Es el mismo objeto? true
Cadena 1: Cadena numero uno
Cadena 2: Cadena numero uno
¿Es el mismo objeto? false
¿Tienen el mismo valor? Trae
En la primera parte de este programa se declaran dos variables, cad1 y cad2,
asignándole la cadena “Cadena numero uno” a cad1, y luego asigna ese valor a cad2.
entonces cad1 y cad2 apuntan al mismo objeto, y esto se verifica en la siguiente línea:
System.out.println("¿Es el mismo objeto? " + (cad1==cad2) + "\n");
En la segunda parte se crea un nuevo objeto de cadena, con el valor de cad1
(cad2 = new String(cad1);). Ahora se tienen dos diferentes objetos de cadena con
el mismo valor. entonces se prueban con el operador == y los examina con el método
equals() para comparar sus valores.
Ing. Israel Durán Martínez
43
Facultad de Ingeniería
Java
CAPÍTULO 7: MÉTODOS
Los métodos son sin duda alguna la parte más importante de cualquier lenguaje
orientado a objetos. Mientras que las clases y los objetos ofrecen la estructura, y las
variables de clase y de instancia una manera de contener los atributos y el estado de
esa clase u objeto, los métodos son los que en realidad determinan el comportamiento
del objeto y definen como interactúa con otros en el sistema . La implementación de un
método consta de dos partes, una declaración y un cuerpo.
7.1 Implementación de métodos
La implementación de métodos cuenta con cuatro partes básicas:

El nombre del método.

El tipo de objeto o tipo primitivo que el método regresa.

Una lista de parámetros.

El cuerpo del método.
La declaración completa de un método es la que se muestra a continuación:
controlAcceso static abstract final native synchronized tipoRetorno nombreMetodo(lista_argumentos)
{
cuerpo del método
}
En la parte superior lo que esta en negrillas es la parte que es obligatoria o las
partes básicas que contiene el método a la hora de su declaración.
controlAcceso, determina si otros objetos pueden acceder al método y cómo
pueden hacerlo.
static, indica que los métodos pueden ser accedidos sin necesidad de instanciar
un objeto del tipo que determina la clase.
abstract, indica que el método no está definido en la clase, sino que se
encuentra declarado ahí para ser definido en una subclase(sobrescrito).
final, evita que un método pueda ser sobrescrito.
Ing. Israel Durán Martínez
44
Facultad de Ingeniería
Java
native, son métodos escritos en otro lenguaje.
synchronized, se usa en el soporte de la multitarea.
lista_argumentos, es la lista opcional de parámetros a pasar al método. Es un
conjunto de declaraciones de variables separadas por comas dentro de los paréntesis.
Estos parámetros se vuelven variables locales en el cuerpo del método, cuyos valores
son los objetos o los valores primitivos transmitidos cuando se llama al método.
Dentro del cuerpo de un método puede tener enunciados, expresiones, llamadas de
métodos a otros objetos, condicionales, ciclos y demás.
7.2 Tipos de métodos
En Java existen dos tipos de métodos. Los métodos de instancia y los métodos
de clase.
Métodos de instancia
Cuando se incluye un método en una definición de una clase Java sin utilizar la
palabra clave static, se está generando un método de instancia. Aunque cada objeto de
la clase no contiene su propia copia de un método, el resultado final es como si fuese
así, como si cada objeto dispusiese de su propia copia del método.
La llamada a los métodos de instancia en Java se realiza utilizando el nombre
del objeto, el operador punto y el nombre del método.
miObjeto.nombreMetodo();
Los métodos de instancia tienen acceso tanto a las variables de instancia como
a las variables de clase.
Métodos de Clase
Cuando en la declaración de un método se incluye la palabra reservada static,
se obtiene un método de clase.
Ing. Israel Durán Martínez
45
Facultad de Ingeniería
Java
Lo más significativo de los métodos de clase es que pueden ser invocados sin
necesidad de que haya que instanciar ningún objeto de la clase.
La llamada a los métodos de clase se realiza con el nombre de la clase, el
operador punto y el nombre del método.
MiClase.nombreMetodo();
7.3 Retorno por valor y por referencia
En Java es imprescindible que a la hora de la declaración de un método, se
indique el tipo de dato que ha de devolver. Si no devuelve ningún valor, se indicará el
tipo void como retorno.
Todos los tipos primitivos en Java se devuelven por valor y todos los objetos se
devuelven por referencia.
Para devolver un valor se utiliza la palabra clave return. La palabra clave return
va seguida de una expresión que será evaluada para saber el valor de retorno. Esta
expresión puede ser compleja o puede ser simplemente el nombre de un objeto, una
variable de tipo primitivo o una constante.
Si un programa Java devuelve una referencia a un objeto y esa referencia no es
asignada a ninguna variable, o utilizada en una expresión, el objeto se marca
inmediatamente para que el reciclador de memoria en su siguiente ejecución devuelva
la memoria ocupada por el objeto al sistema, asumiendo que la dirección no se
encuentra ya almacenada en ninguna otra variable.
El tipo del valor de retorno debe coincidir con el tipo de retorno que se ha
indicado en la declaración del método; aunque en Java, el tipo actual de retorno puede
ser una subclase del tipo que se ha indicado en la declaración del método.
7.4 Sobreescribir y sobrecargar métodos
Algunas de las características que hacen de los métodos sean tan poderosos son
las siguientes:
Ing. Israel Durán Martínez
46
Facultad de Ingeniería

Java
Sobrecargar métodos: métodos con múltiples identificaciones y definiciones,
pero con el mismo nombre.

Sobrescribir métodos: creando una definición distinta para un método definido
en una superclase.
Sobrecargar métodos
La sobrecarga de métodos le permite a las instancias de su clase tener una
interfaz más sencilla para otros objetos (no hay necesidad de métodos por completo
diferentes que realizan en esencia lo mismo) y comportarse en forma diferente en base
a la entrada a ese método.
Cuando se llama a un método en un objeto, Java hace coincidir su nombre,
número y tipo de argumentos para seleccionar que definición de método ejecutar.
Para crear un método sobrecargado, todo lo que se necesita hacer es crear
varias definiciones distintas de método en la clase, todas con el mismo nombre, pero
con diferentes listas de parámetros (ya sea en número o tipo de argumentos). Java
permite la sobrecarga de métodos siempre que cada lista de parámetros sea única
para el mismo nombre del método.
Java diferencia los métodos sobrecargados con el mismo nombre, basado en el
número y tipo de parámetros de ese método, no en su tipo de retorno (return). Si se
intenta crear dos métodos con el mismo nombre, la misma lista de parámetros, pero
con diferentes tipos de retorno, obtendrá un error de compilador. Los nombres de
variables que escoja para cada parámetro son irrelevantes, lo que importa es el
número y el tipo.
Sobrescribir Métodos
Cuando se llama a un método en un objeto, Java busca su definición en la clase
de ese objeto, y si no la encuentra, pasa la llamada del método hacia una jerarquía
mayor hasta encontrar una definición del mismo. La herencia le permite definir y
utilizar métodos de forma repetida en las subclases sin tener que duplicar el código.
Ing. Israel Durán Martínez
47
Facultad de Ingeniería
Java
Sin embargo, habrá ocasiones en que se desee que un objeto responda a los
mismos métodos, pero que tenga diferente comportamiento cuando llame a un
método. En este caso, se puede sobrescribir. Esto implica definir un método en una
subclase que tenga la misma identificación de otro en una superclase. Entonces,
cuando se llama al método, el de la subclase se busca y se ejecuta, en lugar del que
está en la superclase.
Para sobrescribir un método, todo lo que se tiene que hacer es crear uno en la
subclase que tenga la misma identificación (nombre, tipo de retorno, lista de
parámetros) de otro definido en una de las superclases. Puesto que Java ejecuta la
primera definición del método que encuentra que coincide con la identificación, esto en
forma eficiente oculta la definición del original.
7.5 Constructores
Un método constructor es una clase especial de método que determina cómo se
inicializa un objeto cuando se crea.
A diferencia de los métodos ordinarios, no se puede llamar a un método
constructor en forma directa; en su lugar, Java los llama de manera automática de
este modo: cuando usa new para crear una nueva instancia de una clase, Java realiza
tres acciones:

Asigna memoria para un objeto.

Inicializa las variables de instancia de ese objeto, ya sea con sus valores
iniciales o por el valor predeterminado( 0 para números, null para objetos, false
para booleanos y ´\0´ para caracteres).

Llama al método constructor de la clase.
Los constructores son muy parecidos a los métodos ordinarios, con dos diferencias
básicas:

Siempre tienen el mismo nombre de la clase.

No tienen un tipo de retorno (return).
Ing. Israel Durán Martínez
48
Facultad de Ingeniería
Java
Al igual que los métodos ordinarios, los constructores también pueden tomar
varios números y tipos de parámetros, lo que le permite crear exactamente su objeto
con las propiedades que desee que tenga, o para que este pueda calcular propiedades
a partir de distintas formas de entrada.
7.6 This y super
this
En el cuerpo de una definición de método, tal vez desee referirse al objeto
actual (el objeto que el método llamó) para referirse a las variables de instancia de ese
objeto o para pasar el objeto actual como un argumento a otro método. Para referirse
al objeto actual en estos casos se puede usar la palabra this, la cual alude al objeto
actual y puede utilizarla en cualquier lugar en que éste aparezca.
super
super es un concepto que no existe en C++, al menos no con una
implementación similar a Java. Si un método sobrescribe un método de una
superclase, se puede utilizar la palabra clave super para eludir la versión sobrescrita de
la clase e invocar a la versión original del método en la superclase. Del mismo modo,
se puede utilizar super para acceder a variables miembro de la superclase.
7.7 Interfaces
Los métodos abstractos son útiles cuando se quiere que cada implementación
de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para
utilizar esos métodos abstractas. Las interfaces proporcionan un mecanismo para
abstraer los métodos a un nivel superior, lo que permite simular la herencia múltiple
de otros lenguajes.
Una interfaz sublima el concepto de clase abstracta hasta su grado más alto.
Una interfaz podrá verse simplemente como una forma, es como un molde, solamente
permite declarar nombres de métodos, listas de argumentos, tipos de retorno y
adicionalmente miembros datos (los cuales podrán ser únicamente tipos básicos y
serán tomados como constantes en tiempo de compilación, es decir, static y final).
Ing. Israel Durán Martínez
49
Facultad de Ingeniería
Java
Una interfaz contiene una colección de métodos que se implementan en otro
lugar. Los métodos de una interfaz son public, static y final.
Para implementar una interfaz en una clase se utiliza la palabra clave
implements seguida del nombre de la interfaz.
class MiClase implements Interface1, Interface2, ... , IntefaceN
{
//Cuerpo de la clase.
}
El aspecto más importante del uso de interfaces es que múltiples objetos de
clases diferentes pueden ser tratados como si fuesen de un mismo tipo común, en
donde este tipo viene indicado por el nombre de la interfaz.
Aunque se puede considerar el nombre de la interfaz como un tipo de prototipo
de referencia a objetos, no se pueden instanciar objetos en sí del tipo interfaz. La
definición de una interfaz no tiene constructor, por lo que no es posible invocar el
operador new sobre un tipo interfaz.
Una interfaz puede heredar de varios interfaces sin ningún problema. Sin
embargo, una clase solamente puede heredar de una clase base, pero puede
implementar varias interfaces. La plataforma Java 2 ofrece la posibilidad de definir una
interfaz vacía, como es el caso de Serialize, que permite serializar un objeto. Una
interfaz vacía se puede utilizar como un marcador para marcar a una clase con una
propiedad determinada.
Ing. Israel Durán Martínez
50
Facultad de Ingeniería
Java
CAPÍTULO 8: EXCEPCIONES
Una excepción es un objeto que describe una condición excepcional, es decir un
error que ha ocurrido en una parte del código. Cuando surge una condición
excepcional, se crea un objeto que representa esa excepción y se envía al método que
ha originado el error. Ese método puede decidir entre gestionar el mismo la excepción
o pasarla. En cualquiera de los dos casos, en algún punto, la excepción es capturada y
procesada. Las excepciones pueden ser generadas por el intérprete Java o por el
propio código. Las excepciones generadas por java se refieren a errores fundamentales
que violan las reglas del lenguaje Java o las restricciones del entorno de ejecución de
Java.
Las excepciones en Java están destinadas, al igual que en resto de los lenguajes
que las soportan, para la detección y corrección de errores. Si hay un error, la
aplicación no debería morirse. Se debería lanzar (throw) una excepción que a su vez
debería capturarse (catch) y resolver la situación de error, o bien poder ser tratada
finalmente (finally) por un gestor por defecto. Utilizadas en forma adecuada, las
excepciones aumentan en gran medida la robustez de las aplicaciones.
La
gestión
excepcionalmente
de
excepciones
poderoso
para
en
controlar
Java
proporciona
programas
que
un
mecanismo
tengan
muchas
características dinámicas durante su ejecución. Las excepciones son formas muy
limpias de manejar errores y problemas inesperados en la lógica del programa, y no
deben considerarse como un mecanismo general de ramificaciones o un tipo de
sentencias de salto.
Muchas clases de errores pueden utilizar excepciones -- desde serios problemas
de hardware, como la avería de un disco duro, a los simples errores de programación,
como tratar de acceder a un elemento de un array fuera de sus límites. Cuando dicho
error ocurre dentro de un método Java, el método crea un objeto 'exception' y lo
maneja fuera, en el sistema de ejecución. Este objeto contiene información sobre la
excepción, incluyendo su tipo y el estado del programa cuando ocurrió el error. El
sistema de ejecución es el responsable de buscar algún código para manejar el error.
En terminología java, crear una objeto exception y manejarlo por el sistema de
ejecución se llama lanzar una excepción.
Ing. Israel Durán Martínez
51
Facultad de Ingeniería
Java
Después de que un método lance una excepción, el sistema de ejecución entra
en acción para buscar el manejador de la excepción. El conjunto de "algunos" métodos
posibles para manejar la excepción es el conjunto de métodos de la pila de llamadas
del método donde ocurrió el error. El sistema de ejecución busca hacia atrás en la pila
de llamadas, empezando por el método en el que ocurrió el error, hasta que encuentra
un método que contiene el "manejador de excepción" adecuado.
Un manejador de excepción es considerado adecuado si el tipo de la excepción
lanzada es el mismo que el de la excepción manejada por el manejador. Así la
excepción sube sobre la pila de llamadas hasta que encuentra el manejador apropiado
y una de las llamadas a métodos maneja la excepción, se dice que el manejador de
excepción elegido captura la excepción.
Si el sistema de ejecución busca exhaustivamente por todos los métodos de la
pila de llamadas sin encontrar el manejador de excepción adecuado, el sistema de
ejecución finaliza (y consecuentemente y el programa Java también).
8.1 Capturar y manejar excepciones
Las excepciones lanzadas por un método que pueda hacerlo deben recogerse en
un bloque try/catch o try/finally.
Bloque try
El primer paso en la construcción de un manejador de excepciones es encerrar
las sentencias que podrían lanzar una excepción dentro de un bloque try. En general,
este bloque se parece a esto.
try
{
Sentencias Java;
}
El segmento de código etiquetado sentencias java está compuesto por una o
más sentencias legales de Java que podrían lanzar una excepción.
Ing. Israel Durán Martínez
52
Facultad de Ingeniería
Java
Se dice que el bloque try gobierna las sentencias encerradas dentro de él y
define el ámbito de cualquier manejador de excepción (establecido por su subsecuente
bloque catch) asociado con él. En otras palabras, si ocurre una excepción dentro del
bloque try, esta excepción será manejada por el manejador de excepción asociado con
esta sentencia try.
Una sentencia try debe ir acompañada de al menos un bloque catch o un bloque
finally.
Bloque catch
Se
pueden
asociar
manejadores
de
excepción
a
una
sentencia
try
proporcionando uno o más bloques catch directamente después del bloque try.
try
{
. . .
}
catch(. . .)
{
. . .
}
catch(. . .)
{
. . .
}
. . .
No puede haber ningún código entre el final de la sentencia try y el principio de
la primera sentencia catch. La forma general de una sentencia catch en Java es esta.
catch (AlgunObjetoThrowable nombreVariable)
{
Sentencias Java
}
La sentencia catch requiere un sólo argumento formal. Este argumento parece
un
argumento
de
una
declaración
de
método.
El
tipo
del
argumento
AlgunObjetoThrowable declara el tipo de excepción que el manejador puede manejar y
debe ser el nombre de una clase heredada de la clase
Throwable definida en el
paquete java.lang. (Cuando los programas Java lanzan una excepción realmente están
lanzado un objeto, sólo pueden lanzarse los objetos derivados de la clase Throwable.
Ing. Israel Durán Martínez
53
Facultad de Ingeniería
Java
NombreVariable es el nombre por el que el manejador puede referirse a la
excepción capturada.
Se puede acceder a las variables y métodos de las excepciones en la misma
forma que accede a los de cualquier otro objeto. getMessage() es un método
proporcionado por la clase Throwable que imprime información adicional sobre el error
ocurrido. La clase Throwable también implementa dos métodos para rellenar e
imprimir el contenido de la pila de ejecución cuando ocurre la excepción. Las subclases
de Throwable pueden añadir otros métodos o variables de ejemplar, Para buscar qué
métodos implementar en una excepción, se puede comprobar la definición de la clase y
las definiciones de las clases antecesoras.
Bloque finally
El paso final en la creación de un manejador de excepción es proporcionar un
mecanismo que limpie el estado del método antes (posiblemente) de permitir que el
control pase a otra parte diferente del programa. Se puede hacer esto encerrando el
código de limpieza dentro de un bloque finally.
8.2 Las sentencias throw
Todos los métodos Java utilizan la sentencia throw para lanzar una excepción.
Esta sentencia requiere un sólo argumento, un objeto Throwable. En el sistema
Java, los objetos lanzables son ejemplares de la clase Throwable definida en el paquete
java.lang.
throw algunObjetoThrowable;
Si se intenta lanzar un objeto que no es 'lanzable', el compilador rehusa la
compilación del programa y muestra un mensaje de error similar a éste:
testing.java:10: Cannot throw class java.lang.Integer; it must be a subclass of class java.lang.Throwable.
throw new Integer(4);
8.3 La clase throwable y sus subclases
Ing. Israel Durán Martínez
54
Facultad de Ingeniería
Java
Sólo se pueden lanzar objetos que estén derivados de la clase Throwable. Esto
incluye descendientes directos (esto es, objetos de la clase Throwable) y descendiente
indirectos (objetos derivados de hijos o nietos de la clase Throwable).
La clase Throwable tiene dos descendientes directos: Error y Exception.
Error
Cuando falla un enlace dinámico, y hay algún fallo "hardware" en la máquina
virtual, ésta lanza un error. Típicamente los programas Java no capturan los Errores.
Pero siempre lanzarán errores.
Exception
La mayoría de los programas lanzan y capturan objetos derivados de la clase
Exception.
Una Excepción indica que ha ocurrido un problema pero que el problema no es
demasiado serio.
La mayoría de los programas que se escriben lanzarán y capturarán
excepciones.
La clase Exception tiene muchos descendiente definidos en los paquetes Java.
Estos descendientes indican varios tipos de excepciones que pueden ocurrir. Por
ejemplo, IllegalAccessException señala que no se puede encontrar un método
particular, y NegativeArraySizeException indica que un programa intenta crear un
array con tamaño negativo.
Una subclase de Exception tiene un significado especial en el lenguaje Java:
RuntimeException.
Ing. Israel Durán Martínez
55
Facultad de Ingeniería
Java
8.4 Excepciones en Tiempo de Ejecución
La clase RuntimeException representa las excepciones que ocurren dentro de la
máquina virtual Java (durante el tiempo de ejecución). Un ejemplo de estas
excepciones es NullPointerException, que ocurre cuando un método intenta acceder a
un miembro de un objeto a través de una referencia nula. Esta excepción puede ocurrir
en cualquier lugar en que un programa intente desreferenciar una referencia a un
objeto. Frecuentemente el coste de chequear estas excepciones sobrepasa los
beneficios de capturarlas.
Como las excepciones en tiempo de ejecución están omnipresentes e intentar
capturar o especificarlas todas en todo momento podría ser un ejercicio infructuoso (y
un código infructuoso, imposible de leer y de mantener), el compilador permite que
estas excepciones no se capturen ni se especifiquen.
Los paquetes Java definen varias clases RuntimeException. Se pueden capturar
estas excepciones al igual que las otras. Sin embargo, no se require que un método
especifique que lanza excepciones en tiempo de ejecución. Además puedes crear sus
propias subclases de RuntimeException.
Ing. Israel Durán Martínez
56
Facultad de Ingeniería
Ing. Israel Durán Martínez
Java
57
Facultad de Ingeniería
Java
CAPÍTULO 9: EJEMPLOS
1. Hola
//Se compila como: javac Hola.java generándose un archivo con extensión (*.class), es decir, Hola.class
//Se interpreta como: java Hola
/*
La clase Hola implementa una aplicación que
despliega " ¡Hola Mundo! " por la salida estandar
*/
class Hola
{
public static void main(String[] args)
{
System.out.println(" ¡Hola Mundo! ");
}
}
//Despliega la cadena
2. Variables Locales
// Las variables locales siempre deben de inicializarse
class InicializaLocales
{
public static void main(String arg[])
{
int a = 2;
//Declaración de una variable local tipo entera.
String c = "cadena"; //Declaración de una variable local tipo cadena.
boolean b = true;
//Declaración de una variable local tipo booleana.
char h = 'a';
//Declaración de una variable local tipo carácter.
System .out.println("a: " + a + "\n" + "c: " + c + "\n" + "b: " + b + "\n" + "h: " + h);
}
}
3. Variables de Clase y de instancia
// Valores por default de las variables de instancia y de clase
class ValoresDefault
{
static int a;
static String c;
boolean b;
char h;
//Declaración de una variable de clase tipo entera.
//Declaración de una variable de clase tipo cadena.
//Declaración de una variable de instancia tipo booleana.
//Declaración de una variable de instancia tipo carácter.
public static void main(String arg[])
{
ValoresDefault vd = new ValoresDefault();
System .out.println("a: " + a + "\n" + "c: " + ValoresDefault.c + "\n" + "b: " + vd.b +
"\n" + "h: " + vd.h);
}
}
Ing. Israel Durán Martínez
58
Facultad de Ingeniería
Java
4. Clases y objetos
class Motocicleta
{
String marca;
//VARIABLE DE INSTANCIA
String color;
//VARIABLE DE INSTANCIA
boolean estadoMotor;
//VARIABLE DE INSTANCIA
static int numeroRuedas=2;
//VARIABLE DE CLASE
void encenderMotor()
{
if(estadoMotor==true)
System.out.println("Ya estaba encendido");
else
{
estadoMotor=true;
System.out.println("Motor encendido ahora");
}
}
void mostrarAtributos()
{
System.out.println("Esta motocicleta es una " + this.marca + " color " + this.color + "
numero de ruedas = " + numeroRuedas);
if(estadoMotor==true)
System.out.println("Motor Encendido");
else
System.out.println("Motor Apagado");
}
RADICA
public static void main(String[] args)
{
Motocicleta m1=new Motocicleta();
int a=Motocicleta.numeroRuedas;
//PRUEBA VARIABLE DE CLASE. LA a ES LOCAL
System.out.println("EL NUMERO DE RUEDAS ES: " + a + ", MARCA: " + m1.marca);
//PRUEBA VARIABLE DE INSTANCIA
//PARA UTILIZAR VARIABLES DE INSTANCIA SE DEBE CREAR LA INSTANCIA EN DONDE
m1.marca="Yamaha";
m1.color="Roja";
System.out.println("\n*MOSTRANDO ATRIBUTOS DE m1\n");
m1.mostrarAtributos();
System.out.println("\n*ENCENDIENDO MOTOR DE m1\n");
m1.encenderMotor();
System.out.println("\n*MOSTRANDO ATRIBUTOS DE m1\n");
m1.mostrarAtributos();
System.out.println("\n*ENCENDIENDO MOTOR DE m1\n");
m1.encenderMotor();
System.out.println("-----------------------------------------");
Motocicleta m2=new Motocicleta();
m2.marca="Kawasaki";
m2.color="Negra";
System.out.println("\n*MOSTRANDO ATRIBUTOS DE m2\n");
m2.mostrarAtributos();
System.out.println("-----------------------------------------");
Motocicleta m3 = new Motocicleta();
m3.marca = "Dukati";
m3.color = "Amarilla";
Ing. Israel Durán Martínez
59
Facultad de Ingeniería
}
}
Java
System.out.println("\n*MOSTRANDO ATRIBUTOS DE m3\n");
m3.mostrarAtributos();
System.out.println("\n*ENCENDIENDO MOTOR DE m3\n");
m3.encenderMotor();
System.out.println("\n*MOSTRANDO ATRIBUTOS DE m3\n");
m3.mostrarAtributos();
System.out.println("\n*ENCENDIENDO MOTOR DE m3\n");
m3.encenderMotor();
System.out.println("-----------------------------------------");
5. Máximo valor de las variables
public class MaxVariables
{
public static void main(String args[])
{
// enteros
byte maxByte = Byte.MAX_VALUE;
short maxShort = Short.MAX_VALUE;
int maxInteger = Integer.MAX_VALUE;
long maxLong = Long.MAX_VALUE;
// reales
float maxFloat = Float.MAX_VALUE;
double maxDouble = Double.MAX_VALUE;
}
}
// impresion
System.out.println("El
System.out.println("El
System.out.println("El
System.out.println("El
System.out.println("El
System.out.println("El
máximo
máximo
máximo
máximo
máximo
máximo
valor
valor
valor
valor
valor
valor
tipo
tipo
tipo
tipo
tipo
tipo
byte es " + maxByte);
short es " + maxShort);
int es " + maxInteger);
long es " + maxLong);
float es " + maxFloat);
double es " + maxDouble);
6. Constantes
//Se utiliza la palabra final para declarar constantes.
class Constante
{
static final double PI = 3.1416;
final double E = 2.76554;
public static void main(String a[])
{
Constante c = new Constante();
System.out.println("PI * 2 = " + PI*2);
System.out.println("E = " + c.E);
}
}
Ing. Israel Durán Martínez
60
Facultad de Ingeniería
Java
7. Operadores Aritméticos
public class OpAritmeticos
{
public static void main(String[] args)
{
int i=37;
int j=42;
double x=27.475;
double y=7.22;
System.out.println("\nVALORES DE LAS VARIABLES\n");
System.out.println("
System.out.println("
System.out.println("
System.out.println("
i= " + i);
j= " + j);
x= " + x);
y= " + y);
//SUMANDO NUMEROS
System.out.println("\nSUMANDO\n");
System.out.println(" i+j= " +(i+j));
System.out.println(" x+y= " +(x+y));
//RESTANDO NUMEROS
System.out.println("\nRESTANDO\n");
System.out.println(" i-j= " +(i-j));
System.out.println(" x-y= " +(x-y));
//MULTIPLICANDO NUMEROS
System.out.println("\nMULTIPLICANDO\n");
System.out.println(" i*j= " +(i*j));
System.out.println(" x*y= " +(x*y));
//DIVIDIENDO NUMEROS
System.out.println("\nDIVIDIENDO\n");
System.out.println(" i/j= " +(i/j));
System.out.println(" x/y= " +(x/y));
DIVISION
}
}
//CALCULANDO EL RESIDUO DE DIVISIONES. DEVUELVE RESIDUO ENTERO DE LA
System.out.println("\nRESIDUOS\n");
System.out.println(" i%j= " +(i%j));
System.out.println(" x%y= " +(x%y));
//MEZCLANDO TIPOS
System.out.println("\nMEZCLANDO TIPOS\n");
System.out.println(" j+y= " +(j+y));
System.out.println(" i*x= " +(i*x));
8. Incremento y Decremento
public class IndDec
{
public static void main(String arg[])
{
int x=0;
int y=0;
Ing. Israel Durán Martínez
61
Facultad de Ingeniería
}
Java
System.out.println("x = " + x + "; y = " + y);
x++;
System.out.println("x++ = " + x);
++x;
System.out.println("++x = " + x);
x = 0;
y = x++;
System.out.println("x = " + x);
System.out.println("y = " + y);
y = ++x;
System.out.println("x = " + x);
System.out.println("y = " + y);
}
9. Operadores Relacionales
public class OpRelacionales
{
public static void main(String[] args)
{
//Declaración de 3 variables locales
int i = 37;
int j = 42;
int k = 42;
System.out.println("Imprimiendo el Valor de las variables...");
System.out.println(" i = " + i);
System.out.println(" j = " + j);
System.out.println(" k = " + k);
//Mayor que
System.out.println("Mayor que...");
System.out.println(" i > j es " + (i > j));
System.out.println(" j > i es " + (j > i));
System.out.println(" k > j es " + (k > j));
//false
//true
//false
//Mayor o igual que
System.out.println("Mayor o igual que...");
System.out.println(" i >= j es " + (i >= j)); //false
System.out.println(" j >= i es " + (j >= i)); //true
System.out.println(" k >= j es " + (k >= j)); //true
//Menor que
System.out.println("Menor que...");
System.out.println(" i < j es " + (i < j));
System.out.println(" j < i es " + (j < i));
System.out.println(" k < j es " + (k < j));
//true
//false
//false
//Menor o igual que
System.out.println("Menor o igual que...");
System.out.println(" i <= j es " + (i <= j)); //true
System.out.println(" j <= i es " + (j <= i)); //false
System.out.println(" k <= j es " + (k <= j)); //true
//Igual a
System.out.println("Igual a...");
System.out.println(" i == j es " + (i == j)); //false
System.out.println(" k == j es " + (k == j)); //true
}
//Diferente a
System.out.println("Diferente a...");
System.out.println(" i != j es " + (i != j)); //true
System.out.println(" k != j es " + (k != j)); //false
Ing. Israel Durán Martínez
62
Facultad de Ingeniería
Java
}
10. Operadores a nivel de Bits
public class Bits
{
static final
static final
static final
static final
int
int
int
int
VISIBLE = 1;
DRAG = 2;
SELECTO = 4;
EDITABLE = 8;
public static void main(String[] args)
{
int bandera = 0;
bandera = bandera | VISIBLE;
bandera = bandera | DRAG;
if ((bandera & VISIBLE) == VISIBLE)
{
if ((bandera & DRAG) == DRAG)
{
System.out.println("La bandera es Visible y Drag.");
}
}
bandera = bandera | EDITABLE;
}
}
if ((bandera & EDITABLE) == EDITABLE)
{
System.out.println("La bandera tambien es Editable.");
}
11. Arreglos
public class ArregloCadenas
{
public static void main(String[] args)
{
String[] arreglo = { "CADENA UNO", "Cadena Dos", "Cadena Tres" };
for (int i = 0; i < arreglo.length; i++)
System.out.println(arreglo[i].toLowerCase());
}
}
12. Argumentos desde la pantalla
class ArgumentosMain
{
public static void main(String arg[])
{
System.out.println(arg.length + " ARGUMENTOS INTRODUCIDOS: ");
for(int i=0;i<arg.length;i++)
System.out.println("args[" + i + "]" + " = " + arg[i]);
Ing. Israel Durán Martínez
63
Facultad de Ingeniería
}
Java
}
13. Arreglo de Arreglos
public class ArregloDeArreglo
{
public static void main(String[] args)
{
String[][] caricaturas = {
{"Picapiedra","Fred","Wilma","Pebbles","Dino"},
{"Marmol","Barney","Betty","Bam Bam"},
{"Supersonicos","George","Jane","Elroy","Judy","Rosie","Astro"},
{"Scooby Doo","Shaggy","Velma","Fred","Daphne"}
};
}
}
for (int i = 0; i < caricaturas.length; i++)
{
System.out.print(caricaturas[i][0] + ": ");
for (int j = 1; j < caricaturas[i].length; j++)
{
System.out.print(caricaturas[i][j] + " ");
}
System.out.println();
}
14. Arreglo de Arreglo (2)
public class ArregloDeArreglo2
{
public static void main(String[] args)
{
int[][] matriz = new int[4][];
//Inicializo el numero de Renglones
for (int i = 0; i < matriz.length; i++)
{
matriz [i] = new int[5];
//Inicializo el numero de columnas
for (int j = 0; j < matriz [i].length; j++)
{
matriz [i][j] = i + j;
}
}
}
}
for (int i = 0; i < matriz.length; i++)
{
for (int j = 0; j < matriz [i].length; j++)
{
System.out.print(matriz [i][j] + " ");
}
System.out.println();
}
Ing. Israel Durán Martínez
64
Facultad de Ingeniería
Java
15. Ordena Números
public class OrdenaNumeros
{
public static void main(String[] args)
{
int[] arregloEnteros = new int[10];
arregloEnteros[0]
arregloEnteros[1]
arregloEnteros[2]
arregloEnteros[3]
arregloEnteros[4]
arregloEnteros[5]
arregloEnteros[6]
arregloEnteros[7]
arregloEnteros[8]
arregloEnteros[9]
=
=
=
=
=
=
=
=
=
=
32;
87;
3;
589;
12;
1076;
2000;
8;
622;
127;
for (int i = arregloEnteros.length; --i >= 0; )
{
for (int j = 0; j < i; j++)
{
if (arregloEnteros [j] > arregloEnteros [j+1])
{
int temp = arregloEnteros [j];
arregloEnteros [j] = arregloEnteros [j+1];
arregloEnteros [j+1] = temp;
}
}
}
}
}
for (int i = 0; i < arregloEnteros.length; i++)
System.out.print(arregloEnteros [i] + " ");
16. Métodos de clase y de instancia
//Métodos de clase y de instancia
class Metodos
{
static int suma(int a, int b)
{
return(a + b);
}
int resta(int a, int b)
{
return(a - b);
}
public static void main(String arg[])
{
Metodos m = new Metodos();
System.out.println("La suma es: " + suma(2,4));
Ing. Israel Durán Martínez
65
Facultad de Ingeniería
}
}
Java
System.out.println("La resta es: " + m.resta(1,3));
System.out.println("La raiz cuadrada es: " + Math.sqrt(4));
17. Retorno por valor y por referencia
/**
* Este ejemplo ilustra el retorno de valores tanto por referencia
* como por valor
*/
// Un objeto de esta clase sera devuelto por referencia
class MiClase
{
int varInstancia = 10;
}
class ValorReferencia
{
// Metodo que devuelve por Valor
int retornoPorValor()
{
return( 5 ); // Devuelve un tipo primitivo por valor
}
// Metodo que devuelve por Referencia
MiClase retornoPorReferencia()
{
return( new MiClase() ); // Devuelve un objeto por referencia
}
public static void main( String args[] )
{
// Instancia un objeto
ValorReferencia obj = new ValorReferencia();
System.out.println( "El Valor devuelto es "+obj.retornoPorValor() );
}
System.out.println(
"El Valor de la variable de instancia en el objeto devuelto es "+
obj.retornoPorReferencia().varInstancia ); // Atencion a los dos puntos
}
18. Sobrecargar Métodos
/* métodos con el mismo nombre pero con diferentes listas de parámetros */
import java.awt.Point;
class Rect
{
int
int
int
int
x1=0;
y1=0;
x2=0;
y2=0;
public void construyeRect(int x1, int y1, int x2, int y2)
{
this.x1=x1;
Ing. Israel Durán Martínez
66
Facultad de Ingeniería
}
Java
this.y1=y1;
this.x2=x2;
this.y2=y2;
public void construyeRect(Point i, Point d)
{
x1=i.x;
y1=i.y;
x2=d.x;
y2=d.y;
}
public void imprime()
{
System.out.println(x1 + " " + y1 + " " + x2 + " " + y2);
}
public static void main(String args[])
{
Rect r=new Rect();
r.construyeRect(12,12,34,34);
r.imprime();
}
}
Point a=new Point(10,10);
r.construyeRect(a, new Point(20,20));
r.imprime();
19. Sobrescribir Métodos, this y super
/*******************************************************************************************
***********
public class ImprimeClase
{
int x = 0;
int y = 1;
public void imprimeme()
{
System.out.println("X = " + x);
System.out.println("Y = " + y);
System.out.println("Soy una instancia de la clase: " +
this.getClass().getName());
}
}
/*******************************************************************************************
***********
class ImprimeSubclase extends ImprimeClase
{
int z = 3;
}
public static void main(String args[])
{
ImprimeSubclase obj = new ImprimeSubclase();
obj.imprimeme();
}
Ing. Israel Durán Martínez
67
Facultad de Ingeniería
Java
/*******************************************************************************************
***********
class ImprimeSubclase2 extends ImprimeClase
{
int z = 3;
public void imprimeme()
{
System.out.println("X = " + x);
System.out.println("Y = " + y);
System.out.println("Z = " + z);
System.out.println("Soy una instancia de la clase: " + this.getClass().getName());
}
}
public static void main(String args[])
{
ImprimeSubclase2 obj = new ImprimeSubclase2();
obj.imprimeme();
}
/*******************************************************************************************
***********
class ImprimeSubclaseSuper extends ImprimeClase
{
int z = 3;
void imprimeme()
{
super.imprimeme();
System.out.println("Z = " + z);
System.out.println("Soy una instancia de la clase: " +
this.getClass().getName());
}
}
public static void main(String args[])
{
ImprimeSubclaseSuper obj = new ImprimeSubclaseSuper();
obj.imprimeme();
}
/*******************************************************************************************
***********
20. Constructores
/*******************************************************************************************
***********
class Persona
{
String nombre;
int edad;
Persona() //constructor por default
{
}
Persona(String n, int e) //Un constructor diferente
{
nombre=n;
edad=e;
Ing. Israel Durán Martínez
68
Facultad de Ingeniería
Java
}
void imprime() //método imprime
{
System.out.println("La persona " + nombre + " tiene " + edad + " años");
}
public static void main(String args[])
{
Persona p=new Persona(); //utiliza el constructor por default que no inicializa las variables
p.nombre="Pedro";
p.edad=65;
p.imprime();
}
}
Persona p1=new Persona("Juan", 34); //utiliza un constructor diferente
p1.imprime();
/*******************************************************************************************
***********
import java.awt.Point;
public class Punto2De
{
int x;
int y;
//CONSTRUCTOR
public Punto2De(int x, int y)
{
this.x=x;
this.y=y;
}
public Punto2De(Point p)
{
x=p.x;
y=p.y;
}
//METODO DE INSTANCIA
public void imprimeVal()
{
System.out.println("(" + x + " , " + y + ")");
}
//METODO MAIN
public static void main(String args[])
{
Punto2De p1=new Punto2De(3,12);
Punto2De p2=new Punto2De(5,6);
p1.imprimeVal();
p2.imprimeVal();
}
}
Point a = new Point(2,1);
Punto2De p3=new Punto2De(a);
p3.imprimeVal();
Ing. Israel Durán Martínez
69
Descargar