Programación Java Unam
Programación Java Unam
l Lenguaje Java
Indice
2
La tecnología Java
Java es un lenguaje de programación de alto nivel que tiene las siguientes características:
Orientado a objetos
Distribuido y dinámico
Robusto
Seguro
Multitarea
Porta ble
ArchivoJava
Arch1vo.class
1 ¡__,....(compilador)__,.,.. Byrecode
Macos
La plataforma Java
1
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.
'
.. ,,
Applets
Los applets son pequeños programas que se incorporan en una página Web y que por lo
tanto, necesitan de un Navegador Web compatible con Java para poder ejecutarse. A
menudo los applets se descargan junto con una página HTML desde un Servidor Web y se
ejecutan en la máquina cliente.
Aplicaciones
Servlets
Los servlets al contrario de los applets son programas que están pensados para trabajar
en el lado del servidor y desarrollar aplicaciones Web que interactúen con los clientes. Los
servlets son una alternativa de la programación CGI tradicional.
El Kit de desarrollo de Java (JDK) contiene las herramientas y librerías necesarias para
crear y ejecutar applets y aplicaciones en Java.
2
A continuación se listas algunas de las utilidades que se pueden encontrar en el JDK:
jar. Es una herramienta utilizada para trabajar con los archivos JAR.
El JDK se puede obtener directamente de forma gratuita del sitio Web de JavaSoft,
http://java.sun.com/ . ·
Una vez instalado el JDK se tiene que actualizar la variable de ambiente PATH y crear una
nueva variable llamada CLASSPATH.
set PATH=C:\jdkl.1.8\bin;%PATH%
set CLASSPATH=C:\jdkl.1.8\lib\classes.zip;.
Por ejemplo, si se instaló una versión de Java 2 (JDK 1.2 o posterior), hacemos lo
siguiente:
set PATH=C:\jdk1.2.2\bin;%PATH%
set CLASSPATH=C:\jdkl.2.2\jre\lib;.
3
que sólo se hace referencia al directorio jre\lib.
Es necesario actualizar la variable PATH para que el sistema operativo sepa en donde
encontrar los programas que se ejecutan cuando se trabaja con Java ,básicamente el
compilador y el intérprete de Java, javac y java, respectivamente.
Bytecode
NombreArchivo.closs
/
Intérprete
------ Java
Salida del
programa
Ed 1tor de tex ID
Código fvente
NombreArchrvo.jovo
-- Javadoc
Archivo de
Docurrentación
HTML
Compilador
Intérprete
Bytecode Salida del
NombreArchivo.closs Navegador
Web programa
Archí\lo HTML en
Editor de texto donde se inclvye al
applet
4
Creación de aplicaciones con el JDK
A continuación se describe de manera gráfica cuales son los pasos a seguir para construir
una aplicación Java usando el JDK.
1
"
-=-
•.• Clll!!l~i
Guardar el archivo
Guarda• como ~ · ,, ~, _"-::; • ' . ·;¡¡a
5
Compilar y ejecutar el programa
class AppHolaMundo{
protected String nombre;
catch(Exception e){
System.out.println("Ocurrio la sig excepcion: "+ e.toString() +"\n");
e.printStackTrace();
6
Creación de applets con el JDK.
A continuación se describe de forma gráfica cuales son los pasos básicos para crear
applets utilizando el JDK.
import jaua.applet.•;
import jaua.awt.*;
Los applets son subclases de .. D
la clase Applet [:$
public class AppletHolaMundo extends Applet {
public uoid paint(Graphics g)
g.drawString("Hola Mundo", so. 25);
Guardar el archivo
~
exte.,':"º_.J>siónjava Debe de ser un
archivo de texto
A
7
Editar el archivo HTML que incluirá el applet
~~;;.-~~~~;:~~~~
Guardar el archivo HTML
'
8
Abrir el archivo HTML con un navegador (Explorer)
//AppletHolaMundo.java
import java.applet.*;
import java.awt.*;
<HTML>
<HEAD>
<TITLE>Mi primer applei</TITLE>
</HEAD>
<BODY>
Aqui está la salida del programa
<BR>
<APPLET CODE="AppletHolaMundo.class"
WIDTH=150 HEIGHT=45>
</APPLET>
</BODY>
</HTML>
mi_primer_applet.html
Sintaxis de Java
La sintaxis de un lenguaje define cómo se usarán las palabras claves, los operadores y las
variables para construir y evaluar expresiones. La sintaxis de Java especifica como se
escribirán los siguientes elementos:
Comentarios.
Identificadores.
Palabras clave.
Literales.
Expresiones y operadores.
Variables y tipos de datos.
Bloques y sentencias.
9
Comentarios
Java ofrece tres tipos de comentarios: dos para comentarios regulares en el código fuente
y uno para la documentación especial del sistema javadoc.
Comentarios de varias líneas.
Los comentarios de varias líneas se incluyen entre los símbolos/* y*/, como en C y C++.
/*
Este es un ejemplo de
un comentario de varias
líneas.
*/
Comentarios de una sola línea.
Para comentariar una sola línea se utiliza la doble diagonal //. El comentario se inicia
cuando se encuentra la doble diagonal y continua hasta el final de la línea.
// Este es un comentario de una sola linea
//Este es otro comentario
Realmente este tipo de comentario es el mismo que el de varias líneas con la diferencia de
que la información que contenga será usada para un procesamiento especial que lleva a
cabo la herramienta javadoc.
/**
Este tipo de comentarios
los utiliza la
herramienta javadoc
*/
Identificadores
Las letras Java incluyen los caracteres ASCII A-Z y a-z. Los digitos Java incluyen los digitos
ASCII 0-9. Para propósitos de construir identificadores, los caracteres ASCII $ y _ son
también considerados letras Java.
No hay un límite en lo concerniente al número de caracteres que pueden tener los
identificadores.
10
Estos son algunos ejemplos de identificadores válidos:
_varx $varl MAX_NUM var2
Palabras clave
La siguiente tabla muestra las palabras claves de Java, éstas son reservadas y no pueden
ser utilizadas como identificadores.
true, false, and null no son palabras claves pero son palabras reservadas, así que
tampoco pueden ser utilizadas como identificadores.
Literales
Una literal es un valor constante formado por una secuencia de caracteres. Cualquier
declaración en Java que defina un valor constante -un valor que no pueda ser cambiado,
durante la ejecución del programa- es una literal.
Son ejemplos de literales los números, los caracteres y las cadenas de caracteres.
Literales numéricas
Se pueden crear literales numéricas a partir de cualquier tipo de dato primitivo.
Ej.
123 //literal int
123.456 //literal double
123L //literal long
123.456F //literal float
Literales booleanas
Las literales boolenas consisten de las palabras reservadas true y false.
Literales de caracteres
11
Las literales de caracteres se expresan por un solo caracter entre comillas sencillas
10
Ej. 'a1, /o', '7'
Literales de cadena
Una cadena es una combinación de caracteres. Las cadenas en Java son instancias de la
clase String, por ello cuentan con métodos que permiten combinar, probar y modificar
cadenas con facilidad.
Las literales de cadena se representan por una secuencia de caracteres entre comillas
dobles.
Ej. "hola", "cadena123", "12345"
Expresiones y Operadores
Expresión
Una expresión es una combinación de variables, operadores y llamadas de métodos
construida de acuerdo a la sintaxis del lenguaje que devuelve un valor.
El tipo de dato del valor regresado por una expresión depende de los elementos usados en
la expresión.
Operadores
Los operadores son símbolos especiales que por lo común se utilizan en expresiones.
La tabla siguiente muestra los distintos tipos de operadores que utiliza Java.
Operadores aritméticos
+ Suma a+b
Resta a-b
* Multiplicación a*b
/ División a/b
% Módulo a%b
Operadores de asignación
= Asignación a= b
12
%= Módulo y asignación a% b (a=a % b)
Operadores relacionales
-- Igualdad a== b
!= Distinto a!= b
Operadores especiales
() Agrupación de expresiones a = (a + b) *c
La tabla siguiente muestra la precedencia asignada a los operadores, éstos son listados en
orden de precedencia.
Operador Notas
++ -- ! es el NOT lógico y ~ es el
complemento de bits
13
* / % Multiplicativos
+- Aditivos
-- != Igualdad
11 OR lógico
?: Condicional
Todos los operadores binarios que tienen la misma prioridad (excepto los operadores de
asignación) son evaluados de izquierda a derecha.
Variables de instancia.
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.
* A diferencia de otros lenguajes, Java no tiene variables globales, es decir , variables que
14
son vistas en cualquier parte del programa.
El tipo de una variable determina los valores que puede almacenar y las operaciones que
se pueden hacer sobre ella. Para dar a una variable un tipo y un nombre, se escribe una
declaración de una variable, que tiene la siguiente forma:
TipoDato nombreVariable;
Se pueden escribir varios nombres de variables del mismo tipo en una sola línea
int x, y, z;
String nombre, apellido;
Tipo primitivo.
Una variable de tipo primitivo contiene un solo valor del tamaño y formato apropiado de
su tipo: un número, un carácter, o un valor booleano.
La tabla siguiente lista los tipos de datos primitivos soportados por Java.
Números enteros
Números reales
Otros tipos
15
char Un solo carácter 16-bit caracteres Unicode
double d = 10.50;
float f = 10 SOF;
Referencia.
Los arreglos, las clases y las interfaces son del tipo referencia. El valor de una variable del
tipo referencia es una dirección de un conjunto de valores representados por una variable.
Las referencias en Java no son como en C++, éstas son identificadores de instancias de
alguna clase en particular.
Bloques y sentencias
Sentencia
Una instrucción o sentencia representa la tarea más sencilla que sé puede realizar en un
programa.
Sentencias de expresión
Los siguientes tipos de expresiones pueden ser hechas dentro de una sentencia
terminando la expresión con punto y coma (;):
* Expresiones de asignación
* Cualquier uso de los operadores ++ y -
* Llamada de métodos
* Expresiones de creación de objetos
Esta clase de sentencias son llamadas sentencias de expresión.
16
double avalue = 8933.234;
String varead;
Las sentencias de control de flujo determinan el orden en el cual serán ejecutadas otro
grupo de sentencias. Las sentencias if y for son ejemplos de sentencias de control de
flujo.
Bloque de sentencias
if ( Expresion ){
sentencias;
booleano true.
if ( Expresion l {
sentenciasA;
1
else{
sentenciasB;
Cuando se requiere comparar una variable con una serie de valores diferentes, puede
utilizarse la sentencia switch, en la que se indican los posibles valores que puede tomar
'
la variable y las sentencias que se tienen que ejecutar sí es que la variable coincide con
alguno de dichos valores.
switch( variable){
case valorl:
sentencias;
break;
case valor2:
sentencias;
break;
case valorN:
sentencias;
break;
17
default:
sentencias;
Cada case ejecutará las sentencias correspondientes, con base en el valor de la variable,
que deberá de evaluarse con valores de tipo byte, char, short o int.
Si el valor de la variable no coincide con ningún valor, entonces se ejecutan las sentencias
por default, sí es que las hay.
for(inicialización;condición;incremento) {
sentencias;
1
* En su forma más simple, la inicialización es una sentencia de asignación que se utiliza
para establecer una variable que controle el ciclo.
* La condición es una expresión que comprueba la variable que controla el ciclo y
determinar cuando salir del ciclo.
* El incremento define la manera en como cambia la variable que controla el ciclo.
Los ciclos while y do-while, al igual que los ciclos far repiten la ejecución de un bloque
de sentencias mientras se cumpla una condición específica.
La sentencia while
while (condición){
sentencias;
La condición es una condición booleana, que mientras tenga el valor true permite que se
ejecuten las sentencias correspondientes.
La sentencia do-while
Al contrario de los ciclos far y while que comprueban una condición en lo alto del cido, el
ciclo do-while la examina en la parte más baja del mismo. Esta característica provoca
que un ciclo do-while siempre se ejecute por lo menos una vez.
18
break
La sentencia break. tiene dos usos. El primer uso es terminar un case en la sentencia
switch. El segundo es forzar la terminación inmediata de un ciclo, saltando la prueba
condicional normal del ciclo.
continue
return
Se utiliza la sentencia return para provocar la salida del método actual; es decir, return
provocará que el programa vuelva al código que llamó al método.
La sentencia return puede regresar o no un valor. Para devolver un valor; se pone el valor
después de la palabra clave return.
return valor;
El tipo de dato del valor regresado debe ser el mismo que el que se especifica en la
declaración del método.
return;
Arreglos (Arrays)
Declaración y acceso
Un array es una colección ordenada de elementos del mismo tipo, que son accesibles a
través de un índice. Un array puede contener datos primitivos o referencias a objetos.
Los arrays se declaran:
[modificadores] tipo_ variable []nombre;
Por ejemplo:
int [ ] a;
Punto [ ) p;
19
Un array se crea como si se tratara de un objeto (de hecho las variables de tipo array son
referencias):
También puede crearse de forma explícita asignando valores a todos los elementos del
array en el momento de la declaración, de la siguiente forma:
int [ ] a = { 5 , 3 , 2 ) ;
El acceso a los elementos del array se realiza indicando entre corchetes el elemento del
array que se desea, teniendo en cuenta que siempre el primer elemento del array es el
índice O. Por ejemplo a [ l J • En este ejemplo los índices del array de tres elementos son
O, 1 y 2. Si se intenta usar un índice que está fuera del rango válido para ese array se
produce un error (en realidad una excepción. Las excepciones se tratan en un capítulo
posterior) de 'Indice fuera de rango'. En el ejemplo anterior se produce esta excepción si
el índice es menor que O o mayor que 2.
Se puede conocer el número de elementos de un array usando la variable length. En el
ejemplo a. length contiene el valor 3.
Un array, como cualquier otra referencia puede formar parte de la lista de parámetros o
constituir el valor de retorno de un método. En ambos casos se indica que se trata de un
array con los corchetes que siguen al tipo. Por ejemplo:
Arreglos multidimensionales
Es posible declarar arrays de más de una dimensión. Los conceptos son los mismos que
para los arrays monodimensionales.
Por ejemplo:
int [ ) [ ] a = i { 1 , 2 } , \ 3 , 4 } , { 5 , 6 } };
20
int [ ] [ ] a = new int [3] [2];
Objeto
Al igual que los objetos del mundo real, los objetos de software tienen un estado y un
comportamiento. El estado de los objetos se determina a partir de una o más variables y
el comportamiento con la implementación de métodos.
Vanables
Métodos (Estado)
(Comportamiento)
Como se observa en la figura, todos los objetos tienen una parte pública (su
comportamiento) y una parte privada (su estado). En este caso, hicimos una vista
transversal pero desde el mundo exterior, el objeto se observará como una esfera.
Clase.
Una clase está formada por los métodos y las variables que definen las características
cómunes a todos los -objetos de esa clase. Precisamente la clave de la OOP está en
abstraer los métodos y los datos comunes a un conjunto de objetos y almacenarlos en una
clase.
21
M@
\U) . ObJetoA
Objeto B
Cada uno de los objetos tiene su propia copia de las variables. definidas en la clase de la
cual son instanciados y comparten la misma implementación de los métodos.
Mensajes y métodos
El modelado de objetos no sólo tiene en consideración los objetos de un sistema, sino
también sus interrelaciones.
Mensaje
Los objetos interactúan enviándose mensajes unos a otros. Tras la recepción de un
mensaje el objeto actuará. La acción puede ser el envío de otros mensajes, el cambio de
su estado, o la ejecución de cualquier otra tarea que se requiera que haga el objeto.
Método
· Un método se implementa en una clase, y determina cómo tiene que actuar el objeto
cuando recibe un mensaje.
Cuando un objeto A necesita que el objeto B ejecute alguno de sus métodos, el objeto A
le manda un mensaje al objeto B.
MensaJe
Objeto A
Objeto B
Al recibir el mensaje del objeto A, el objeto B ejecutará el método adecuado para el
mensaje recibido.
Encapsulamiento
Como se puede observar de los diagramas, las variables del objeto se localizan en el
centro o núcleo del objeto. Los métodos rodean y esconden el núcleo del objeto de otros
objetos en el programa. Al empaquetamiento de las variables de un objeto con la
protección de sus métodos se le llama encapsulamiento. Típicamente, el encapsulamiento
es utilizado para esconder detalles de la puesta en práctica no importantes de otros
objetos. Entonces, los detalles de la puesta en práctica pueden cambiar en cualquier
tiempo sin afectar otras partes del programa.
El encapsulamiento de variables y métodos en un componente de software ordenado es,
22
todavía, una simple idea poderosa que provee dos principales beneficios a los
desarrolladores de software:
Modularidad, esto es, el código fuente de un objeto puede ser escrito, así como darle
mantenimiento, independientemente del código fuente de otros objetos. Así mismo, un
objeto puede ser transferido alrededor del sistema sin alterar su estado y conducta.
Ocultamiento de la información, es decir, un objeto tiene una "interfaz publica" que otros
objetos pueden utilizar para comunicarse con él. Pero el objeto puede mantener
información y métodos privados que pueden ser cambiados en cualquier tiempo sin
afectar a Jos otros objetos que dependan de ello.
Los objetos proveen el beneficio de Ja modularidad y el ocultamiento de la información.
Las clases proveen el beneficio de Ja reutilización. Los programadores de software utilizan
la misma clase, y por lo tanto el mismo código, una y otra vez para crear muchos objetos.
En las implantaciones orientadas a objetos se percibe un objeto como un paquete de
datos y procedimientos que se pueden llevar a cabo con estos datos. Esto encapsula los
datos y Jos procedimientos. La realidad es diferente: Jos atributos se relacionan al objeto o
instancia y Jos métodos a Ja clase. lPor qué se hace así? Los atributos son variables
comunes en cada objeto de una clase y cada uno de ellos puede tener un valor asociado,
para cada variable, diferente al que tienen para esa misma variable Jos demás objetos. Los
métodos, por su parte, pertenecen a Ja clase y no se almacenan en cada objeto, puesto
que sería un desperdicio almacenar el mismo procedimiento varias veces y ello va contra
el principio de reutilización de código.
Herencia
La herencia es un mecanismo que permite Ja definición de una clase a partir de Ja
definición de otra ya existente. La herencia permite compartir automáticamente métodos y
datos entre clases, subclases y objetos.
La herencia está fuertemente lig'ada a Ja reutilización del código en Ja OOP. Esto es, el
código de cualquiera de las clases puede ser utilizado sin más que crear una clase
derivada de ella, o bien una subclase.
Hay dos tipos de herencia: Herencia Simple y Herencia Múltiple. La primera indica que se
pueden definir nuevas clases solamente a partir de una clase inicial mientras que la
segunda indica que se pueden definir nuevas clases a partir de dos o más clases iniciales.
Superclase y Subclases
El concepto de herencia conduce a una estructura jerárquica de clases o estructura de
árbol, Jo cual significa que en Ja OOP todas las relaciones entre clases deben ajustarse a
dicha · estructura.
En esta estructura jerárquica, cada clase tiene sólo una clase padre. La clase padre de
cualquier clase es conocida como su superclase. La clase hija de una superclase es
llamada una subclase.
23
Clase A
A es la superclase de B, C y D.
D es la superclase de E.
B, C y D son subclases de A.
Clase B Clase C
E es una subclase de D.
Clase E
Polimorfismo
Otro concepto de la OOP es el polimorfismo. Un objeto solamente tiene una forma (la que
se le asigna cuando se construye ese objeto) pero la referencia a objeto es polimórfica
porque puede referirse a objetos de diferentes clases (es decir, la referencia toma
múltiples formas). Para que esto sea posible debe haber una relación de herencia
entre esas clases.
Una referencia a un objeto de la clase B también puede ser una referencia a un objeto de
la clase A.
Una referencia a un objeto de la clase C también puede ser una referencia a un objeto de
la clase A.
Una referencia a un objeto de la clase D también puede ser una referencia a un objeto de
la clase A.
Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de
la clase D.
Una referencia a un objeto de la clase E también puede ser una referencia a un objeto de
la clase A.
Abstracción
24
comunes provistos· por la superclase. A través del uso de herencia, los
programadores pueden reutilizar el código de la superclase muchas veces.
Definición de clases
La definición de una clase especifica cómo serán los objetos de dicha clase, esto es, de
que variables y de que métodos constarán.
La siguiente es la definición más simple de una clase:
class nombreClase /* Declaración de la clase */
{
Como se puede observar, la definición de una clase consta de dos partes fundamentales:
* La declaración de la clase
Indica el nombre de la clase precedido por la palabra clave class.
* El cuerpo de la clase
El cuerpo de la clase sigue a la declaración de la clase y está contenido entre la pareja de
llaves ( { y }). El cuerpo de la clase contiene las declaraciones de las variables de la clase,
y también la declaración y la implementación de los métodos que operan sobre dichas
variables.
El estado de un objeto está representado por sus variables (variables de instancia). Las
variables de instancia se declaran dentro del cuerpo de la clase. Típicamente, las variables
de instancia se declaran antes de · la declaración de los métodos, pero esto no es
necesariamente requerido.
Implementación de métodos
Los métodos de una clase determinan los mensajes que un objeto puede recibir.
25
argumentos (opcionales) y su cuerpo. Además, un método puede llevar otros
modificadores opcionales que van al inicio de la declaración del método y que se
analizarán más adelante. La sintaxis de un método es la siguiente:
Los métodos en Java pueden ser creados únicamente como parte de una clase. Cuando se
llama a un método de un objeto se dice comúnmente que se envia un mensaje al objeto.
/* Usuario.Java */
class Usuario
String nombre;
int edad;
String direccion;
void setNombre(String n)
{
nombre = n,.
String getNombre()
{
return nombre;
vo1d setEdad{int e)
{
edad = e;
int getEdad {)
{
return edad;
void setDireccion(String d)
{
direccion = d;
String getDireccion{)
1
return direccion;
26
Usuario usrl; //usrl es una variable del tipo Usuario
La primera línea corresponde a la declaración del objeto, es decir, se declara una variable
del tipo de objeto deseado.
El operador new
El operador new crea una instancia de una clase asignando la cantidad de memoria
necesaria de acuerdo al tipo de objeto. El operador new se utiliza en conjunto con un
constructor. El operador new regresa una referencia a un nuevo objeto.
Constructores
Un constructor es un tipo específico de método que siempre tiene el mismo nombre que la
clase, y que se utiliza cuando se desean crear objetos de dicha clase, es decir, se utiliza al
crear e iniciar un objeto de una clase.
Constructores múltiples
Cuando se declara una clase en Java, se pueden declarar uno o más constructores
(constructores múltiples) opcionales que realizan la iniciación cuando se instancia un
objeto de dicha clase.
Para la clase Usuario del ejemplo anterior no se especificó ningún constructor, sin
embargo, Java proporciona un constructor por omisión que inicia las variables del objeto a
sus valores predeterminados.
/* ProgUsuario.java */
class ProgUsuario
{
public static void main(String args[])
{
Usuario usrl, usr2; /* Se declaran dos objetos de la clase Usuario */
boolean si_no;
27
Escribir un Método finalize()
Antes de que un objeto sea recolectado por el recolector de basura, el sistema llama al
método finalize(). La intención de este método es liberar los recursos del sistema, como
Archivos o conexiones abiertas antes de empezar la recolección.
class AbrirUnArchivo {
FileinputStream unArchivo = null;
AbrirUnArchivo (String nombreArchivo) {
try {
unArchivo = new FileinputStream(nombreArchivo);
) catch {java.10.FileNotFoundException e) {
System.err.println("No se pudo abrir el archivo " + nombreArchivo);
1
super.finalize(};
28
Acceso a variables y métodos
Una vez que se ha creado un objeto, seguramente se querrá hacer algo con él. Tal vez se
requiera 'obtener información de éste, se quiera cambiar su estado, o se necesite que
realice alguna tarea.
/* Usuario2.java */
class Usuario2
String nombre;
int edad;
String direccion;
Usuario2(Usuario2 usr)
l
nombre= usr.getNombre();
edad= usr.getEdad();
d1recc1on = usr.getDireccion();
void setNornbre(String n)
l
nombre = n;
Str1ng getNombre()
l
return nombre;
29
void setEdad(int e)
{
edad = e;
int getEdad ()
{
return edad;
void setDireccion(String d)
{
direccion = d;
String getDireccion()
{
return direccion;
/* Progüsuario2.java */
class ProgUsuario2
prog.imprimeUsuario{usrl);
prog.imprimeUsuario{usr2);
30
Variables y métodos de clase
Variables de clase
Las variables de clase son variables cuyos valores son los mismos para la clase y para
todas sus instancias.
Para indicar que una variable es una variable de clase se utiliza la palabra clave static en
la declaración de la variables:
static tipoVariable nombreVariable;
Métodos de clase
Los métodos de clase al igual que las variables de clase, se aplican a la clase como un
todo y no a sus instancias.
Se utiliza de igual manera la palabra clave static para indicar que un método es un
método de clase:
Para acceder. a las variables o métodos de clase se utiliza el mismo operador punto ( • ).
Aunque se puede acceder a las variables y métodos de clase a través de un objeto, está
permitido y se recomienda utilizar mejor el nombre de la clase.
/* Utilizar esto */
nombreClase.nombreVarClase;
nornbreClase.nombreMetodoClase();
/* en lugar de esto */
nombreObjeto.nombreVarClase;
nombreObJeto.nombreMetodoClase();
/* Usuario3.java */
class Usuario3
1
static char MAS = 'm';
static char FEM = 'f';
String nombre;
int edad;
String direccion;
char sexo;
Usuario3 ( )
1
nombre = null;
edad = O;
direccion = null;
sexo='\0';
31
Usuario3(String nombre, int edad, String direccion,char sexo)
1
this.nombre =nombre;
this.edad =edad;
this.direccion = direccion;
this.sexo =sexo;
Usuario3(Usuario3 usr)
{
nombre= usr.getNornbre();
edad = usr.getEdad{);
direccion = usr.getDireccion();
sexo= usr.getSexo(};
void setNombre(String n)
{
nombre = n;
String getNornbre(
1
return nombre;
void setEdad(int e)
1
edad = e;
int getEdad {)
1
return edad;
void setDireccion{String d)
1
direccion = d;
String getDireccion(
1
return direccion;
void setSexo(char s)
1
sexo = s;
char getSexo ( )
1
return sexo;
/* ProgUsuario3.Java */
32
class ProgUsuario3
{
static int NUM USUARIOS = O;
static java.util.Vector usuarios new java.util.Vector();
ProgUsuario3(String nombre)
{
this.nombreObj =nombre;
Usuario3 usrl,usr2,usr3,usr4;
objl.addUsuario(usrl);
System. out. println ( "\t Total: " +ProgUsuario3. getNumUsuarios () );
33
obj2.addUsuario(usr2);
System.out .println ( "\t Total: " +obj 1. getNumUsuarios {) l;
objl.addUsuario(usr3);
System.out.println( "\t Total: " +ProgUsuario3.NUM_USUARIOS ) ;
ObJ2.addUsuario(usr4);
System.out.println( "\t Total· " +getNumUsuarios () +"\n");
obj2.de1Usuario(usr4);
System.out.println( "\t Total: " +ProgUsuario3.getNumUsuarios () );
ObJl.delUsuario(usr3);
System.out.println( "\t Total: "+objl.getNumUsuarios(} );
obj2.de1Usuario(usr2);
System.out.println( "\t Total: "+ProgUsuario3.NUM_USUARIOS );
ObJl.delUsuario(usrl);
System.out.println( "\t Total: "+getNumUsuarios() +"\n");
En esta estructura jerárquica, cada clase tiene sólo una clase padre. La clase padre de
cualquier clase es conocida como su superclase. La clase hija de una superclase es
llamada una subclase.
En Java, la clase padre de todas las clases es la clase Object y cuando una clase no tiene
una superclase explícita, su superclase es Object.
Java diferencia los métodos sobrecargados con base en el número y tipo de argumentos
34
que tiene el método y no por el tipo que devuelve.
/* Métodos sobrecargados */
int calculaSuma{int x, int y, int z) {
/* Usuario4.java */
class Usuario4
1
String nombre;
int edad;
String direccion;
Usuario4(Usuario4 usr)
1
nombre= usr.getNombre();
edad= usr.getEdad{);
direccion = usr.getDireccion();
void setNombre(String n)
1
nombre = n;
String getNombre()
1
return nombre;
35
edad e;
void setEdad(float e)
{
edad = (int)e;
int getEdad ()
{
return edad;
void setDireccion(String d)
{
direccion = d;
String getDireccion()
{
return direccion;
/* ProgUsuario4.java */
class ProgUsuario4
{
void imprimeUsuar1o(Usuar104 usr)
usrl.setEdad(50);
usr2.setEdad(30.45f);
prog.imprimeUsuario(usrl);
prog.imprimeUsuario(usr2);
36
Una subclase hereda todos los métodos de su superclase que son accesibles a dicha
subclase a menos que la subclase sobreescriba los métodos.
Una subclase sobreescribe un método de su superclase cuando define un método con las
mismas características ( nombre, número y tipo de argumentos) que el método de la
superclase.
Las subclases emplean la sobreescritura de métodos la mayoría de las veces para agregar
o modificar la funcionalidad del método heredado de la clase padre.
class ClaseA
1
void miMetodo(int varl, int var2)
1 ... 1
String miOtroMetodo( )
1 ... 1
String miOtroMetodo( J
1 .•. 1
La referencia this
En ocasiones es conveniente disponer de una referencia que apunte al propio objeto que
se está manipulando. Esto se consigue con la palabra reservada this. this es una
referencia implícita que tienen todos los objetos y que apunta a si.mismo. Por ejemplo:
class Circulo {
Punto centro;
int radio;
El método elMayor devuelve una referencia al círculo que tiene mayor radio, comparando
los radios del Circulo c que se recibe como argumento y el propio. En caso de que el
propio resulte mayor el método debe devolver una referencia a si mismo. Esto se consigue
con la expresión return this .
La referencia null
37
Para asignar a una referencia el valor nulo se utiliza la constante null. El ejemplo del caso
anterior se podría completar con:·
class Circulo
Punto centro;
int radio;
Circulo elMayor(Circulo e) {
if (radio > e.radio) return this;
else if (e.radio> radio) return e;
else return null;
Clases abstractas
Una clase que declara la existencia de métodos pero no la implementación de dichos
métodos (o sea, las llaves { } y las sentencias entre ellas), se considera una clase
abstracta.
Una clase abstracta puede contener métodos no-abstractos pero al menos uno de los
métodos debe ser declarado abstracto.
Para declarar una clase o un metodo como abstractos, se utiliza la palabra reservada
abstract.
abstract class Drawing
1
abstract void miMetodo(int varl, int var2);
String miOtroMetodo( ){ ... }
Una clase abstracta no se puede instanciar pero si se puede heredar y las clases hijas
serán las encargadas de agregar la funcionalidad a los métodos abstractos. Si no lo hacen
así, las clases hijas deben ser también abstractas.
Interfaces
Una interface es una variante de una clase abstracta con la condición de que todos sus
métodos deben ser asbtractos. Si la interface va a tener atributos, éstos deben llevar las
palabras reservadas static final y con un valor inicial ya que funcionan como constantes
por lo que, por convención, su nombre va en mayúsculas.
interface Nomina
1
public static final String EMPRESA= "Patito, S. A.";
public void detalleDeEmpleado(Nomina obJ);
1
Una clase implementa una o más interfaces (separadas con comas ",") con la palabra
reservada implements. Con el uso de interfaces se puede "simular" la herencia múltiple
que Java no soporta.
38
En este ejemplo, la clase Empleado tiene una clase padre llamada Object (implícitamente)
e implementa a la interface Nomina, quedando el diagrama de clases de la siguiente
manera:
ObJect Nomina
(clase) (interface)
1 1
1
Empleado
(clase)
Paquetes
Para hacer que una clase sea más fácil de localizar y utilizar así como evitar conflictos de
nombres y controlar el acceso a los miembros de una clase, las clases se agrupan en
paquetes.
Paquete
package nombrePaquete;
donde nombrePaquete puede constar de una sola palabra o de una lista de nombres de
paquetes separados por puntos.
package miPaquete;
class Miclase
(
package nornbrel.nombre2.rniPaquete;
39
class TuClase
{
De esta manera, cuando se requiera hacer uso de estas clases se tendrán que importar de
la siguiente manera.
import miPaquete.MiClase;
import nombrel.nombre2.miPaquete.TuClase;
class OtraClase
{
/* Aqui se hace uso de la clase 'Miclase' y de la
clase 'TuClase' */
Para importar todas las clases que están en un paquete, se utiliza el asterisco ( * ).
import miPaquete.*;
Si no se utiliza la sentencia package para indicar a que paquete pertenece una clase, ésta
terminará en el package por default, el cual es un paquete que no tiene nombre.
/* Usuarios.java */
package paquete!;
class Usuarios
{
static char MAS 'm';
static char FEM = 'f';
String nombre;
int edad;
String direccion;
char sexo;
Usuarios ( )
{
nombre = null;
edad = O;
direccion = null;
sexo= '\0';
UsuarioS(UsuarioS usr)
40
nombre= usr.getNombre();
edad= usr.getEdad();
direccion = usr.getD1recc1on();
sexo= usr.getSexo();
void setNombre(String n)
1
nombre = n;
String getNombre()
1
return nombre;
void setEdad(int e)
1
edad = e;
int getEdad ()
1
return edad;
void setDireccion(String d)
1
direccion = d;
String getDireccion()
1
return direccion;
void setSexo(char s)
{
sexo = s;
char getSexo (}
1
return sexo;
/* ProgUsuarioS.Java */
package paquete!;
import Java.util.Vector;
class ProgUsuarioS
1
static int NUM_USUARIOS O;
41
static Vector usuarios= new Vector();
/* La siguiente linea seria obligatoria si
se ami tiera la linea import java. util. Vector; * /
// static Java.util.Vector usuarios= new Java.util.Vector(};
return NUM_USUARIOS;
Usuarios usrl,usr2,usr3,usr4;
obJl.addUsuario(usrl);
System.out.println( "\t Total: +ProgUsuarioS. getNumUsuarios () );
obj2.addUsuario(usr2);
System.out.println( "\t Total: +objl.getNumUsuarios{) );
42
obJl.addUsuario(usr3);
System.out.println( "\t Total: " +ProgUsuarioS.NUM_USUARIOS ) ;
obJ2.addUsuario{usr4);
System.out.println( "\t Total: "+getNumUsuarios() +"\n");
obJ2.delUsuario(usr4);
System.out.println( "\t Total: "+ProgUsuario5.getNumUsuarios() );
objl.de1Usuario(usr3);
System.out.println( "\t Total: " +objl.getNumUsuarios() );
obj2.de1Usuario(usr2);
System.out.println( "\t Total: "+ProgUsuario5.NUM_USUARIOS );
obJl.delUsuario(usrl);
System. out .println ( "\t Total: " +getNumUsuarios () +"\n");
Uno de los beneficios de las clases, es que pueden proteger a sus variables y métodos
(tanto de instancia como de clase) del acceso desde otras clases.
Java soporta cuatro niveles de acceso a variables y métodos. En orden, del más público al
menos público son: público (public), protegido (protected), sin modificador (también
conocido como package) y privado (private).
iCl~se _ 11 SI J SI JI SI Ji_ sI
1 Sub~lase
i el mismo paquete
enjl;IJI SI
1 :;,i J
11 SI NO
'------------------ :======-~!;=====-=·=--~-=-=--=-·='::=====!
! No-Subclase en ~1 SI li! SI NO I,!
~,;;;:~'~
·· (Universo)
,.,,: 1 IEJo NO '111 1 NO
~~-----··
(*) Los miembros (variables y metodos) de clase (static) si son visibles. Los miembros de
instancia no son visibles.
Como se observa de la tabla anterior, una clase se ve a ella misma todo tipo de variables y
métodos (desde los public hasta los private); las ciernas clases del mismo paquete (ya
43
sean subclases o no) tienen acceso a los miembros desde los public hasta los sin-
modificador. Las subclases de otros paquetes pueden ver los miembros public y a los
miembros protected, éstos últimos siempre que sean static ya de no ser así no serán
visibles en la subclase (Esto se explica en la siguiente página). El resto del universo de
clases (que no sean ni del mismo paquete ni subclases) pueden ver sólo los miembros
public.
Excepciones
Las excepciones son la manera que ofrece Java de manejar los errores en tiempo de
ejecución. Muchos lenguajes imperativos, cuando tenían un error de esta clase lo que
hacían era detener la ejecución del programa. Las excepciones nos permiten escribir
código que nos permita manejar ese error y continuar (si lo estimamos conveniente) con
la ejecución del programa.
Este programa tendrá un serio problema cuando intente acceder a mensaJesl3J, pues no
existe dicho valor. Al ejecutarlo nos dirá lo siguiente (o algo parecido):
Primero
Segundo
Tercero
Exception in thread "main" Java.lang.ArrayindexOutOfBoundsException
at Desbordamiento.main(Desbordamiento.java, Compiled Code}
Nos da un error de ejecución (en esta terminología se diría que se lanzó una excepción) al
intentar acceder a dicho valor inexistente. Vemos que, por ahora, el comportamiento de
nuestro código es el mismo que en los lenguajes imperativos. Cuando encuentra el error,
se para la ejecución. Ahora veremos como evitar esto.
44
System.out.println(rnensajes[i]);
catch ( ArrayindexOutOfBoundsException e ) {
System.out.println("El asunto se nos ha desbordado");
finally {
Systern.out.println("Ha finalizado la ejecución");
Dentro del bloque que sigue a try colocamos el código a ejecutar. Es como si dijeramos
que vamos a intentar ejecutar dicho código a ver qué pasa. Después de try deberemos
colocar al menos un bloque catch o un bloque finally, pudiendo tener ambos e incluso
más de un bloque catch.
try {
for (int i=O; i<=3; i++)
System.out.println(rnensajes[i]);
catch ( ArrayindexOutOfBoundsException e ) {
Systern.out.println("El asunto se nos ha desbordado");
Clase Exception
Cuando se lanza una excepción, en nuestro mundo orientado objetos lo que se hace es
lanzar una instancia de Exception o de una clase derivada de él. Normalmente las clases
derivadas no añaden mucha funcionalidad (muchas veces ninguna en absoluto), pero al
ser distintas nos permiten distinguir entre los distintos tipos de excepciones.
En el programa anterior, por ejemplo, en el bloque catch capturábamos una excepción
del tipo ArrayindexOutOfBoundsException, ignorando cualquier otro tipo de
excepción.
Esta clase tiene como cositas interesantes dos constructores y dos métodos (tiene más
métodos pero sólo vamos a ver éstos):
String e.getMessage()
Devuelve el mensaje detallado si existe o null en caso contrario.
void e.printStackTrace()
Escribe por la salida de error estándar una traza que nos permitirá localizar donde se generó
el error. Es muy útil para depurar, pero no es conveniente que lo usuarios finales vean estas cosas.
45
Capturar excepciones
Ahora sabemos lo suficiente como para entender cómo funcionan los catch. Entre
paréntesis, cual parámetro se pone la declaración de una excepción, es decir, el nombre
de una clase derivada de Exception (o la misma Exception) seguido por el nombre de la
variable. Si se lanza una excepción que es la que deseamos capturar o una derivada de la
misma se ejecutará el código que contiene el bloque. Así, por ejemplo:
catch (Exception e) {
Se ejecutará siempre que se produzca una excepción del tipo que sea, ya que todas las
excepciones se derivan de Exception. No es recomendable utilizar algo así ya que
estamos capturando cualquier tipo de excepciones sin saber si eso afectará a la ejecución
del programa o no.
catch (Exception e) {
)
catch (DerivadaDeException e) {
Las excepciones en Java son objetos reales, y tienen su propía jerarquía. La clase raíz de
ellas es Throwable, una subclase de Object. Los métodos que se definen dentro de ella
serán los encargados de los mensajes de error que estén relacionados con cada una de las
excepciones.
46
Object
Error Exception
Ru ntimeExce ptio n
lndexOutOffioundsException
Todos los errores y excepciones son subclases de Throwable, por lo que podrán acceder a
sus métodos. Los métodos más utilizados son los siguientes:
getMessage{ ) Se usa para obtener un mensaje de error asociado con una excepción.
printStackTrace{ ) Se utiliza para imprimir el registro del stack donde se ha iniciado la
excepción.
toString{ ) Se utiliza para mostrar el nombre de una excepción junto con el mensaje que
devuelve getMessage().
47