Apunes Java
Apunes Java
Apunes Java
PROGRAMACIÓN I
(Lenguaje JAVA)
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
INTRODUCCION AL LENGUAJE JAVA.
Conceptos Básicos.
El lenguaje Java nace en 1991 en Sun Microsystems Inc.
Es un lenguaje derivado de C y C++.
Fue creado por James Gosling, Patrick Naughton, Chris Warth, Ed Frank y
Mike Sheridan.
Originalmente se llamó “Oak”, en 1995 cambió su nombre a Java.
La intención era crear un lenguaje de programación para desarrollar
software para diversos dispositivos electrónicos como hornos de
microondas y controles remotos, se buscaba un lenguaje de programación
que fuera independiente de la plataforma y que se pudiese ejecutar en
distintos tipos de CPUs bajo diferentes entornos.
Actualmente, una de las principales aplicaciones de Java es en Internet, ya
que un programa en java puede “correrse”, independientemente del sistema
operativo o del navegador.
La primera versión comercial de Java se lanzó en 1997 y se denominó JDK
1.1. En diciembre de 1998 Sun lanzó la plataforma Java 2, la cual se
conoció originalmente como JDK 1.2.
La principal característica de Java es el byte-code (o código de bytes), esto
significa que el código fuente Java se "compila" a un código de bytes de alto
nivel independiente de la máquina. Este código, llamado bytecode, está
diseñado para ser interpretado y ejecutarse en una máquina hipotética,
llamada Máquina Virtual de Java o JVM (Java Virtual Machine).
Para desarrollar programas en Java, es necesario contar con un entorno de
desarrollo, el más común es el Java Development Kit (JDK).
Programa en Java
Sistema Operativo
Computadora
Las características principales que nos ofrece Java con respecto a
cualquier otro lenguaje de programación, son:
a) Sencillo.
b) Orientado a objetos.
c) Distribuido.
d) Robusto.
e) Arquitectura neutra.
f) Seguro.
g) Portable.
h) Multihilo.
i) Interpretado.
j) Dinamico
El entorno de desarrollo JAVA.
http://www.oracle.com/technetwork/java/javase/downloads/
index.html
jGRASP
/* Hola.java */
class Hola
{
Conceptos Básicos.
Objeto.
b) Los mensajes.
Una clase puede ser considerada como un formato o plantilla para crear
objetos, los cuales serán de esa clase o tipo.
Una clase describe los métodos y atributos que definen las características
comunes a todos los objetos de esa clase. De esta manera, la clave de la
programación orientada a objetos, consiste en abstraer (o visualizar de
forma muy general) los métodos y atributos comunes a un conjunto de
objetos y encapsularlos en una clase.
e) Las subclases.
atributos
mensajes
métodos
CARACTERÍSTICAS DE LA PROGRAMACIÓN
ORIENTADA A OBJETOS.
1) Abstracción.
Abstraer significa: “separar mentalmente”. En programación, la abstracción
consiste en la generalización conceptual de los atributos y propiedades de
un determinado conjunto de objetos. De esta manera, la clave de la
programación orientada a objetos está en abstraer los métodos y los datos
comunes a un conjunto de objetos y almacenarlos en una clase.
2) Encapsulamiento.
Se refiere a la práctica de incluir dentro de un objeto todo lo que necesita,
de forma que ningún otro objeto pueda conocer nunca su estructura
interna.
3) Herencia.
La herencia es el mecanismo mediante el cual se comparten y derivan,
métodos y atributos entre clases y subclases.
Costo Costo
Dimensiones Dimensiones
Peso Peso
Localización Localización
Color Color
Objeto: sillón
Alta Alta
Baja Costo Baja
Consulta Dimensiones Consulta
Peso
Modificación Localización
Modificación
Color
objeto
atributos
métodos
mensajes
atributos atributos
mensajes
métodos métodos
Estructura de un programa en Java.
<sentencia(s) import> Declaración para importar clases de paquetes.
Ejemplo:
En Java se utiliza el carácter de punto y coma (;) para indicar el fin de una
sentencia. Se pueden colocar varias sentencias en una línea siempre y
cuando se separen con puntos y comas. Así mismo, un bloque es un
conjunto de sentencias con un punto y coma después de cada una de ellas
y van encerradas entre llaves { }.
Comentarios.
Todos los datos tienen un tipo asociado con ellos. El tipo de un dato
determina el conjunto de valores que puede tomar una variable tomando
en cuenta la representación interna de los números o el espacio de
memoria ocupado por una variable de un tipo dado. La unidad de medida
de la capacidad de memoria es el byte (octeto); un byte se compone de
ocho dígitos binarios (bits) que pueden tomar cada uno el valor 0 ó 1.
A) Enteros.
B) Reales.
C) Caracteres.
D) Lógicos o Booleanos.
A) Tipos Enteros.
Los tipos enteros de datos son:
Son números sin punto decimal en formato largo. Un valor long se define
como un dato de 64 bits de longitud, independientemente de la plataforma
en la que resida el bytecode de java. Están comprendidos en el rango de:
long -9’223,372’036,854’775,808 .. +9’223,372’036,854’775,807
Ejemplos:
long n, m;
long a = 2500000;
B) Tipos Reales.
Los tipos de datos reales son aquellos que representan al conjunto de los
números reales. Los números reales se pueden representar en dos formas:
1. Notación científica o de punto (coma) flotante.
El área ocupada por un número real se divide en dos zonas: mantisa y
exponente.
mantisa: número fraccionario (negativos o positivos)
exponente: Potencia de 10
número real = mantisa x 10 exponente
Esta notación se utiliza para representar números muy grandes o muy
pequeños. En notación decimal los números se escriben en notación
exponencial e (e de exponente y significa elevar 10 a la potencia que le
sigue).
n e ± dd
n número decimal (con o sin signo + o -)
dd exponente entero (positivo, negativo o cero)
Ejemplo: 2.83 x 105 (2.83e+5)
2. Notación en punto fijo.
Expresa el número real con un punto decimal.
Ejemplo: 3.1416
a) float. (reales en simple precisión - 4 bytes).
A. Constantes literales.
Las constantes literales o constantes son las más utilizadas, se llaman
así porque toman un valor directo o literal y así se escriben directamente
en el programa; se clasifican en cuatro grupos:
a) Constantes enteras.
b) Constantes reales.
c) Constantes carácter.
d) Constantes de cadena.
a) Constantes enteras.
El lenguaje Java permite especificar un entero en base: 10 (decimal), 8
(octal) y 16 (hexadecimal). Si la constante es positiva, el signo más (+) es
opcional. Si es negativa, lleva el signo menos (-). El tipo de una constante
está determinado por su valor. También se puede añadir un sufijo (en
mayúsculas o minúsculas). Si el sufijo es L, su tipo es long.
Ejemplo: 1000L constante entera de tipo long
Una constante decimal puede tener uno o más dígitos, con valores de 0
a 9, de los cuales el primero de ellos es distinto de cero. No se deben
utilizar nunca comas ni otros signos de puntuación en números enteros.
Ejemplo: 4326
Una constante octal puede tener uno o más dígitos, con valores de 0 a 7,
precedidos por 0 (cero).
Ejemplo: 0400
Cuando una constante se califica con final y static, sólo existirá una copia
de la constante para todos los objetos que se declaren de esa clase. Si no
se califica con static, cada objeto incluirá su propia copia de la constante.
En los métodos, las constantes locales no pueden ser declaradas static. La
forma más común de declarar una constante es utilizando únicamente el
calificador final, los nombres de constantes declaradas se acostumbra
escribirlos con mayúsculas.
Ejemplo:
final int MAX = 100;
final double PI = 3.141592;
VARIABLES.
Las variables son posiciones de memoria con nombre cuyo valor puede
cambiar durante la ejecución del programa, el cambio se produce
mediante sentencias ejecutables. El nombre de la posición es un
identificador válido y se llama nombre de la variable y el valor
almacenado en la posición se llama valor de la variable. Todas las
variables de un programa en Java deben ser declaradas antes de ser
utilizadas. La declaración consiste en enunciar el nombre de la variable y
asociarle un tipo. El tipo determina los valores que puede tomar la
variable así como las operaciones que con ella pueden realizarse. La
declaración de una variable en Java puede situarse en cualquier parte del
programa:
a) En una clase, como miembro de la clase.
b) Al principio de un método o bloque de código.
c) En el lugar en que será utilizada.
La sintaxis correspondiente a la declaración de una variable es la siguiente:
Formato:
tipo Nombre [, Nombre2, Nombre3...];
tipo Determina el tipo de la variable (char, int, float, double, ...).
Nombre Indica el nombre de la variable (o variables separadas por comas
si son más de una).
Ejemplo:
int cont, i, posición;
char c;
float x, y;
Las variables miembro de una clase siempre son inicializadas por defecto
por el compilador Java para cada objeto que se declare de la misma: las
variables numéricas a 0, los caracteres a ‘\0’, las lógicas a false y las
referencias a cadenas de caracteres y otros objetos a null. Sin embargo,
una variable puede ser inicializada cuando se declara.
Ejemplo:
char car = '\0'; /* car es igual al carácter nulo */
int i = 1; /* inicializa i a 1 */
float a = 0.0F; /* inicializa a a 0 */
a) Declaración de una variable en una clase, como miembro de la clase.
La variable se declara como un miembro de la clase, al mismo nivel que los
métodos de la clase. Estas variables están disponibles para todos los
métodos de la clase y para todas las clases declaradas en el mismo
programa, por lo que puede decirse que una variable de clase es global
para esa clase, sus subclases y los programas que definen y utilizan
objetos de esa clase. A estas variables se les asigna memoria cuando se
crea un objeto de la clase y permanece, hasta que el objeto es liberado
automáticamente o termina la ejecución del programa. Se les llama también
variables de instancia.
Formato:
Modificador tipo Nombre;
Ejemplo:
private int cont, i, posición; Declarada privada.
protected char c; Declarada protected.
float x, y; Declarada por omisión (sin modificador).
public Se puede acceder a la variable desde cualquier método.
protected Los métodos de la clase, los métodos de las clases del mismo paquete pueden acceder a la
variable y también los métodos de las clases derivadas.
private Sólo los métodos de la clase pueden acceder a la variable.
por omisión Los métodos de la clase y los de las clases del mismo paquete pueden acceder a la variable.
(sin modificador)
b) Declaración de una variable al principio de un método o bloque de
código.
Las variables también se pueden declarar en un método o en un bloque
dentro de un método, por ejemplo un ciclo. Las variables que se declaran al
interior de un método se consideran variables locales. Las variables locales
son aquellas definidas en el interior de un método y son visibles sólo en ese
método en particular. No pueden ser modificadas por ninguna sentencia
externa al método. Dos o más métodos pueden definir variables con el
mismo nombre (por ejemplo: contadores y acumuladores). Las variables
locales de los métodos no existen en memoria hasta que se ejecuta el
método; por esta razón, a estas variables locales se les denomina también
automáticas o auto, ya que se crean automáticamente en la entrada al
método y se liberan automáticamente cuando se termina la ejecución del
método.
Ejemplo:
long factorial (int n)
{
int i = 1;
long a = 1;
•••
}
c) Declaración de una variable en el lugar en que será utilizada.
El lenguaje Java tiene una gran flexibilidad ya que permite declarar una
variable en el punto donde se vaya a utilizar. Esta propiedad se utiliza
principalmente en diseño de ciclos, ya que es posible declarar la variable
en el momento de su utilización.
Ejemplo:
for ( int i = 0; i < 10; i++) {
•••
}
CONVERSIÓN ENTRE TIPOS DE DATOS.
byte short
int long float double
char
Moldes.
Las conversiones de tipo solo se aplican a los valores que sean operados
cuando la expresión es evaluada, fuera de la expresión, la variable es del
tipo que fue definida. Sin embargo, Java permite una conversión explícita
(conversión forzada) del tipo de una expresión mediante una construcción
denominada cast (molde) y tiene la siguiente forma:
(tipo) expresión
Resta - -
Multiplicación * x •
División / / ÷
Ejemplos:
int a = 10, b = 3, c;
float x = 2.0F, y;
x = b2 - 4ac x = b * b - 4 * a * c;
y2 - y1
m = m = ( y2 - y1 ) / ( x2 - x1 );
x2 - x1
x+y 5
a = + a = ( x + y ) / ( z + w ) + 5 / ( 1 + x * x );
z+w 1 + x2
b) Operadores de Relación.
Los operadores de relación (también llamados de comparación) se
utilizan para relacionar o comparar dos expresiones u operandos, los
operadores de relación son:
operando ! operando
true false
false true
d) Operador ^ (xor).
Cuando alguna de las condiciones es true (se cumple) y la otra false, el
resultado es true. En caso contrario, si ambas son true o false, la
expresión es false.
XOR 2 ^ (o excluyente)
Y 3 && ∧ (conjunción)
O 4 || ∨ (disyunción)
Operador Operación
Operador Operación
++ Incremento.
-- Decremento.
= Asignación simple.
*= Multiplicación más asignación.
/= División más asignación.
%= Módulo más asignación.
+= Suma más asignación.
-= Resta más asignación.
<<= Desplazamiento a la izquierda mas asignación.
>>= Desplazamiento a la derecha más asignación con extensión de signo.
>>>= Desplazamiento a la derecha más asignación rellenando con ceros.
&= Operación AND sobre bits más asignación.
|= Operación OR sobre bits más asignación.
^= Operación XOR sobre bits más asignación.
f) Operadores Lógicos para el Manejo de Bits.
Operador Operación
& Operación AND a nivel de bits.
| Operación OR a nivel de bits (ASCII 124).
^ Operación XOR a nivel de bits.
<< Desplazamiento a la izquierda.
>> Desplazamiento a la derecha con extensión de signo.
>>> Desplazamiento a la derecha rellenando con ceros.
Los operadores Y, O y XOR producen un resultado basado en la comparación de los
bits correspondientes de cada operando. El operador Y activa un bit si los dos bits
que se comparan son 1. El operador O activa un bit si uno de los bits que se
comparan es 1. El operador XOR (O excluyente) activa un bit si uno de los dos bits
comparados es 1, pero no si los dos son 1 o 0.
El operador complemento a uno (~) es un operador unario que invierte el estado de
cada bit de un entero o carácter. De forma que los 1 se ponen a 0 y los 0 a 1.
Los operadores de desplazamiento >>, >>> y <<, mueven todos los bits de una
variable a la derecha o a la izquierda, según se especifique. A medida que se
desplazan los bits hacia un extremo se va rellenando con ceros (>>) o por el valor
del bit más significativo (>>>) por el extremo opuesto. Los bits que salen se pierden.
Un desplazamiento a la derecha de un número negativo introduce unos.
a) Operador condicional.
Java tiene un operador condicional, llamado también operador ternario
( ? : ), que se utiliza en expresiones condicionales y tienen la forma:
operando1 ? operando2 : operando3 ;
e) Operador new.
El operador new es un operador que reserva memoria dinámicamente para
un objeto, esto es, se usa para crear un objeto. Su forma general es:
variable = new nombre_de_clase();
PROGRAMACIÓN I
Instrucciones Fundamentales
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
INSTRUCCIONES FUNDAMENTALES.
class Cubo
{
double lado;
// Constructor para el objeto Cubo.
Cubo (double l) {
lado = l;
}
••• // Definición de métodos.
}
5. Método main( ).
Todos los programas de aplicación de Java inician su ejecución llamando al
método main(). Esto significa que main() es el programa principal o punto
de inicio de la aplicación, y también su punto de salida. Cada programa de
aplicación en Java tiene un método main() y solo uno, si tiene más de un
main() se produce un error, aunque estén en diferentes clases. Las clases
de Java no necesariamente deben tener un método main(), a menos que
esa clase tenga el programa principal El método main() se define de
cualquiera de la siguientes maneras:
Las clases del paquete java.io están divididas en dos grupos distintos. Uno
ha sido diseñado para trabajar con datos de tipo byte y el otro con datos de
tipo char.
Así mismo, la biblioteca de Java proporciona tres flujos estándar manejados
por la clase System del paquete java.lang. Estos flujos predefinidos son
automáticamente abiertos cuando se inicia un programa, y cerrados cuando
finaliza:
System.in. Referencia a la entrada estándar del sistema, que normalmente
es el teclado. Se utiliza para leer datos introducidos por el usuario.
System.out. Referencia a la salida estándar del sistema, que normalmente
es la pantalla. Se utiliza para mostrar los datos al usuario.
System.err. Referencia a la salida estándar de error del sistema, que
normalmente es el monitor. Se utiliza para mostrar mensajes de error al
usuario.
La clase System define dos referencias a objetos static para la entrada por
teclado y salida por monitor:
System.in para entrada por teclado.
System.out para salida por pantalla.
Flujos de salida.
OutputStream.
La clase OutputStream es una clase abstracta que es una superclase de
todas las clases que representan un flujo en el que un origen escribe bytes
en un destino. El método más importante de esta clase es write. Este
método se presenta de tres formas:
public void write ( int b) throws IOException
public void write ( byte[ ] b) throws IOException
public void write ( byte[ ] b, int off, int len) throws IOException
La primera versión de write simplemente escribe el byte especificado en un
flujo de salida. Puesto que el parámetro es de tipo int, lo que se escribe es
el valor correspondiente a los 8 bits menos significativos, el resto son
ignorados.
La segunda versión del método write escribe los bytes almacenados en el
arreglo b en un flujo de salida.
La tercera versión del método write escribe un máximo de len bytes de un
arreglo b a partir de su posición off, en un flujo de salida.
Cada uno de estos métodos ha sido escrito para que bloquee la ejecución
del programa que los manda llamar hasta que toda la salida solicitada haya
sido escrita.
Por su parte, la clase Writer es una clase abstracta que es superclase de
todas las clases que representan un flujo para escribir caracteres a un
destino. Sus métodos son similares a los de la clase OutputStream, con la
diferencia de que utilizan parámetros de tipo char en lugar de tipo byte.
System.out
El objeto out definido en la clase System está asociado con el flujo de
salida que dirige los datos y permite visualizarlos en el monitor. Con estos
métodos se puede imprimir cualquier cadena (String) o tipo de dato
primitivo o referenciado: Object, char[ ], int, short, long, double y bolean.
El método se encarga de convertir a cadena esos tipos básicos y
mostrarlos en pantalla. Así mismo, se pueden concatenar cadenas con
caracteres, enteros, etcétera, para lo cual se utiliza el operador +, que
internamente realiza la conversión. También existe una versión de println
que no tiene argumentos y lo que hace es avanzar a la línea siguiente.
System.out es una referencia a un objeto de la clase PrintStream, el cual
es un flujo de salida derivado de OutputStream, y tiene métodos que
permiten fácilmente la salida por pantalla. Estos métodos son:
Código Significado
‘\b’ Retroceso (backspace).
‘\n’ Salto de línea (line feed).
‘\r’ Retorno de carro (return).
‘\t’ Tabulación horizontal.
‘\f’ Salto de página (form feed).
‘\"’ Imprime comillas dobles.
‘\'’ Imprime una comilla simple.
‘\0’ Carácter nulo.
‘\\’ Imprime una barra invertida.
‘\000’ Número octal.
‘\uhhhh’ Número hexadecimal.
PrintWriter.
En la mayor parte de las aplicaciones reales de Java, no se utilizan programas cuya
salida basada en texto, sea a través del monitor, sino que serán aplicaciones
gráficas que basen su interacción con el usuario en un conjunto de herramientas
gráficas denominado AWT (Abstract Window Toolkit). Sin embargo, se recomienda el
uso de la clase PrintWriter en programas reales y aplicaciones de software con
salidas basadas en texto. PrintWriter es una clase que se basa en caracteres y, por
esta razón, resulta más fácil para la utilización internacional de un programa.
PrintWriter define varios constructores, el más recomendado es el siguiente:
PrintWriter (OutputStream flujosalida, bolean flushOnNuevalínea)
Donde flujosalida es un objeto del tipo OutputStream, y flushOnNuevalínea, una
variable booleana que controla si Java limpia el flujo de salida cada vez que se llama
al método println(). Si la variable flushOnNuevalínea es true, el flujo de salida se
limpia automáticamente. En caso de que sea false, esta limpieza no es automática.
La clase PrintWriter soporta los métodos print() y println() para todos los tipos,
incluyendo Object. Por lo tanto se pueden utilizar estos métodos de la misma
manera que se utilizan con System.out. Si un argumento no es de un tipo sencillo,
los métodos de PrintWriter llaman al método toString() del objeto, y entonces se
imprime el resultado.
Para escribir en la pantalla utilizando la clase PrintWriter, hay que especificar el
System.out para el flujo de salida y limpiar el flujo después de cada nueva línea. El
siguiente ejemplo crea un objeto PrintWriter que está conectado a la salida por el
monitor:
PrintWriter pw = new PrintWriter (System.out, true);
Visualizar datos con formato.
Los resultados producidos por las aplicaciones pueden tener algún tipo de
formato, ya que es posible que en alguna ocasión necesitemos expresar
una cantidad:
• Incluyendo el punto de los decimales y la coma de los miles.
• Con un determinado número de dígitos enteros, completando con ceros
por la izquierda si fuera necesario.
• Con un número determinado de decimales y ajustada a la derecha.
• O con una serie de cantidades decimales, una debajo de otra, ajustadas
por el punto decimal.
Si en lugar de cantidades hablamos de fechas, también podemos requerir
de diferentes modos de presentación.
Para controlar los distintos formatos, Java proporciona un conjunto de
clases en el paquete java.text. La clase Format es una clase abstracta
para dar formato a números, fechas/hora y mensajes. De esta clase se
derivan tres subclases especializadas en cada una de las tareas
mencionadas: NumberFormat, DateFormat y MessageFormat.
La clase NumberFormat es la clase base abstracta para todos los formatos
numéricos. La clase DateFormat es también una clase abstracta para los
formatos de fechas y horas. Pero las clases que son particularmente útiles y
que nos interesa conocer son: DecimalFormat, SimpleDateFormat y
MessageFormat.
a) Dar formato a números.
Para dar formato a un número, primero hay que crear un objeto formateador
basado en un formato específico, y luego utilizar su método format para
convertir el número en una cadena construida a partir del formato elegido.
Los símbolos que se pueden utilizar para especificar un determinado
formato son:
Símbolo Significado
0 Representa un dígito cualquiera, incluyendo los ceros no significativos.
# Representa un dígito cualquiera, excepto los ceros no significativos.
. Representa el separador decimal.
, Representa el separador de los miles.
E Formato de notación científica. E, separa la mantisa y el exponente.
; Actúa como separador cuando se especifican varios formatos.
- Signo negativo de forma predeterminada.
% Multiplicar por 100 y mostrar el símbolo %.
$ Representa el símbolo monetario.
carácter Cualquier carácter puede ser utilizado como prefijo o como sufijo. Por
ejemplo: $ o ‘\u0024’.
El siguiente ejemplo crea un objeto llamado formato que permitirá obtener
números formateados con dos decimales, si los hay, con la coma de los
miles.
DecimalFormat formato = new DecimalFormat(“###,###.##”);
String salida = formato.format(dato);
Donde (“es”, “MX”) significa español de México. Otros ejemplos de localidades son:
(“en”, “US”), significa inglés de Estados Unidos, (“en”, “GB”), significa inglés de Gran
Bretaña; (“es”, “ES”), significa español de España, (“fr”, “FR”), significa francés de
Francia; (“de”, “DE”), significa alemán de Alemania; etc. Sin embargo, una localidad
no es un idioma, ya que un mismo idioma se puede hablar en varios países. Cuando
se escriba un programa internacional se tendrá que definir la localidad actual y el
conjunto de localidades que soportará el programa. Las localidades son definidas en
Java por la clase Locale incluida en el paquete java.util. Un objeto de la clase
Locale es simplemente un identificador para una localidad específica. Por ejemplo,
el siguiente código crea dos objetos: país[0] y país[1], uno para el español de
México y otro para el inglés de Estados Unidos.
Locale[ ] país = {
new Locale(“es”, “MX”);
new Locale(“en”, “US”);
};
Aplicando todos los métodos, se puede obtener el formato predeterminado para
cualquiera de éstos dos países. Por ejemplo:
DecimalFormat df = (DecimalFormat) DecimalFormat.getNumberInstance(país[i]);
Flujos de entrada.
InputStream.
La clase InputStream es una clase abstracta que es una superclase de
todas las clases que representan un flujo en el que un destino lee bytes de
un origen. El método más importante de esta clase es read. Este método se
presenta de tres formas:
public int read ( ) throws IOException
public int read ( byte[ ] b) throws IOException
public int read ( byte[ ] b, int off, int len) throws IOException
La primera versión de read simplemente lee bytes individuales de un flujo
de entrada; concretamente lee el siguiente byte de datos disponible.
Devuelve un entero (int) correspondiente al valor ASCII del carácter leído al
número de bytes leídos si se lee un arreglo o bien -1 cuando en un intento
de leer datos se alcanza el final del flujo (si no hay más datos).
La segunda versión del método read lee un número de bytes de un flujo de
entrada y los almacena en un arreglo b. Devuelve un entero
correspondiente al número de bytes leídos, o bien -1 si no hay bytes
disponibles para leer porque se ha alcanzado el final del flujo.
La tercera versión del método read lee un máximo de len bytes a partir de
su posición off de un flujo de entrada y los almacena en un arreglo b.
Cada uno de estos métodos ha sido escrito para que bloquee la ejecución
del programa que los manda llamar hasta que toda la entrada solicitada
esté disponible.
Por su parte, la clase Reader es una clase abstracta que es superclase de
todas las clases que representan un flujo para leer caracteres desde un
origen. Sus métodos son similares a los de la clase InputStream, con la
diferencia de que utilizan parámetros de tipo char en lugar de tipo byte.
System.in.
La clase System.in define un objeto de la clase BufferedInputStream, cuya
referencia viene dada por in. El objeto está asociado a un flujo estándar de
entrada que por defecto es el teclado. Los elementos básicos de este flujo
son caracteres individuales, no cadenas como ocurre con el objeto out.
Entre los métodos de la clase se encuentra read(), que devuelve el carácter
actual en el buffer de entrada o un entero correspondiente al valor ASCII del
carácter leído. Debido a que Sysyem.in es un flujo con buffer, no se pasa
ninguna entrada al programa hasta que no se oprime la tecla <ENTER>.
Ejemplo:
char c;
int b;
c = (char) System.in.read( ); // Si capturamos: A
System.out.println(c); // Imprime: A
b = (byte) System.in.read( ); // Si capturamos: A
System.out.println(b); // Imprime: 65
Como no resulta práctico capturar la entrada, carácter por carácter, se hace
línea por línea. Para esto se utiliza primero la clase ImputStreamReader, de
la que se crea un objeto inicializado con System.in:
InputStreamReader endat = new InputStreamReader (System.in);
Este objeto que se crea, se utilize a su vez como argumento para inicializar
otro objeto de la clase BufferedReader, el cual permite capturar las líneas
de caracteres del teclado con el método readLine():
BufferedReader entrada = new BufferedReader ( endat );
int i;
Scanner leeDato = new Scanner(System.in);
i = leeDato.nextInt();
Método Descripción
nextByte() Lee y devuelve la subcadena leída como un valor byte.
nextShort() Lee y devuelve la subcadena leída como un valor short.
nextInt() Lee y devuelve la subcadena leída como un valor int.
nextLong() Lee y devuelve la subcadena leída como un valor long.
nextFloat() Lee y devuelve la subcadena leída como un valor float.
nextDouble() Lee y devuelve la subcadena leída como un valor double.
nextBoolean() Lee y devuelve la subcadena leída como un valor bolean.
nextBigDecimal() Lee y devuelve la subcadena leída como un valor BigDecimal.
nextBigInteger() Lee y devuelve la subcadena leída como un valor BigInteger.
next() Lee y devuelve el símbolo o la subcadena leída.
Clases que encapsulan los tipos primitivos.
Java incorpora los tipos básicos como int, long, char, etc. Pero además
proporciona la declaración de una clase para cada uno de los tipos básicos,
denominadas clases envoltorio. El paquete java.lang proporciona las clases
Byte, Character, Short, Integer, Long, Float, Double y Boolean, que
encapsulan cada uno de los tipos primitivos y proporcionan los métodos
parseByte(), parseShort(), parseInt() y parseLong() respectivamente.
Estos métodos devuelven el equivalente byte, short, int, y long de la
cadena numérica que los llama. Existen métodos similares para las clases
Float y Double.
De acuerdo con esto, para obtener un número a partir de una cadena de
caracteres proporcionada por readLine habrá que ejecutar los siguientes
pasos:
1. Definir un flujo de entrada de la clase BufferedReader.
2. Leer la cadena de caracteres.
3. Convertir el objeto String en un número del tipo deseado.
A su vez, para convertir un número entero en una cadena decimal, han de
usarse las versiones de toString() definidas en las clases Byte, Short,
Integer, o Long. Las Integer y Long también proporcionan los métodos
toBinaryString(), toHexString() y toOctalString(), que convierten un valor
en una cadena binaria, hexadecimal u octal, respectivamente.
a) Clase Byte.
Esta clase se corresponde con el tipo byte, cada objeto de esta clase
contiene un entero de tipo byte. Las variables del tipo clase Byte son
referenciadas a objetos que se crean con el operador new. El constructor
que se aplica al crear un objeto de esta clase tiene como argumento un
número entero de tipo byte.
Formato para crear un objeto Byte:
byte variable;
Byte variable = new Byte (valor);
Método Descripción
doubleValue() Devuelve el objeto Byte como un valor double.
floatValue() Devuelve el objeto Byte como un valor float.
byteValue() Devuelve el objeto Byte como un valor byte.
shortValue() Devuelve el objeto Byte como un valor short.
intValue() Devuelve el objeto Byte como un valor int.
longValue() Devuelve el objeto Byte como un valor long.
parseByte(String) Convierte una cadena a un valor byte.
toString(int) Convierte un valor byte en una cadena (objeto
String).
valueOf(String) Crea un objeto Byte a partir de una cadena.
b) Clase Short.
Esta clase se corresponde con el tipo short, cada objeto de esta clase
contiene un entero de tipo short. Las variables del tipo clase Short son
referenciadas a objetos que se crean con el operador new. El constructor
que se aplica al crear un objeto de esta clase tiene como argumento un
número entero de tipo Short.
Formato para crear un objeto Short:
short variable;
Short variable = new Short (valor);
Método Descripción
doubleValue() Devuelve el objeto Short como un valor double.
floatValue() Devuelve el objeto Short como un valor float.
byteValue() Devuelve el objeto Short como un valor byte.
shortValue() Devuelve el objeto Short como un valor short.
intValue() Devuelve el objeto Short como un valor int.
longValue() Devuelve el objeto Short como un valor long.
parseShort(String) Convierte una cadena a un valor short.
toString(int) Convierte un valor short en una cadena (objeto
String).
valueOf(String) Crea un objeto Short a partir de una cadena.
c) Clase Integer.
Esta clase se corresponde con el tipo int, cada objeto de esta clase
contiene un entero de tipo int. Las variables del tipo clase Integer son
referenciadas a objetos que se crean con el operador new. El constructor
que se aplica al crear un objeto de esta clase tiene como argumento un
número entero de tipo Integer.
Formato para crear un objeto Integer:
int variable;
Integer variable = new Integer (valor);
Método Descripción
doubleValue() Devuelve el objeto Integer como un valor double.
floatValue() Devuelve el objeto Integer como un valor float.
byteValue() Devuelve el objeto Integer como un valor byte.
shortValue() Devuelve el objeto Integer como un valor short.
intValue() Devuelve el objeto Integer como un valor int.
longValue() Devuelve el objeto Integer como un valor long.
parseInt(String) Convierte una cadena a un valor int.
toString(int) Convierte un valor int en una cadena (objeto String).
valueOf(String) Crea un objeto Integer a partir de una cadena.
d) Clase Long.
Esta clase se corresponde con el tipo long, cada objeto de esta clase
contiene un entero de tipo long. Las variables del tipo clase Long son
referenciadas a objetos que se crean con el operador new. El constructor
que se aplica al crear un objeto de esta clase tiene como argumento un
número entero de tipo Long.
Formato para crear un objeto Long:
long variable;
Long variable = new Long (valor);
Método Descripción
doubleValue() Devuelve el objeto Long como un valor double.
floatValue() Devuelve el objeto Long como un valor float.
byteValue() Devuelve el objeto Long como un valor byte.
shortValue() Devuelve el objeto Long como un valor short.
intValue() Devuelve el objeto Long como un valor int.
longValue() Devuelve el objeto Long como un valor long.
parseLong(String) Convierte una cadena a un valor long.
toString(int) Convierte un valor long en una cadena (objeto
String).
valueOf(String) Crea un objeto Long a partir de una cadena.
e) Clase Double.
Esta clase funciona de forma parecida a las clases enteras, sin embarga, a
partir de la versión 1.3 de JDK se incorporó el método parseDouble(), que
es un método static que tiene como argumento una cadena y devuelve el
valor double correspondiente a la conversión de los números de la cadena.
Al ser un método static, se llama desde la clase y no desde un objeto de la
clase. Si la conversión no es posible, genera una excepción en tiempo de
ejecución. A continuación se presentan algunos de los métodos de esta
clase.
Atributo Descripción
MIN_VALUE Valor más pequeño de tipo double.
MAX_VALUE Valor más grande de tipo double.
NaN No es un número.
POSITIVE_INFINITY Más infinito.
NEGATIVE_INFINITY Menos infinito.
Método Descripción
doubleValue() Devuelve el objeto Double como un valor double.
floatValue() Devuelve el objeto Double como un valor float.
byteValue() Devuelve el objeto Double como un valor byte.
shortValue() Devuelve el objeto Double como un valor short.
intValue() Devuelve el objeto Double como un valor int.
longValue() Devuelve el objeto Double como un valor long.
parseDouble(String) Convierte una cadena a un valor double. (Java 2)
toString(int) Convierte un valor double en una cadena (objeto String).
valueOf(String) Crea un objeto Double a partir de una cadena.
f) Clase Float.
Esta clase funciona de forma parecida a las clases enteras, sin embarga, a
partir de la versión 1.3 de JDK se incorporó el método parseFloat(), que
es un método static que tiene como argumento una cadena y devuelve el
valor float correspondiente a la conversión de los números de la cadena.
Al ser un método static, se llama desde la clase y no desde un objeto de
la clase. Si la conversión no es posible, genera una excepción en tiempo
de ejecución. A continuación se presentan algunos de los métodos de esta
clase.
Atributo Descripción
MIN_VALUE Valor más pequeño de tipo float.
MAX_VALUE Valor más grande de tipo float.
NaN No es un número.
POSITIVE_INFINITY Más infinito.
NEGATIVE_INFINITY Menos infinito.
Método Descripción
doubleValue() Devuelve el objeto Float como un valor double.
floatValue() Devuelve el objeto Float como un valor float.
byteValue() Devuelve el objeto Float como un valor byte.
shortValue() Devuelve el objeto Float como un valor short.
intValue() Devuelve el objeto Float como un valor int.
longValue() Devuelve el objeto Float como un valor long.
parseFloat(String) Convierte una cadena a un valor float. (Java 2)
toString(int) Convierte un valor float en una cadena (objeto String).
valueOf(String) Crea un objeto Float a partir de una cadena.
Excepciones.
Una excepción indica una condición anormal que no se debe encontrar durante la
ejecución normal de un programa. Así, una excepción es un error del programa que
sucede durante su ejecución. Por ejemplo, una entrada incorrecta de datos o una
división entre cero, Java lanza una excepción, que cuando no se captura envía un
mensaje sobre lo ocurrido y detiene su ejecución (las excepciones se lanzan
<throw>, no ocurren). Por lo que, si deseamos que la ejecución del programa no se
detenga, debemos capturarla <catch> y manejarla de manera adecuada para
reanudar la ejecución del programa.
Las excepciones en Java son objetos de subclases de Throwable. Por ejemplo, el
paquete java.io define una clase de excepción general denominada IOException
para excepciones de Entrada/Salida.
Una vez que se lanza una excepción, ésta no desaparece aunque el programador la
ignore (una excepción no se puede ignorar ni suprimir). Una condición de excepción
se debe reconocer y manejar. Una excepción no manejada se propagará
dinámicamente hasta alcanzar el nivel más alto de la función (main en Java). Así,
cuando ocurre una excepción y no existe un manejador para la excepción, la
excepción se propaga al método que hizo la llamada; si en este caso tampoco se
captura la excepción, se propaga al método que a su vez lo invocó; si llega al
método por el que empieza la ejecución, main(), y tampoco es capturada, la
ejecución (del programa) termina.
En general, el mecanismo de excepciones en Java permite, principalmente,
la detección de errores y su posible recuperación, permitiendo separar
explícitamente el código que maneja los errores, del código básico de una
aplicación, haciéndolo más legible. La forma general del mecanismo de
excepciones es:
try {
••• // Código de la aplicación.
}
catch ( clase_de_excepción e ) {
••• // Código de tratamiento de la excepción.
}
catch ( clase_de_excepción_2 e ) {
••• // Código de tratamiento para otra excepción.
}
Cada persona tiene una manera diferente de ver las cosas, lo cual se ve
reflejado en la forma en que visualiza un problema y el enfoque con el cual
le da solución. Asimismo, los analistas de sistemas y los programadores,
desarrollan sus programas de manera diferente según su punto vista. Por
lo cual, si se pide a diversas personas crear un programa para resolver un
mismo problema, cada una de ellas creará un programa diferente y aún
cuando las diferencias no sean muy grandes, no existirán dos programas
exactamente iguales, debido a que cada uno aplicó su estilo de programar.
El buen estilo de programación, es una de las características más
importantes que debe tener un programador. Un programa con buen estilo
es más fácil de leer, de corregir y de mantener. Aunque la experiencia
proporciona el estilo, existen una serie de reglas que se recomiendan
seguir desde el principio del aprendizaje de la programación.
a) Sangrías.
Los programas escritos en Java no exigen reglas muy estrictas en su
escritura, salvo el no usar las palabras clave como nombres de
identificadores y el respeto a las mayúsculas y minúsculas en los nombres
de las constantes declaradas, clases, objetos, métodos y paquetes. Sin
embargo, una práctica habitual y recomendable es el uso de sangrías en los
bloques, métodos y clases.
b) Comentarios.
Un comentario es un texto que explica una instrucción o procedimiento, se
sitúa en cualquier parte del programa y es ignorado por el compilador. Estos
comentarios pueden ser tan largos como se desee y son una parte
importante de la documentación de un programa, ya que ayudan al
programador y a otras personas a la comprensión del programa.
Formato:
1. /* Comentario de una o más líneas */
2. // Comentario de una sola línea
Se recomienda colocar comentarios en la cabecera del programa que
indiquen por lo menos lo siguiente:
- Nombre del programador.
- La fecha de la versión actual.
- Una breve descripción de lo que hace el programa.
c) Líneas en blanco.
Una forma de hacer un programa más legible es dejar líneas en blanco
entre partes importantes o que estén lógicamente separadas. Por ejemplo:
Entre la cabecera y la sección de declaraciones, entre métodos, antes de
main, etc.
d) Otros consejos prácticos.
•Elegir nombres de identificadores significativos.
•Evitar puntos y comas innecesarios.
•Tratar de que las líneas de programa no sean mayores de 80 caracteres.
•Alinear operaciones o separadores en líneas consecutivas, definiendo claramente
los métodos, estructuras y las operaciones anidadas dentro de ellas.
•Blancos no significativos, esto es, incluir un espacio a cada lado de un operador y
después de las comas, puntos y comas y dos puntos.
•Poner cada sentencia en una línea distinta.
•Si una sentencia continúa en otra línea, se debe(n) sangrar la(s) línea(s)
siguiente(s).
•Insertar líneas en blanco antes del programa principal, así como en cualquier
segmento o bloques de sentencias significativas.
•Utilizar espacios entre los elementos de una sentencia para hacerla más legible.
•Los números de tipo real no deben utilizarse para comprobar relaciones de igualdad
o desigualdad (==, !=, < o >), ya que éstos números son manejados en forma
aproximada por la computadora.
•Es conveniente verificar posibles divisiones entre cero, así como raíces cuadradas
de números negativos dentro del programa, lo cual puede provocarnos errores. Esto
se puede evitar mediante el uso de rutinas de validación y de captura de
excepciones.
•Asegurarse que cada sentencia o línea termine con punto y coma (;).
UNIVERSIDAD AUTONOMA DE SINALOA
FACULTAD DE INFORMÁTICA DE MAZATLAN
PROGRAMACIÓN I
Sentencias de Control
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
SENTENCIAS DE CONTROL.
B) Estructuras Selectivas.
Las estructuras selectivas, también llamadas de selección o de
comparación, se basan en la evaluación de expresiones lógicas a través
del uso de los operadores de relación y operadores lógicos. Existen
varios tipos de estructuras de selección, las cuales veremos a
continuación:
1. SENTENCIA: if
Esta estructura indica la elaboración de un proceso de acuerdo a una
expresión que se evalúa denominada expresión condicional. La expresión
condicional puede tomar dos posibles valores, estos valores son: verdadero
y falso.
En Java, una expresión es verdadera cuando al evaluarse devuelve un
valor true; y es falsa, cuando devuelve un valor false.
En su forma más simple, la sentencia if permite que un programa ejecute
condicionalmente una sentencia. A continuación se muestra la forma más
simple de if.
if (expresión) sentencia;
if (expresión) sentencia1;
else sentencia2;
if (expresión) {
sentencia1;
sentencia2;
. . .
sentenciaN;
}
else {
sentencia1;
sentencia2;
. . .
sentenciaN;
}
if (expresión) sentencia;
else
if (expresión) sentencia;
else
if (expresión) sentencia;
...
else sentencia;
* Uso de sentencias if anidadas:
if ( a > b )
if ( a > c )
mayor = a;
else
mayor = c;
else
if ( b > c )
mayor = b;
else
mayor = c;
if ( a > b )
mayor = ( a > c ) ? a : c;
else
mayor = ( b > c ) ? b : c;
System.out.println("El mayor es: "+mayor);
} /* fin del main */
} /* fin de la clase */
3. SENTENCIA: switch
La sentencia switch es la sentencia de selección múltiple de Java. Se usa
para seleccionar y ejecutar una sola opción de entre múltiples opciones.
Este tipo de estructura se utiliza comúnmente en los menús, donde según la
opción seleccionada, se ejecutará una (y solo una) secuencia de
instrucciones. Corresponde a la estructura de control En Caso De.
El formato general de la sentencia switch es el siguiente:
switch (variable) {
case (constante1) : conjunto de sentencias 1;
break;
case (constante2) : conjunto de sentencias 2;
break;
. . .
case (constanteN) : conjunto de sentencias N;
break;
default : sentencias por defecto;
}
Cada conjunto de sentencias puede contener una o más instrucciones o
sentencias. la parte default es opcional y equivale a de lo contrario.
La sentencia switch funciona comparando la variable con todas las
constantes. Tan pronto como encuentra una igualdad, se ejecuta el
correspondiente conjunto de sentencias. Si se omite la sentencia break, la
ejecución continúa hasta el final del switch, ejecutando todas las
sentencias antes y después de la igualdad. Se puede considerar a los case
como etiquetas. La ejecución del conjunto de sentencias continúa hasta que
se encuentra un break o el final del switch. La principal aplicación de esta
instrucción es en los menús de opciones.
La diferencia entre if y switch, es que la sentencia switch solo puede
probar una igualdad, mientras que if puede evaluar una expresión con
operadores de relación o lógicos.
switch (op) {
case ('a') : a = x + y;
System.out.println("la suma es: "+a);
break;
case ('b') : b = x - y;
System.out.println("la resta es: "+b);
break;
case ('c') : c = x * y;
System.out.println("la multiplicacion es: "+c);
break;
case ('d') : d = (y != 0) ? x / y : 0 ;
System.out.println("la division es: "+d );
break;
case ('e') : z = x % y;
System.out.println("el modulo es: "+z);
break;
default : System.out.println("No seleccionaste ninguna operación.");
}
C) Estructuras Repetitivas.
Las estructuras de control que permiten la repetición de una serie de
sentencias se denominan ESTRUCTURAS DE REPETICION O DE
ITERACION, y los procesos que se ejecutan dentro de estas estructuras se
denominan ciclos, bucles, gazas, iteraciones o lazos (en inglés, loop). El
cuerpo del ciclo contiene las sentencias que se repiten, hasta que se
cumpla o deje de cumplirse una cierta condición. Esta condición puede
estar o no predefinida.
Java proporciona tres estructuras de control repetitivas:
1.- while (estructura: Mientras - Haz).
2.- do (Haz – Hasta, funciona de manera similar a la estructura: Repite -
Hasta Que).
3.- for (estructura: Desde - Hasta - Haz).
1. SENTENCIA: while
La estructura repetitiva while (mientras), indica la repetición de una
sentencia o bloque de sentencias MIENTRAS se cumpla una determinada
condición. Cuando la sentencia while se ejecuta, lo primero que hace es
evaluar una expresión lógica o booleana. La secuencia se ejecuta
UNICAMENTE si la expresión condicional es verdadera (true). Esto es,
PRIMERO SE PREGUNTA POR LA CONDICION Y SI ESTA ES
VERDADERA, ENTONCES SE EJECUTA LA SECUENCIA O PROCESOS.
Puede darse el caso de que el proceso inscrito dentro de esta estructura no
se ejecute nunca, lo cual sucede cuando la expresión evaluada resulta falsa
(false).
La forma general de esta sentencia es:
while (condición) sentencias;
for Iteraciones
Valor Inicial < Valor Final Valor Final - Valor Inicial + 1
Valor Inicial = Valor Final 1
Valor Inicial > Valor Final 0
for iteraciones
Valor Inicial < Valor Final 0
Valor Inicial = Valor Final 1
Valor Inicial > Valor Final Valor Inicial - Valor Final + 1
Ciclos Anidados.
El cuerpo de un ciclo puede contener cualquier tipo de sentencias de
secuencia (simples o compuestas), selectivas o repetitivas. Cuando un
ciclo está contenido dentro de otro ciclo, se denominan ciclos o ciclos
anidados. Cualquiera de los ciclos de Java puede estar anidado dentro de
cualquier otro ciclo. El siguiente fragmento de programa escribe 10 veces
en pantalla los números del 1 al 10.
for (i=1; i<=10; i++) {
for (j=1; j<=10; j++)
System.out.println( j ); }
El tercer uso de la sentencia break, normalmente tiene que ver con la salida
de ciclos anidados, para poder llevarlo a cabo, el bloque de código debe
contener la sentencia break. No se puede transferir el control a un bloque del
código que no encierre la sentencia break.
boolean t = true;
...
uno : {
dos : {
if (t) break uno; // Sale del bloque dos al uno.
}
}
La sentencia continue funciona de manera un tanto opuesta a la sentencia
break ya que obliga a que se produzca la siguiente iteración del ciclo,
saltándose todas las instrucciones entre la sentencia y la condición de
prueba. En los ciclos while y do-while, una sentencia continue hará que el
control vaya directamente a la condición de prueba y que continúe después
el proceso del ciclo. En el ciclo for, se lleva a cabo el incremento del valor
de la variable de control del ciclo, se ejecuta la prueba condicional y el ciclo
continúa.
El siguiente programa muestra todos los números nones entre 1 y 100.
int i;
...
for ( i = 1; i < 101; i++ ) {
if ( i%2 == 0) continue;
System.out.println("Numero "+i); }
PROGRAMACIÓN I
Clases y Métodos
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
CLASES Y MÉTODOS.
El lenguaje java exige que el método main() se declare como public static
void. Las sentencias incluidas entre las llaves { … } se denominan bloque
de sentencias o simplemente bloque.
class Suma
{
public static void main(String args[ ])
{
int a = 3, b = 5, c;
c = a + b;
System.out.println("Este programa suma los números: "+a+" y "+b);
System.out.println("La suma es: "+c);
}
}
La sentencia return se utiliza para salir del método actual y devolver el valor
especificado por el tipo de retorno del método, cuando el tipo de retorno es void, la
palabra return se utiliza sola, sin ninguna variable, o no se utiliza. Sin embargo, los
métodos que devuelven a la rutina llamadora un tipo de datos diferente de void
deben utilizar una sentencia return con la siguiente sintaxis:
return expresión;
expresión Es una expresión con el valor que devuelve el método.
Los métodos se pueden sobrecargar, esto significa que dos métodos con diferentes
listas de parámetros pueden tener el mismo nombre. Los métodos, para ser
ejecutados, han de ser llamados o invocados. Cualquier expresión puede contener
una llamada a un método, lo cual redirige el control del programa al método
nombrado. Normalmente, la llamada a un método se realiza desde un método de
otra clase, desde el método principal main(), o inclusive, desde un método de la
misma clase. Un método que llama a otro método se llama método invocador y el
método llamado se denomina método invocado.
El método llamado recibe el control del programa, se ejecuta desde el principio y
cuando termina, el control del programa devuelve el control y regresa al método
llamador. La llamada a un método desde otro de la misma clase y para el mismo
objeto se lleva a cabo escribiendo el nombre y entre paréntesis la lista de
argumentos o parámetros actuales. La llamada a un método desde un objeto se
realiza con el nombre del objeto, el operador punto (.) y el nombre del método con
sus argumentos actuales.
objeto.nombreMétodo (lista de parámetros actuales);
Los métodos static de una clase no son métodos de los objetos de la clase, sino
que son métodos de la clase. Por esta razón la llamada a un método static se hace
con el nombre de la clase, el operador punto (.) y el nombre del método con sus
argumentos actuales.
nombreClase.nombreMétodo (lista de parámetros actuales);
Los métodos siempre deben declararse dentro de una clase. Aunque la sentencia en
el interior de un método puede ser una llamada a otro método, no se puede definir
un método dentro de otro método.
Acceso a métodos.
Cada método tiene un tipo asociado que se utiliza para controlar el acceso
al método. El tipo de acceso puede ser por omisión (no se especifica),
public, private o protected.
• Un método public (público) se puede llamar por cualquier código que
tenga acceso a la clase. El método main() se declara public, ya que se
llama por el sistema en tiempo de ejecución.
• Un método private (privado) solo se puede llamar desde otro método de la
clase en que se define el método privado.
• Un método protected (protegido) se puede llamar desde otro método de
la clase en que el método está definido y por cualquier otro método de las
clases que heredan de la clase en que está definido. También está
disponible en cualquier objeto de las clases pertenecientes al mismo
paquete que la clase en que está definido el método.
• Si no se especifica ningún tipo de acceso, se utiliza el acceso por omisión
o por defecto, que significa que el método es accesible a todas las clases
contenidas en el mismo paquete, pero no es accesible fuera de ese
paquete.
Paso de argumentos a métodos.
El paso de argumentos a los métodos en Java se hace por valor. Esto a
través de una copia que se hace del tipo de dato primitivo (int, float, …) o la
referencia al objeto de la clase o arreglo y se pasa al método.
Java proporciona un mecanismo de paso de parámetros para permitir dar a
los métodos valores iniciales. Si bien, no todos los métodos necesitan
parámetros, la mayoría sí, ya que esto permite la generalización de los
métodos. Esto significa que un método con parámetros puede operar sobre
una gran variedad de datos y/o ser utilizado en un buen número de
situaciones diferentes. En la declaración de un método, se pueden pasar
cero, uno o más parámetros, cuando se pasen más de un parámetro, estos
deberán separarse por comas y cada uno deberá tener definido su tipo.
El paso de parámetros por valor, también llamado paso por copia, significa
que cuando Java compila el método, el método recibe una copia de los
valores de los parámetros. Si se cambia el valor de un parámetro variable
local, el cambio solo afecta al método y no tiene efecto fuera del método. En
la técnica de paso de parámetros por valor, el método receptor no puede
modificar la variable del método (parámetro pasado).
Al declarar parámetros en un método, realmente estamos declarando
variables para ser utilizadas dentro de ese método. Ya dentro del cuerpo del
método, el parámetro o argumentos se utilizan como cualquier otra variable,
de modo que si se desea que el valor pasado a la variable no se cambie,
será necesario que en la declaración de parámetros, se anteceda con la
palabra reservada final el parámetro declarado. Esto hará que el valor de la
variable no se pueda modificar después que haya sido inicializada. Si no se
coloca la palabra reservada final el valor del parámetro se puede modificar
dentro del cuerpo del método. El tipo de parámetro es elegido por el
programador de acuerdo al contexto en que se ejecuta el método.
double cubo(final double x)
{
return (x * x * x);
}
Un método declarado final, permite que una clase se ejecute con más
eficiencia ya que el método no va a cambiar. Los métodos abstractos se
designan con la palabra reservada abstract y no tienen cuerpo. Se utilizan
en clases abstractas para permitir una cierta funcionalidad a las subclases
derivadas de estas clases abstractas. La implementación de los métodos
abstractos se deja a las subclases.
Ejemplo:
Si en una clase Figura se definen los métodos abstractos area() y
perímetro() que devuelven el área y perímetro del objeto Figura. Las
subclases Círculo y Rectángulo se pueden definir como subclases de
Figura. Ya que las áreas de un rectángulo y de un círculo se calculan
utilizando fórmulas matemáticas diferentes, así, las clases Rectángulo y
Círculo proporcionarán sus propias implementaciones de los métodos
area() y perímetro(). Esto es, los métodos area() y perímetro() se definen en
cada subclase (Rectángulo y Círculo) para calcular las propiedades
respectivas de cada figura.
a) Ámbito de clase.
Las variables de instancia declaradas en una clase tienen alcance en todos los
métodos de la clase. Pueden ser referenciadas por cualquier método en la clase
completa, estas variables se pueden considerar variables globales de la clase.
b) Ámbito de método.
Una variable que tiene ámbito de método se puede referenciar desde cualquier
parte del método. Las variables declaradas dentro del cuerpo del método son
locales al método. Las variables locales no se pueden utilizar fuera del ámbito en
que están definidas.
c) Ámbito de bloque.
Un bloque es un grupo de sentencias delimitadas por una llave de apertura ( { ) y
otra llave de cierre ( } ); dentro de un bloque se puede declarar cualquier tipo de
variable, el ámbito de dicha variable queda limitado al bloque y puede ser
referenciada en cualquier parte del bloque, de hecho, una variable declarada dentro
de un bloque solo puede ser llamada dentro del bloque, fuera de él no es
reconocida y el compilador genera un error de tipo: identificador no declarado.
Variables locales.
Las variables definidas dentro de un método o en un bloque son variables
locales al método o al bloque. Además de tener un ámbito restringido, solo
existen en memoria cuando el método está activo (esto es, mientras se
ejecutan las sentencias del método). Cuando el método no se está
ejecutando, sus variables locales no ocupan espacio en memoria ya que no
existen. Algunas reglas que siguen las variables locales son:
No se puede cambiar el valor de una variable externa al método en el
interior de un método.
Los nombres de las variables locales no son únicos. Dos o más métodos
pueden definir variables con el mismo nombre, como ocurre con las
variables de control i y j que se utilizan como contadores. Cada variable es
distinta y pertenece a su método específico.
Las variables locales de los métodos no existen en memoria hasta que se
ejecute el método. Por esta razón, múltiples métodos pueden compartir la
misma memoria para sus variables locales, aunque no al mismo tiempo.
Las variables que se declaran dentro de un método se dice que son
automáticas, esto significa que se les asigna espacio de memoria
automáticamente a la entrada del método y se les libera el espacio tan
pronto se sale de dicho método.
Recursividad.
La recursividad es una técnica de
programación en la cual un método se
llama a sí mismo directa o
class Factorial
indirectamente desde el mismo cuerpo {
del método. Es importante que un
proceso recursivo tenga una condición Factorial() {
de terminación, ya que de lo contrario }
continuará indefinidamente ciclando la
máquina. El algoritmo típico que sirve long calcula(int a) {
para implementar un método recursivo if ( a > 1 )
es el cálculo del factorial de un número. return (a * calcula(a - 1));
return (1);
Ejemplo:
}
Hacer un programa que calcule el
factorial de un número. } /* fin de la clase */
Donde N! = N * (N - 1)!
N! = N * (N – 1) * (N – 2) * … * 3 * 2 * 1
CLASES.
Ejemplo:
Proyectil2 calculaP;
calculaP = new Proyectil2();
La siguiente sentencia combina las dos etapas descritas anteriormente y es
la más comúnmente utilizada:
Ejemplo:
Proyectil2 calculaP = new Proyectil2();
Ejemplo:
Proyectil2 calculaP = new Proyectil2(a1,v01); // Se crea el objeto calculaP
r1 = calculaP.distancia(); // Llama al método distancia()
Acceso a miembros de la clase: Encapsulamiento.
Uno de los principios fundamentales de la programación orientada a objetos
es el ocultamiento de información, lo que significa que a determinados
datos del interior de una clase no se les puede acceder por métodos
externos a la clase. El principal mecanismo para ocultar datos es ponerlos
en una clase y hacerlos privados. A los datos o métodos privados sólo se
les puede acceder desde dentro de una clase. Por el contrario, los datos o
métodos públicos son accesibles desde el exterior de la clase. Esto significa
que los datos y métodos públicos forman la interfaz externa del objeto,
mientras que los elementos privados son los aspectos internos del objeto
que no necesitan ser accesibles para usar el objeto.
Privado
No son accesibles desde el exterior
Datos o Métodos
de la clase (acceso denegado)
Público
Son accesibles desde el exterior de
Datos o Métodos
la clase
Se utilizan tres diferentes especificadotes de acceso para controlar el
acceso a los miembros de la clase, estos son: public, private y protected.
Cada miembro de la clase está precedido del especificador de acceso que
le corresponde. Se utiliza el siguiente formato general en definiciones de la
clase, situando primero las variables de instancia, seguidas por los
métodos.
class NombreClase
{
private declaración miembro privado; // miembros privados
protected declaración miembro protegido; // miembros protegidos
public declaración miembro público; // miembros públicos
}
La tabla muestra los accesos permitidos a los tipos de miembros definidos
en la clase:
Tipo de Miembro de la Miembro de una Miembro de clase Miembro de clase
miembro misma clase clase derivada del paquete de otro paquete
private X
en blanco X X
protected X X X
public X X X X
Métodos de una clase.
En Java, los métodos siempre son miembros de clases y nunca habrá
métodos o funciones fuera de las clases, incluyendo al método main(). Las
declaraciones de los métodos en Java son también definiciones, ya que se
incluye el cuerpo de cada método.
Los métodos miembro que pueden aparecer en la definición de una clase
se clasifican en función del tipo de operación que representan.
• Constructores, son métodos miembro a los que se llama cuando un
operador crea un objeto.
• Selectores, son los que devuelven los valores de los miembros dato.
• Modificadores o mutadores, permiten a un programa cliente cambiar los
contenidos de los miembros dato.
• Iteradotes, procesan colecciones de objetos, tales como arreglos o listas.
• Cálculo, representan un algoritmo o realiza una operación en la que
normalmente intervienen las variables instancia.
Los métodos de las clases siempre se definen dentro del cuerpo de la
definición de la clase. El código fuente conteniendo la definición de una
clase, con todos sus métodos y variables miembro, se almacena en
archivos de texto que tienen el mismo nombre de la clase y con extensión
.java. Normalmente, se coloca la implementación de cada clase en un
archivo independiente. Cada implementación de un método tiene la misma
estructura general, comienza con una línea de cabecera que contiene, entre
otras cosas, el nombre del método y su cuerpo o bloque de sentencias está
acotado por llaves de apertura y cierre. Las clases pueden originarse de
diferentes fuentes:
• Se pueden declarar e implementar en sus propias clases. Así, el código
fuente siempre estará disponible y se pueden organizar por paquetes.
• Se pueden utilizar clases que hayan sido escritas por otras personas o
incluso que se han comprado. En este caso, se puede disponer del código
fuente o solamente el bytecode de la implementación. Es necesario
disponer del paquete donde se encuentran.
• Se pueden utilizar clases de los diversos paquetes que acompañan al
entorno de desarrollo de Java.
En cualquier caso, se debe disponer de las versiones de texto de las
declaraciones de clase para que pueda utilizarlas el compilador.
Paquetes.
Las definiciones de clases normalmente se almacenen en sus propios
archivos de código fuente con la extensión .java que tienen el mismo
nombre de la clase. El compilador de Java javac, transforma el código
fuente en bytecode y lo almacena en un archivo con el mismo nombre y la
extensión .class.
a) Clases públicas.
La definición de una clase puede incluir el modificador public como prefijo
en la cabecera de la clase:
package NombrePaquete;
Esta definición crea una instancia del objeto Cono, invocando al constructor
de la clase y pasándole los parámetros con valores específicos para
inicializarlo, la referencia al objeto se asigna a miCono.
A un constructor que no tiene parámetros se le llama constructor por
defecto. Java crea automáticamente un constructor por defecto cuando no
existen otros constructores. Un constructor por defecto normalmente
inicializa los miembros dato asignándoles valores por defecto. A las
variables de tipo numérico las inicializa a cero, las variables de tipo boolean
a false y las referencias a null.
También se puede sobrecargar el constructor de la clase. Solo se
ejecuta un constructor, aunque se hayan definido varios constructores.
Ejemplo:
class Cono
{
double radio, altura;
// Constructores para el objeto Cono.
Cono() {
radio = 1;
altura = 1;
}
Cono(int r, int h) {
radio = r;
altura = h;
}
Cono(double r, double h) {
radio = r;
altura = h;
}
// Definiciones de otros métodos de la clase.
}
Aunque también pueden inicializarse las variables de instancia, es más
conveniente inicializar las variables de los constructores. Si se necesita
proteger el valor de alguna variable de instancia, entonces se inicializa y se
le antepone la clausula final para proteger su valor.
Un objeto se puede crear a partir de los datos de otro objeto. Se puede
inicializar el objeto asignándole otro objeto de su misma clase en el
momento de su creación, para esto debe intervenir un constructor. El
prototipo para este constructor tiene la forma:
Ejemplo:
Cono miCono = new Cono(2, 5);
Cono miCono2 = new Cono(miCono);
Destrucción de objetos.
Los objetos en Java siempre se crean llamando a un constructor de la
clase. Así, un objeto en Java siempre ha de estar referenciado por una
variable, en el momento en que un objeto deja de ser referenciado se activa
la rutina de recolección de memoria o basura, se puede decir que el objeto
es destruido y la memoria que ocupa puede ser reutilizada.
Cuando un objeto es destruido ocurren varias cosas: se llama al método
finalize y después, el recolector de basura se encarga de eliminar el objeto,
liberando los recursos que el objeto tenga adjudicados. Un objeto es
destruido automáticamente cuando se eliminan todas las referencias al
mismo, ya sea porque el flujo de ejecución salga fuera del ámbito donde
ella está declarada o porque explícitamente se le asigne el valor de null. El
proceso de recolección lo realiza el método System.gc (garbage
collection).
Un destructor es un método especial de una clase que se ejecuta antes de
que un objeto de esa clase sea eliminado físicamente de la memoria. Un
destructor se distingue fácilmente porque tiene el nombre predeterminado
finalize. Cuando en una clase no especificamos un destructor, el
compilador, el compilador proporciona uno a través de la clase Object cuya
sintaxis es la siguiente:
protected void finalize() throws Throwable { /* sin código */ }
El método finalize() es un método especial que se llama automáticamente
si ha sido definido en la clase, justo antes que la memoria del objeto
recolectado vaya a ser devuelta al sistema. El método tiene las siguientes
características:
• No devuelve ningún valor.
• No tiene argumentos.
• No puede sobrecargarse.
• Su definición es opcional.
Como ya vimos, la el método finalize se puede redefinir en una clase para
ser usado como destructor, posteriormente, puede ser llamado y aplicado
en un programa, antes del proceso de recolección de basura. A
continuación se muestra la definición del método y el código que podemos
aplicar para la recolección de basura:
class NombreClaseX
{
// atributos y métodos de la clase
• • •
protected void finalize() throws Throwable { /* sin código */ }
} // fin de la clase.
Un aspecto importante es que solo se llama al método finalize() justo antes
de que actúe el sistema de recolección de basura, y no, por ejemplo,
cuando un objeto está fuera de contexto. Esto significa que no se puede
saber exactamente cuando será, o incluso si será, ejecutado el método
finalize(). Por lo tanto, el programa debe incluir otros medios que permitan
liberar los recursos del sistema, etc., utilizados por el objeto, y no apoyarse
exclusivamente en el método finalize() para la operación normal del
programa.
La recolección de basura sólo se produce esporádicamente, si es
necesario, durante la ejecución del programa. No se producirá simplemente
por que haya uno o dos objetos que no se utilicen más. Los diferentes
intérpretes de Java tienen distintos procedimientos para la recolección de
basura, por lo que no debemos preocuparnos por ello mientras se escribe
el programa.
Clases compuestas.
Una clase compuesta es aquella que contiene miembros dato que son
asimismo referencias a objetos de clases. Estas pueden estar definidas en
el paquete actual o en otro paquete. Estas referencias se inicializan por
defecto a null.
Referencia this.
Para que un método conozca la identidad del objeto particular para el que
ha sido invocado, Java proporciona una referencia al objeto denominado
this. this es una referencia al objeto que envía un mensaje, o simplemente
una referencia al objeto que llama a un método (y que no debe ser static).
Así, la referencia this al objeto es constante y no se puede modificar,
cualquier intento de modificación será erróneo. Internamente está definida
de la siguiente manera:
final NombreClase this;
Básicamente, this nos sirve para seleccionar explícitamente un miembro de
una clase con el fin de dar más claridad o de evitar colisión de
identificadores (variables de instancia y parámetros o variables locales con
el mismo nombre).
En el ejemplo se evita una colisión entre los argumentos del método
constructor y las variables de instancia.
class Cono
{
double radio, altura;
}
Variables, métodos y clases finales.
Las variables finales (definidas final), también son denominadas constantes
porque nunca cambian su valor.
final double G = 9.81;
También pueden declararse static para hacer que la constante sea solo de
la clase y no del objeto. Así, declarar una referencia final a un objeto,
supone que esa referencia sólo pueda utilizarse para referenciar ese objeto;
cualquier intento de modificar dicha referencia para que señale a otro objeto
será detectado durante la compilación y marcará error.
Un método podrá ser cambiado por una subclase si esta lo redefine, para
poder hacerlo, el método no deberá ser declarado final. Declarar un método
final supone que la clase se ejecute con más eficiencia porque el
compilador puede colocar el código de bytes del método directamente en el
lugar del programa donde se llame a dicho método, ya que se garantiza que
el método no va a cambiar.
Cuando una clase se declara final estamos impidiendo que de esa clase se
puedan derivar subclases. Además, todos sus métodos se convierten
automáticamente en final. Sin embargo, al declarar una clase final, se
sacrifica una de las características más potentes de la Programación
Orientada a Objetos, la reutilización del código.
Miembros static de una clase.
Cada objeto o instancia de clase tiene su propia copia de las variables de
instancia de la clase. Cuando interese que haya miembros que no estén
ligados a los objetos, sino a la clase, y por lo tanto comunes a todos los
objetos, éstos se declaran static. Así, un atributo static no es un atributo
específico de un objeto, sino más bien es un atributo de la clase, esto
significa que es un atributo del que solo hay una copia que comparten
todos los objetos de la clase. Por esta razón, un atributo static existe y
puede ser utilizado aunque no exista ningún objeto de la clase.
a) Variables de instancia static.
Las variables de clase static son compartidas por todos los objetos de la
clase, lo que significa que básicamente, son variables globales. Se declaran
igual que cualquier otra variable, solo se añade la palabra reservada static.
Así, las variables miembro static no forman parte de los objetos de la clase,
sino de la misma clase. Esto significa que si un objeto modifica el valor de
una variable de instancia calificada static, los demás objetos de la clase se
verán afectados por dicha modificación. Dentro de la clase se accede a
ellas de la manera habitual, simplemente con su nombre. Desde fuera de la
clase se accede a las variables static (si la visibilidad lo permite <public>),
con el nombre de la clase, el operador punto (.) y el nombre de la variable.
NombreClase.NombreVariable
class Cubo
{
static double lado;
• • •
}
i) Método equals()
Compara el objeto que hace la llamada, con el objeto que pasa como
argumento, devuelve trae si son iguales:
ii) System.out.
Este objeto queda definido: static final PrintStream out. Corresponde
normalmente a la salida por pantalla. Se hacen llamadas a dos métodos
para salida de datos por pantalla, los cuales previamente son convertidos
en cadenas de caracteres. El segundo se diferencia del primero en que una
vez mandada la cadena a la pantalla, el cursor salta a la línea siguiente:
System.out.print()
System.out.println()
iii) exit().
El método exit() termina la ejecución de una aplicación, esta declarado
como: static void exit (int status). El argumento status se acostumbra
que se cero si la terminación es sin errores, y un valor distinto de cero para
indicar un código de error.
iv) gc().
El método gc() (garbage collector) está declarado: static void gc(). Una
llamada a este método (System.gc()) hace que se active la liberación de
objetos que no estén referenciados por ninguna variable.
c) Clase Math.
La clase Math contiene constantes matemáticas y funciones matemáticas,
no se instancian objetos de esta clase. En esta clase se encuentran
agrupadas constantes y métodos (funciones matemáticas). Estas
constantes y métodos están declaradas con el modificador static y se hace
referencia a ellos mediante su nombre, anteponiendo Math.
Las dos constantes más utilizadas son Math.E y Math.PI, ambas son de
tipo double. Math.E, representa el número e que es la base de los
logaritmos naturales, su valor es: 2.718281828459045. Math.PI, es el
número pi cuyo valor es: 3.141592653589793.
Método Descripción
static double E Valor del número e (base del logaritmo neperiano o
natural). 2.718281828459045
double PI Valor del número π. 3.141592653589793
tipo abs (tipo a) Valor absoluto de a. El tipo igual en todos los casos,
puede ser int, long, float o double.
double ceil (double a) Valor double sin decimales más pequeño que es mayor
o igual que a (redondeo hacia arriba).
double floor (double a) Valor double sin decimales más grande que es menor o
igual que a (redondeo hacia abajo).
tipo max (tipo a, tipo b) Valor mayor de a y b. El tipo igual en todos los casos,
puede ser int, long, float o double.
tipo min (tipo a, tipo b) Valor menor de a y b. El tipo igual en todos los casos,
puede ser int, long, float o double.
double random () Valor aleatorio mayor o igual que 0.0 y menor que 1.0
double rint (double a) Valor double sin decimales más cercano a a (redondeo
de a).
long round (float a) Valor long más cercano a a.
int round (float a) Valor int más cercano a a.
double sqrt (double a) Raíz cuadrada de a (a no puede ser negativo).
Método Descripción
double exp (double a) Valor de ea.
double log (double a) Logaritmo neperiano (natural) de a.
double pow (double a, double b) Valor de ab.
double IEEEremainder (double f1, Resto de una división entre números reales: f1/f2,
double f2) siendo el resultado, el valor entero más cercano al valor
real de f1/f2; por lo tanto el resto puede ser positivo o
negativo.
double acos (double a) Devuelve el ángulo (de 0.0 a π) cuyo coseno viene dado
por a.
double asin (double a) Devuelve el ángulo (de – π/2 a π/2) cuyo seno viene
dado por a.
double atan (double a) Devuelve el ángulo (de – π/2 a π/2) cuya tangente viene
dada por a.
double atan2 (double a, double b) Devuelve el ángulo cuya tangente es a/b.
Clase B
UNIVERSIDAD AUTONOMA DE SINALOA
FACULTAD DE INFORMÁTICA DE MAZATLAN
PROGRAMACIÓN I
Herencia y Polimorfismo
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
HERENCIA Y POLIMORFISMO.
Triángulo
Herencia pública.
En una clase existen secciones públicas, privadas, protegidas y con
visibilidad por defecto. Los elementos públicos son accesibles a todos los
métodos de cualquier clase; los elementos privados son accesibles solo a
los miembros de la clase en que están definidos, los elementos protegidos
pueden ser accedidos por clases del mismo paquete y subclases del mismo
o de otro debido a la propiedad de la herencia; los elementos con la
visibilidad por defecto son accesibles desde cualquier clase del mismo
paquete, pero no son visibles en clases derivadas de otros paquetes.
Una clase derivada no puede acceder a variables y métodos privados de su
clase base. Una clase base utiliza elementos protegidos para de esa
manera ocultar los detalles de la clase respecto a clases no derivadas de
otros paquetes. Los elementos protegidos son accesibles a los miembros
de todas las clases derivadas. Una subclase tiene acceso a los elementos
públicos y protegidos de su clase base. Los elementos públicos se heredan
como elementos públicos; los elementos protegidos permanecen
protegidos. Así, en Java, la herencia siempre es pública y los miembros de
la subclase, heredados de la clase base, tienen la misma protección que en
la superclase o clase base.
Acceso a variables y métodos según el tipo de herencia
Tipo de Accesible a Accesible a Accesible a clase
elemento clase de clase derivada de otro
paquete derivada paquete
public si si si
protected si si si
private no no no
por defecto si si no
Las clases para ser visibles desde otro paquete se declaran con el
modificador public, en caso contrario la clase está restringida al paquete
donde se declara.
super.miembro
void muestra() {
System.out.println("a en la superclase: "+super.a);
System.out.println("a en la sublcase: "+a);
}
} /* fin de la clase */
Jerarquía de clases.
Una subclase puede ser una superclase de otra clase y así sucesivamente.
El conjunto de clases así definido da lugar a una jerarquía de clases.
Cuando cada subclase lo es de una solo superclase, como ocurre en Java,
la estructura jerárquica recibe el nombre de árbol de clases. La raíz del
árbol es la clase que representa el tipo más general, y las clases terminales
en el árbol (nodos hoja) representan los tipos más especializados. Sean,
por ejemplo, las clases A, B, C y D, donde C y D pueden ser unas
subclases de B, que a su vez es una subclase de A. Cuando se produce
esta situación, cada subclase hereda todos los atributos encontrados en
todas sus superclases. En este caso, C y D heredan todas las
características de B y A.
Clase A
Clase B
Clase C Clase D
Sobreescritura de métodos.
Un problema que se plantea cuando se manejan clases derivadas es la
dominación o prioridad, que se produce cuando existen métodos en clases
derivadas con el mismo nombre que otros métodos de las clases base. Así,
cuando en una jerarquía de clases, un método de una subclase tiene el
mismo nombre y tipo que un método de su superclase, entonces se dice
que el método de la subclase sobrescribe al método de la superclase.
Cuando se llama a un método sobrescrito desde una subclase, esta
llamada se refiere a la versión de ese método definida en la subclase.
Utilizamos nuevamente las clases Resta y Resta2, y definimos el método
operación(). Cuando se invoca a operación() en un objeto del tipo Resta2,
se utiliza la versión de operación() definida en Resta2; es decir, la versión
de operación() dentro de Resta2 domina sobre la versión declarada en
Resta.
Se puede acceder a la versión de la superclase de un método dominado
utilizando el método super en el método sobrescrito de la subclase.
También podemos hacerlo accediendo directamente al método definido en
la superclase, como muestra el programa. La sobreescritura de métodos
aparece únicamente cuando los nombres y tipos de los dos métodos son
iguales. Si no lo son, entonces los dos métodos están simplemente
sobrecargados.
class Resta
{
double a, b;
Resta (double x, double y) {
a = x;
b = y; }
void operacion () {
double c = 0.0;
c = a - b;
System.out.println("La resta de: "+a+" - "+b+" = "+c); }
} /* fin de la clase */
} // Fin de la clase.
} // Fin de la clase.
Utilización de la palabra clave final con la herencia.
La palabra clave final tiene tres aplicaciones. La primera, como ya se vio,
anteponiéndola en la definición de una variable, lo que crea el equivalente de
una constante con nombre. La segunda aplicación de final es para evitar que
un método sea sobrescrito, así, los métodos que se declaran como final no
pueden ser sobrescritos. Si se intenta la sobreescritura, el compilador
marcará error.
class EjemploFinal
{
final void mensaje() {
System.out.println(“Este es un método final y no puede ser sobrescrito”);
}
} // fin de la clase.
Los métodos declarados como final pueden proporcionar en ocasiones una
mejora del rendimiento, ya que el compilador puede realizar llamadas en
línea a dichos métodos porque sabe “sabe” que no pueden ser sobrescritos
por una subclase. Comúnmente, cuando se llama a una pequeña función
final, el compilador Java puede copiar el código binario de la subrutina
directamente en línea con el código del compilado del método que lo llama,
eliminando la sobrecarga asociada a la llamada del método. Esta es una
opción de la que disponen solamente los métodos declarados como final.
La tercera aplicación de final es para evitar que una clase sea heredada.
Para ello, basta con que al nombre de la clase se le anteponga la palabra
clave final. Al declarar una clase como final se declaran también todos sus
métodos como final. Por lo tanto, no es válido declarar una clase
simultáneamente como abstract y final, ya que una clase abstracta está
incompleta por definición y se basa en sus subclases para proporcionar sus
implementaciones completas.
La clase que implementa una interfaz tiene que especificar el código (la
implementación) de cada uno de los métodos de la interfaz. De no hacerlo,
la clase se convierte en clase abstracta y entonces debe declararse
abstract, lo que es una forma de obligar a que cada método de la interfaz
se implemente.
Java no permite la herencia múltiple, esto es, no permite que una clase
derive de dos o más clases. Sin embargo, una clase sí puede implementar
más de una interfaz y sí puede tener el comportamiento común de varias
interfaces. Lo que se hace, es escribir a continuación de la palabra
reservada implements las interfaces separadas por comas. La clase tiene
que implementar los métodos de todas las interfaces.
interface SuperClase1 { … }
interface Clase1 extends SuperClase1 { … }
interface Clase2 extends SuperClase1 { … }
• • •
interface ClaseDerivada extends Clase1, Clase2 { … }
Debe tenerse en cuenta que una clase que implementa la interfaz
ClaseDerivada tiene que definir los métodos propios y los derivados de sus
interfaces antecedentes. Debido a que las interfaces no son clases, solo
especifican un comportamiento (métodos) que va a tener la clase que lo
implementa. Por esta razón, una clase puede heredar de su clase base y a
la vez implementar una interfaz. En este caso, se ha de especificar primero
la clase de la que hereda (extends) y a continuación la interfaz que
implementa (implements).
ClaseB
ClaseC ClaseD
MANEJO DE EXCEPCIONES.
try {
••• // Bloque de código que controla los errores.
}
catch ( Tipo_de_excepción_1 e ) {
••• // Código de tratamiento de la excepción 1.
}
catch ( Tipo_de_excepción_2 e ) {
••• // Código de tratamiento para otra excepción 2.
}
// …
finally {
// Bloque de código que se debe ejecutar antes de que el bloque try termine.
}
// …
finally {
// Sentencias.
// Desbloqueo de archivos.
// Liberación de recursos.
}
PROGRAMACIÓN I
Arreglos
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
ARREGLOS.
a) Arreglos Unidimensionales.
b) Arreglos Multidimencionales.
a) Arreglos Unidimensionales.
Como su nombre lo indica, son arreglos de una sola dimensión. También se
conocen con el nombre de vectores o listas. La forma general de
declaración de un arreglo unidimensional es cualquiera de las dos
siguientes:
tipo[ ] nombre;
tipo nombre[ ];
Donde tipo indica el tipo de los elementos del arreglo, los cuales pueden
ser de cualquier tipo primitivo o referenciado; y nombre es un identificador
que nombra al arreglo. Los corchetes modifican la definición normal del
identificador para que sea interpretado por compilador como un arreglo.
Colocando los corchetes a continuación del tipo de datos, indica que todos
los identificadores son arreglos de ese tipo.
Colocando los corchetes a continuación del nombre del arreglo, indica que
solo el identificador que tiene el nombre es un arreglo.
Java no permite en la declaración de una variable de arreglo definir su
dimensión o número de elementos, ya que en este caso el compilador
producirá un error.
Ejemplo:
int[ ] a;
float x[ ];
Después de haber declarado un arreglo, el siguiente paso es crearlo o
construirlo. Crear un arreglo significa reservar la cantidad de memoria
necesaria para guardar todos sus elementos y asignar al nombre del arreglo
una referencia a ese bloque. Esto se expresa de la siguiente manera:
nombre = new tipo[ tamaño ];
Donde nombre es el nombre del arreglo declarado; tipo es el tipo de los
elementos del arreglo; y tamaño es el tamaño o dimensión del arreglo, y
será una expresión entera positiva menor o igual que la precisión de un int,
especificando el número máximo de elementos que puede tener el arreglo.
El hecho de utilizar el operador new significa que Java implementa las
matrices como objetos, por lo tanto son tratadas como cualquier otro objeto.
a = new int[10];
x = new float[50];
Normalmente, se declaran y crean los arreglos en una misma línea. Esto se
hace de la siguiente manera:
tipo[ ] nombre = new tipo[ tamaño ];
tipo nombre[ ] = new tipo[ tamaño ];
Ejemplo:
int[ ] a = new int[10];
float x[ ] = new float[50];
Cuando se crea un arreglo, el tamaño del mismo también puede ser
especificado durante la ejecución a través de una variable a la que se
asignará como valor el número de elementos requeridos, el siguiente
fragmento de código ejemplifica esta caso, creando un arreglo con el
número de elementos especificados por n.
int n;
•••
System.out.print("Cuantos elementos tiene el vector: ");
n = LeerDato.numInt();
int arreglo[ ] = new int [n];
double[ ] x = {5.2, 8.4, 1.5, 2.2, 10.1, 3.6, 4.8, 7.7, 6.4, 9.1};
La sintaxis completa para definir una matriz utilizando el operador new es:
tipo_dato[ ][ ] nombre_arreglo = new tipo[renglón][columna];
tipo_dato nombre_arreglo[ ][ ] = new tipo[renglón][columna];
int matriz1 [ ] [ ] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
Esta inicialización hace que matriz1[0] [0] tenga el valor de 1, matriz1[0] [1]
tenga el valor de 2, matriz1[0] [2] tenga el valor de 3, y así sucesivamente.
Debido a que Java trata los arreglos de dos o más dimensiones como
arreglos de arreglos, se pueden crear arreglos de dos dimensiones no
cuadradas, incluso en varias sentencias.
System.out.println(tabla.length); // escribe 3
System.out.println(tabla[0].length); // escribe 3
System.out.println(tabla[1].length); // escribe 2
System.out.println(tabla[2].length); // escribe 4
donde a representa al arreglo, clave es el valor que se desea buscar y que debe ser
del mismo tipo que los elementos del arreglo, y tipo que es cualquier tipo de datos de
los siguientes: byte, char, short, int, long, float, double y Object.
El valor devuelto es un entero correspondiente al índice del elemento que coincide
con el valor buscado. Si el valor buscado no se encuentra, entonces el valor devuelto
es: -(punto de inserción) – 1. El valor de punto de inserción es el índice del elemento
de la matríz donde debería encontrarse el valor buscado. La expresión “-(punto de
inserción) – 1” garantiza que el índice devuelto será mayor o igual que cero solo si el
valor buscado es encontrado. Ejemplo:
int i;
int b[ ] = {9,12,15,34,45,45,46,64,96,107,456,784};
i = Arrays.binarySearch(b, 15); // i = 2
i = Arrays.binarySearch(b, 35); // i = -5
i = Arrays.binarySearch(b, 64); // i = 7
i = Arrays.binarySearch(b, 750); // i = -12
b) Método equals.
Este método permite verificar si dos arreglos son iguales. Dos arreglos se
consideran iguales cuando ambos tienen el mismo número de elementos y
en el mismo orden. Asimismo, dos arreglos también son considerados
iguales si sus referencias valen null. La sintaxis para este método
expresada en forma genérica es la siguiente:
boolean equals(tipo[ ] a1, tipo[ ] a2)
donde a1 y a2 son arreglos del mismo tipo y tipo que es cualquier tipo de
datos de los siguientes: byte, char, short, int, long, float, double y Object.
El valor devuelto será true si ambos arreglos son iguales y false en caso
contrario. Ejemplo:
int b[ ] = {9,12,15,34,45,45,46,64,96,107,456,784};
int c[ ] = {9,12,15,34,45,45,46,64,96,107,456,784};
if (Arrays.equals(b, c))
System.out.println("Los arreglos son iguales");
else
System.out.println("Los arreglos son diferentes");
c) Método fill.
Este método permite asignar un valor a todos los elementos de un arreglo,
o bien a cada elemento de un rango especificado. La sintaxis expresada de
forma genérica para utilizar este método es la siguiente:
void fill(tipo[ ] a, tipo valor)
void fill(tipo[ ] a, int desdeind, int hastaind, tipo valor)
PROGRAMACIÓN I
Cadenas
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
CADENAS.
El objeto cadena que se pasa como argumento a este constructor puede ser
un literal, todo literal es un objeto cadena para Java.
String cad3 = new String(“Constante cadena”);
byte arreglo3[ ] = { ‘I’, ’n’, ’f’, ’o’, ‘r’, ’m’, ’a’, ’t’, ’i’, ’c’, ’a’};
String cad8 = new String(arreglo3); // Guarda: Informatica
7. Constructor de cadena a partir de un rango de bytes.
Al igual que hay un constructor de cadena a partir de un rango de
caracteres, también hay un constructor a partir de un rango de bytes. En
este caso, el segundo argumento es el valor del byte más significativo que
usa el constructor para formar caracteres en unión de los bytes del arreglo.
byte arregloBytes[ ];
String cadena = new String(byte arregloBytes[ ], int posiciónInicial,
int numElementos);
byte arreglo4[ ] = { ‘I’, ’n’, ’f’, ’o’, ‘r’, ’m’, ’a’, ’t’, ’i’, ’c’, ’a’};
String cad9 = new String(arreglo4,5,4); // Guarda: mati
Los contenidos del arreglo se copian cada vez que se crea un objeto String
a partir de un arreglo. Si se modifican los contenidos del arreglo después de
creada la cadena, el objeto String no se modifica.
Lectura y escritura de cadenas.
La entrada de datos suele ser mediante una interacción con el usuario que
ejecuta el programa. La clase BufferedReader tiene diversos métodos
para lectura de datos. Cuando se ejecuta un programa, Java incorpora el
objeto System.in asociado con el flujo (stream) de entrada byte a byte.
Además la clase InputStreamReader convierte el flujo de bytes en una
cadena de caracteres. Esa es la razón por la cual se crea un objeto para la
lectura desde el teclado, que en este ejemplo llamamos entrada, y que se
muestra a continuación:
BufferedReader entrada = new BufferedReader (
new InputStreamReader ( System.in ) );
El objeto out está asociado con la salida estándar, los métodos print() y
println() se utilizan normalmente para salida de cadenas de caracteres. El
objeto System.out (que es una instancia de la clase PrintStream), además
de tener los métodos de salida print() y println() para cadenas caracteres,
sino que también tiene los métodos sobrecargados para dar salida a
caracteres individuales y datos de otros tipos primitivos (int, long, double,
etc.).
void print(String); void println(String);
void print(char); void println(char);
void print(char [ ]); void println(char [ ]);
void print(int); void println(int);
void print(long); void println(long);
void print(double); void println(double);
Ejemplo de lectura de una cadena con la clase BufferedReader:
BufferedReader leer = new BufferedReader (
new InputStreamReader ( System.in ) );
String cadena = “ “;
...
cadena = leer.readLine();
char arreglo5[ ] = { ‘I’, ’n’, ’f’, ’o’, ‘r’, ’m’, ’a’, ’t’, ’i’, ’c’, ’a’};
String cad10 = new String(arreglo);
System.out.println(cad10.length()); // Imprime: 11
También se pueden concatenar cadenas con otro tipo de datos. Sin embargo, hay
que tener cuidado al mezclar otros tipos de datos de operaciones con expresiones
de concatenación de cadenas, ya que se pueden obtener resultados inesperados.
int temp = 30;
String cadena = “Temperatura: ” + temp + ” grados.”;
System.out.println(cadena); // Imprime: Temperatura: 30 grados.
1. String toString()
Este método devuelve el propio objeto String que recibe el mensaje
toString.
String cad1 = “Informática”, cad2;
cad2 = cad1.toString(); // equivale a cad2 = cad1
5. String toLowerCase()
Este método convierte a minúsculas las letras mayúsculas del objeto String
que recibe el mensaje toLowerCase. El resultado es un nuevo objeto
String en minúsculas.
String cad1, cad2 = “INFORMATICA”;
cad1 = cad2.toLowerCase(); // cad1: informatica
6. String toUpperCase()
Convierte las letras minúsculas del objeto String que recibe el mensaje a
mayúsculas, creando un nuevo objeto String.
String cad1, cad2 = “Informatica”;
cad1 = cad2.toUpperCase(); // cad1: INFORMATICA
7. String trim()
Este método devuelve un objeto String resultado de eliminar los espacios
en blanco que pudiera haber al principio y al final del objeto String que
recibe el mensaje trim.
String cad1 = “ Informatica ”, cad2 = “ “;
cad2 = cad1.trim(); // cad2: “Informatica” (sin espacios).
1. StringBuffer([argumento])
Este método permite crear un objeto de la clase StringBuffer. Así, cuando
StringBuffer se invoca sin argumentos construye un objeto vacío con una
capacidad inicial para 16 caracteres; cuando se invoca con un argumento
entero, construye un objeto vacío con la capacidad especificada; y cuando
se invoca con un String como argumento construye un objeto con la
secuencia de caracteres proporcionada por el argumento y una capacidad
igual al número de caracteres almacenados más 16.
StringBuffer cadena1 = new StringBuffer();
StringBuffer cadena2 = new StringBuffer(100);
StringBuffer cadena3 = new StringBuffer(“Informatica”);
2. int length()
Este método devuelve la longitud o número de caracteres Unicode (tipo
char) del objeto StringBuffer que recibe el mensaje length. Esta longitud
puede ser modificada por el método setLength cuando sea necesario.
StringBuffer cadena = new StringBuffer(“Informatica”);
System.out.println(cadena.length()); // Imprime: 11
3. int capacity()
Devuelve la capacidad en caracteres Unicode (tipo char) del objeto
StringBuffer que recibe el mensaje capacity.
StringBuffer cadena = new StringBuffer(“Informatica”);
System.out.println(cadena.capacity()); // Imprime: 27
4. StringBuffer append(tipo x)
Este método permite añadir la cadena de caracteres resultante de convertir
el argumento x en un objeto String, al final del objeto StringBuffer que
recibe el mensaje append. El tipo del argumento x puede ser boolean,
char, char[ ], int, long, float, double y Object. La longitud del objeto
StringBuffer se incrementa en la longitud correspondiente al String
añadido.
StringBuffer cadena = new StringBuffer(“Informatica”);
cadena.append(2006); // cadena = Informatica2006
Las cadenas de caracteres, al igual que los tipos de datos primitivos y que
otros objetos, pueden agruparse para formar arreglos de caracteres. En
estos arreglos, cada fila se corresponde con una cadena de caracteres. Así,
una fila puede ser un objeto String o un objeto StringBuffer.
String[ ] nombre = new String[nFilas];
Los algoritmos de búsqueda lineal, aplicando los ciclos for (simple), while
y do-while (mejorados) y búsqueda binaria, se presentan a continuación:
Búsqueda lineal del elemento b, usando For.
public int busquedaLinealFor (String A[ ], String b)
{
// Inicializamos posicion = -1 porque los arreglos comienzan en la posición 0
int i = 0, posicion = -1;
for (i=0;i<A.length ;i++)
if (A[i].compareTo(b) == 0) posicion = i;
return (posicion);
}
Búsqueda lineal del elemento b, usando While.
public int busquedaLinealWhile (String A[ ], String b)
{
int i = 0, posicion = -1;
boolean encontrado = false;
while ((i < A.length ) && (encontrado == false)){
if (A[i].compareTo(b) == 0){
posicion = i;
encontrado = true;
}
i++;
}
return (posicion);
}
Búsqueda lineal del elemento b, usando Do-While.
public int busquedaLinealDo (String A[ ], String b)
{
int i = 0, posicion = -1;
boolean encontrado = false;
do {
if (A[i].compareTo(b) == 0){
posicion = i;
encontrado = true;
}
i++;
} while ((i < A.length ) && (encontrado == false));
return (posicion);
}
Búsqueda binaria del elemento b.
public int busquedaBinaria (String A[ ], String b)
{
int primero = 0, ultimo = A.length , puntomedio = 0, posicion = -1;
boolean encontrado = false;
while ((encontrado == false) && (primero <= ultimo)){
puntomedio = (primero + ultimo) / 2;
if (A[puntomedio].compareTo(b) == 0)
encontrado = true;
else
if (A[puntomedio].compareTo(b) > 0)
ultimo = puntomedio - 1;
else
primero = puntomedio + 1;
}
if (encontrado == true)
posicion = puntomedio;
else
posicion = -1;
return (posicion);
}
UNIVERSIDAD AUTONOMA DE SINALOA
FACULTAD DE INFORMÁTICA DE MAZATLAN
PROGRAMACIÓN I
Archivos
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
ARCHIVOS.
Leer Escribir
Abrir un flujo desde un origen Abrir un flujo hacia un destino
Mientras haya información Mientras haya información
Leer información Escribir información
Cerrar el flujo Cerrar el flujo
Debido a que todas las clases relacionadas con flujos pertenecen al
paquete java.io de la biblioteca estándar de Java, un programa que utilice
flujos de Entrada/Salida (E/S), tendrá que importar este paquete:
import java.io.*;
Las clases del paquete java.io están divididas en dos grupos distintos. Uno
ha sido diseñado para trabajar con datos de tipo byte y el otro con datos de
tipo char.
Así mismo, la biblioteca de Java proporciona tres flujos estándar manejados
por la clase System del paquete java.lang. Estos flujos predefinidos son
automáticamente abiertos cuando se inicia un programa, y cerrados cuando
finaliza:
• System.in. Objeto entrada estándar del sistema, que normalmente es el
teclado. Se utiliza para leer datos introducidos por el usuario.
• System.out. Objeto salida estándar del sistema, que normalmente es la
pantalla. Se utiliza para mostrar los datos al usuario.
• System.err. Objeto para salida estándar de error del sistema, que
normalmente es el monitor. Se utiliza para mostrar mensajes de error al
usuario.
La apertura de un archivo supone establecer la conexión del programa con
el dispositivo que contiene al archivo; por el canal que comunica el archivo
con el programa van a fluir las secuencias de datos, de ahí el concepto de
flujo. Abrir un archivo supone crear un objeto y asociarlo con un flujo. Así,
un archivo en Java es un flujo externo, una secuencia de bytes
almacenados en un dispositivo externo (normalmente en un disco). Si el
archivo se abre para salida, es un flujo de archivo de salida. Si el archivo se
abre para entrada, es un flujo de archivo para entrada. Los programas leen
o escriben en el flujo, que puede estar conectado a un dispositivo o a otro.
El paquete java.io agrupa al conjunto de clases necesarias para el manejo
de entrada y salida; siempre que se vayan a procesar archivos, se tienen
que utilizar clases de este paquete, por lo que se debe de importar: import
java.io.*; para todas las clases.
Debido a que todo el proceso de entrada y salida en Java se hace a través
de flujos (streams). En los programas hay que crear objetos streams y en
muchas ocasiones hacer uso de los objetos in, out que se encuentran en la
clase System.
System.in para entrada por teclado.
System.out para salida por pantalla.
Los flujos de datos, de caracteres y de bytes se clasifican en flujos de
entrada (InputStream) y en flujos de salida (OutputStream). Las dos
clases relacionadas con flujos que se utilizan son InputStream y
OutputStream, derivadas directamente de la clase Object. Ambas son
clases abstractas que declaran métodos que deben redefinirse en sus
subclases. Además, InputStream es la superclase de todas las clases
definidas para flujos de entrada, y OutputStream es la superclase de todas
las clases de flujos de salida.
Método Descripción
close Cierra el flujo.
read Lee un único carácter, o bien un arreglo de caracteres.
unread Devuelve a la entrada un único carácter, o bien todo o parte de
un arreglo de caracteres.
ready Devuelve true si se puede leer del flujo porque hay caracteres
disponibles; de lo contrario devuelve false.
Los siguientes ejemplos utilizan la clase PushbackReader para leer un
carácter y para limpiar el flujo de caracteres. Añadiendo estos métodos a
la clase LeerDato podremos leer caracteres y limpiar el buffer de entrada
después de haber leído un carácter. Los métodos definen un miembro
flujoE de la clase PushbackReader que se relaciona con el flujo abierto
desde el origen de los caracteres. Como en este caso el origen real de los
datos va ser el teclado (dispositivo vinculado con System.in que
proporciona bytes), la clase InputStreamReader establece un puente
para pasar flujos de bytes a flujos de caracteres.
/* Método para leer un carácter */
public static char caracter()
{
PushbackReader flujoE = new PushbackReader(new InputStreamReader(System.in));
int caracter = 0;
try {
caracter = flujoE.read();
}
catch (IOException e) {
caracter = 0;
}
return (char)caracter;
}
Un programa que quiera leer datos del archivo datos.dat, leerá tales datos
del filtro dis, que a su vez está conectado al flujo fis abierto desde ese
archivo. Gráficamente podemos representarlo de la siguiente manera.
Método Descripción
readBoolean() Devuelve un valor de tipo boolean.
readByte() Devuelve un valor de tipo byte.
readChar() Devuelve un valor de tipo char.
readShort() Devuelve un valor de tipo short.
readInt() Devuelve un valor de tipo int.
readLong() Devuelve un valor de tipo long.
readFloat() Devuelve un valor de tipo float.
readDouble() Devuelve un valor de tipo double.
readUFT() Devuelve una cadena de caracteres en formato UTF-8;
los dos primeros bytes especifican el número de bytes
de datos que serán leídos a continuación.
El ejemplo muestra los métodos que permiten escribir y leer de un
archivo utilizando estas clases.
public static void crearArchivo(File archivo) throws IOException
{
DataOutputStream dos = null; // salida de datos hacia el archivo
char resp;
try {
// crear un flujo hacia un archivo para escribir datos de tipo primitivo usando un buffer
dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(archivo)));
// leer datos y escribirlos en el archivo
do {
leerDatos(); // Método creado previamente para leer los datos que se graban en el archivo
dos.writeUTF(nombre);
dos.writeUTF(apellidoPat);
dos.writeUTF(apellidoMat);
dos.writeUTF(email);
dos.writeInt(edad);
dos.writeChar(sexo);
System.out.println(" desea escribir otro registro? (s/n) ");
resp = leerCaracter(); // Método creado con PushbackReader para leer un carácter
limpiar(); // Método creado con PushbackReader para limpiar el buffer del teclado
} while (resp == 's');
}
finally {
if (dos != null) dos.close();
}
}
public static void leerArchivo(String nomArchivo) throws IOException
{
DataInputStream dis = null; // lectura de datos del archivo
File archivo = null;
try {
// crear un objeto File que identifique al archivo
archivo = new File(nomArchivo);
// verificar si el archivo existe
if (archivo.exists()) // si existe, abrir un flujo que permita leer datos del archivo
{
dis = new DataInputStream(new BufferedInputStream(new FileInputStream(archivo)));
// leer datos del archivo y asignarlos a las variables
do {
nombre = dis.readUTF();
apellidoPat = dis.readUTF();
apellidoMat = dis.readUTF();
email = dis.readUTF();
edad = dis.readInt();
sexo = dis.readChar();
mostrarDatos (); // Método creado previamente para mostrar los datos leídos del archivo
} while (true);
}
else
System.out.println("El archivo no existe");
}
finally {
if (dis != null) dis.close();
}
}
Clase PrintStream.
Esta clase deriva directamente de FilterOutputStream, por lo que tiene que
estar asociada a un flujo de bytes para salida. Los métodos de esta clase
están sobrecargados para poder escribir desde cadenas hasta cualquiera
de los datos primitivos. Define métodos para que después de escribir un
dato se añada la marca de fin de línea.
Esta clase tiene dos constructores, en el primero, se pasa como argumento
el objeto flujo de bytes al que se asocia. En el segundo, hay un segundo
argumento (opcional) de tipo boolean para que cada vez que se escriba la
marca de fin de línea se vacíe todo el flujo.
public PrintStream(OutputStream destino)
Crea un objeto asociado con cualquier objeto de salida pasado como
argumento.
public PrintStream(OutputStream destino, boolean flag)
Crea un objeto asociado con objeto de salida pasado como argumento y si
el segundo argumento es true se produce un vaciado automático al escribir
el fin de línea.
import java.io.*;
public class NombreClase implements Serializable
{
// Cuerpo de la clase
}
Como la interfaz Serializable está vacía, no hay que escribir ningún método
extra en la clase.
a) Escribir objetos en un archivo.
Un flujo de la clase ObjectOutputStream permite enviar datos de tipos
primitivos y objetos hacia un flujo OutputStream o derivado;
concretamente, cuando se trate de almacenarlos en un archivo,
utilizaremos un flujo FileOutputStream. Posteriormente, esos objetos
podrán ser reconstruidos a través de un flujo ObjectInputStream.
Para escribir un objeto en un flujo ObjectOutputStream se utiliza el
método writeObject. Los objetos pueden incluir cadenas (Strings) y
arreglos, y el almacenamiento de los mismos puede combinarse con datos
de tipos primitivos, ya que esta clase implementa la interfaz DataOutput.
Este método lanzará la excepción NotSerializableException si se intenta
escribir un objeto de una clase que no implementa la interfaz Serializable.
b) Leer objetos desde un archivo.
Un flujo de la clase ObjectInputStream permite recuperar datos de tipos
primitivos y objetos desde un flujo InputStream o derivado; concretamente,
cuando se trate de flujos de datos primitivos y objetos almacenados en un
archivo, se utiliza un flujo FileInputStream. La clase ObjectInputStream
implementa la interfaz DataInput para permitir leer también los tipos
primitivos.
Para leer un objeto desde un flujo ObjectInputStream se utiliza el método
readObject. Si se almacenaron objetos y datos de tipos primitivos, deben
ser recuperados en el mismo orden en que se guardaron.
c) Serialización y deserialización de objetos que referencían a otros
objetos.
Cuando en un archivo se escribe un objeto que hace referencia a otros
objetos, entonces todos los objetos accesibles desde el primer objeto deben
ser escritos en el mismo proceso para mantener así la relación existente
entre todos ellos. Este proceso es llevado a cabo automáticamente por el
método writeObject, que escribe el objeto especificado, recorriendo sus
referencias a otros objetos recursivamente, escribiendo así todos ellos.
Del mismo modo, si el objeto recuperado del flujo por el método readObject
hace referencia a otros objetos, readObject recorrerá sus referencias a
otros objetos recursivamente, para recuperarlos todos, manteniendo la
relación que existía entre ellos cuando fueron escritos. Debemos recordar
que para poder serializar un objeto, la clase debe implementar la interfaz
Serializable, al igual que las clases referenciadas por la primera.
El siguiente ejemplo muestra un programa que aplica la serialización y
deserialización de objetos.
import java.io.*;
public class ArchivoOb implements Serializable
{
//…
public static void crearArchivo(File archivo) throws IOException
{
ObjectOutputStream oos = null; // salida de datos hacia el archivo
char resp;
try {
// crea un flujo a un archivo que permita escribir datos de tipo primitivo usando un buffer
oos = new ObjectOutputStream(new FileOutputStream(archivo));
// leer datos y escribirlos en el archivo
leerDatos(); //Método creado previamente para leer los datos que se graban en el archivo
oos.writeObject(new ArchivoOb(nombre,apellidoPat,apellidoMat,email,edad,sexo));
oos.flush();
oos.close();
}
finally {
if (oos != null) oos.close();
}
}
public static void leerArchivo(String nomArchivo) throws IOException
{
ObjectInputStream ois = null; // lectura de datos del archivo
File archivo = null;
try {
// crear un objeto File que identifique al archivo
archivo = new File(nomArchivo);
ArchivoOb datArchivo;
// verificar si el archivo existe
if (archivo.exists())
{
// si existe, abrir un flujo que permita leer datos del archivo
ois = new ObjectInputStream(new FileInputStream(archivo));
// leer datos del archivo y asignarlos a las variables
datArchivo = (ArchivoOb) ois.readObject();
ArchivoOb.mostrarDatos();
ois.close();
}
else
System.out.println("El archivo no existe");
}
catch(EOFException e) {
System.out.println("Fin del archivo");
}
catch(ClassNotFoundException e) {
System.out.println("Error: "+e.getMessage());
}
}
Archivos secuénciales.
La forma en que esta organizado un archivo, define como se guardarán los
registros en el medio de almacenamiento, o también define la forma en que
se estructuran los datos en el archivo. En general se consideran tres
organizaciones fundamentales:
• Organización secuencial.
• Organización directa o aleatoria.
• Organización secuencial indexada.
Un archivo con organización secuencial es una sucesión de registros
almacenados consecutivamente en un medio de almacenamiento externo,
de tal modo que para acceder a un registro cualquiera, forzosamente debe
pasarse por los registros que le anteceden.
En un archivo secuencial los registros se añaden, esto es, un registro de
datos se almacena inmediatamente después del registro anterior. Las
operaciones básicas que se permiten en un archivo secuencial son: grabar
un registro, añadir un registro (al final del archivo) y consultar registros.
Java solo procesa los archivos como secuencias de bytes y no determina la
estructura del archivo. El programador es el que determina el tratamiento
del archivo, si va a ser secuencial o de acceso aleatorio. Primero se debe
especificar el concepto de registro según los datos que se van a almacenar,
para lo cual, Java contempla la estructura de registro. Los campos en que
se descompone cada registro, según como lo determine el programador, se
han de escribir uno a uno. Además, la operación de lectura del archivo
creado debe de hacerse de manera inversa, así, si por ejemplo el primer
campo es de tipo entero, al leer el método de lectura debe ser para un
entero. Una vez definidos los campos de cada registro se escribe la
aplicación en la que se crean los flujos inicializados con el nombre del
archivo y se piden los campos de cada registro para ser escritos por los
métodos el objeto flujo. Cuando se han terminado de escribir todos los
registros se cierra el flujo (close()).
La creación de un archivo secuencial se puede hacer con las clases:
FileOutputStream y DataOutputStream, además de la clase File para
definir el archivo. Un objeto DataOutputStream se inicializa con un previo
objeto de FileOutputStream que a su vez se ha inicializado con el objeto
File. Debe tenerse cuidado ya que los datos que tuviera un archivo externo
con el que se crea el objeto FileOutputStream se pierden, a menos que se
pase al constructor un segundo argumento con el valor true, para que en
ese caso se añadan al final los nuevos registros.
Así, la metodología para escribir datos en un archivo de acceso secuencial
es la siguiente:
• Definimos un flujo hacia el archivo en el que deseamos escribir datos.
• Leemos los datos del dispositivo de entrada o de otro archivo y los
escribimos en nuestro archivo. Este proceso se hace normalmente registro
a registro. Para lo cual utilizamos los métodos proporcionados por la
interfaz del flujo.
• Cerramos el flujo.
Del mismo modo, la metodología para leer datos de un archivo existente:
• Abrimos un flujo desde el archivo del cual deseamos leer los datos.
• Leemos los datos del archivo y los almacenamos en variables de nuestro
programa para trabajar con ellos. Este proceso se hace normalmente
registro a registro. Para lo cual utilizamos los métodos proporcionados por
la interfaz del flujo.
• Cerramos el flujo.
Los archivos de acceso secuencial también pueden actualizarse, añadiendo
nuevos registros (altas), modificando datos de registros existentes
(modificaciones) o borrando registros (bajas).
a) Añadir registros.
El proceso de dar de alta un determinado registro o tantos como se
requiera, puede hacerse al inicializar el flujo de la clase
FileOutputStream, pasando true como segundo argumento al constructor
(el primer argumento es el archivo). De esta forma, el nuevo registro que
se da de alta se añade al final del archivo. Así, para añadir registros en un
archivo cualquiera tenemos el siguiente ejemplo:
File archivo = new File(nombreArchivo);
dos = new DataOutputStream(new BufferedOutputStream(
new FileOutputStream(archivo, true)));
b) Eliminar registros.
Para dar de baja un registro del archivo secuencial se utiliza un archivo
auxiliar, también secuencial. Se lee el archivo original registro por registro y
cuando se observe un registro que se quiere eliminar, se decide si el
registro debe ser escrito en el archivo auxiliar, así, si el registro se va a
eliminar, se omite su escritura en el archivo auxiliar, pero si el registro no se
da de baja, entonces se escribe en el archivo auxiliar. Una vez que se
termina el proceso completo con todo el archivo, se tiene dos archivos, el
original y el auxiliar. El proceso de baja termina eliminando el archivo
original y cambiando el nombre del archivo auxiliar por el del original. Con la
llamada a los métodos de la clase File: delete() y renameTo(), para
eliminar el archivo original una vez procesado y cambiar de nombre el
archivo auxiliar, se termina el proceso de dar de baja.
c) Modificar registros.
Las actualizaciones de registros de un archivo secuencial se pueden hacer
siguiendo los mismos pasos que al eliminar un registro. Los registros del
archivo original se leen y se escriben en el archivo auxiliar hasta llegar al
registro que se va a modificar. Una vez que éste es leído, se cambian los
datos o campos deseados y se escribe en el archivo auxiliar. El archivo
original se continúa procesando hasta leer el último registro; se termina
borrando el archivo original y cambiando el nombre del auxiliar por el
nombre del original.
Archivos de acceso aleatorio.
Un archivo es de acceso aleatorio o directo cuando cualquier registro es
directamente accesible mediante un índice, que da la posición del registro
con respecto al origen del archivo. La principal característica del de los
archivos de acceso aleatorio, es la rapidez de acceso a un determinado
registro; conociendo el índice del registro se puede situar el puntero de
lectura/escritura del archivo, en la posición donde comienza el registro y a
partir de esa posición realizar la operación de lectura o escritura. Sin
embargo, el acceso a un registro cualquiera en el archivo secuencial,
significa leer todos los registros anteriores.
Las operaciones que se realizan con los archivos de acceso directo son las
usuales: creación, consulta, grabar un registro, borrar un registro y modificar
un registro.
Java solo procesa los archivos como secuencias de bytes y no determina la
estructura del archivo, ya que es el programador quien determina la forma
de acceso al archivo. Para el proceso de archivos aleatorios, es importante
establecer el tipo de datos de cada campo del registro lógico y el tamaño de
cada registro. En cuanto al tamaño, se establece tomando en cuanta la
máxima longitud de cada campo; particularmente, para los campos de tipo
String se debe prever el máximo número de caracteres, además, si se
escribe en formato UTP se añaden dos bytes más, en los cuales se guarda
la longitud de la cadena. Los campos de tipo primitivo tienen longitud fija:
char, dos bytes; int, cuatro bytes; double, ocho bytes; etc.
El paquete java.io contiene la clase RandomAccessFile que define los
métodos para facilitar el procesa,iento de archivos de acceso directo.
Además, un flujo de esta clase permite realizar tanto operaciones de lectura
como de escritura (L/E) sobre el archivo vinculado con el mismo. Esta clase
deriva directamente de Object, e implementa las interfaces DataInput y
DataOutput, al igual que las clases DataInputStream y
DataOutputStream, respectivamente. La clase tiene dos constructores con
dos argumentos, el primero es el archivo y el segundo una cadena con el
modo de abrir el flujo.
public RandomAccessFile(String nomArchivo, String modo) throws IOException
El objeto queda ligado al archivo que se pasa como cadena en el primer argumento. El
segundo argumento es el modo de apertura.
public RandomAccessFile(File archivo, String modo) throws IOException
El primer argumento es un objeto File que se creó con la ruta y nombre del archivo, el
segundo argumento es el modo de apertura.
En cuanto al modo de apertura, este puede ser de dos formas:
Modo Significado
“r” Modo de solo lectura. Sólo se permiten realizar operaciones de lectura. No se
puede modificar o escribir registros.
“rw” Modo lectura/escritura. Se pueden realizar operaciones de lectura (entrada) y de
escritura (salida) sobre el archivo.
Ambos constructores lanzan una excepción del tipo IOException si hay algún problema al
crear el flujo. Por ejemplo, si se abre para lectura y el archivo no existe. Por esa razón, es
común comprobar el atributo de existencia del archivo con el método exists() de la clase File
antes de empezar el proceso.
La clase RandomAccessFile implementa a través de las interfaces DataInput (entrada de
datos) y DataOutput (salida de datos) los métodos básicos de Entrada/Salida. Pero también
provee los métodos getFilePointer(), length(), setLength() y el método seek(), que permite
posicionar el puntero del archivo dentro de este.
En los archivos, cuando se hace mención del puntero del archivo se refiere a la posición (en
número de bytes) a partir de la que se va a realizar la siguiente operación de lectura o de
escritura. Así, el puntero del archivo es una especie de índice, el cual, una vez que se ha
llevado a cabo una operación de lectura o de escritura, queda situado justo después del último
byte leído o escrito.
Métodos de la clase DataOutput
Método Descripción
writeBoolean(boolean arg) Escribe un valor de tipo boolean.
import java.io.*;
class Archivos1 {
/* Programa principal */
import java.io.*;
class Archivos2 {
public static void main(String args[]) {
System.out.println("Programa que escribe y lee un arreglo de bytes.");
System.out.println();
Archivos1.escribeArchivo();
Archivos1.leeArchivo();
System.out.println();
} /* fin del main */
} /* fin de la clase */
/* Programa que graba una cadena de caracteres y posteriormente la lee. */
import java.io.*;
import javax.swing.*;
class ArchivosUno {
// Método para escribir el archivo
public void escribeArchivo(String nombreArchivo) {
DataOutputStream dos=null; // salida de datos hacia el archivo
String cadena = " ";
try {
cadena = JOptionPane.showInputDialog(null,"Escriba el texto que desea almacenar en el archivo: ");
dos=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(nombreArchivo+".dat")));
dos.writeUTF(cadena);
}
catch (IOException e) {
System.err.println("Error: "+e.getMessage());
}
finally {
JOptionPane.showMessageDialog(null,"¡Datos guardados con exito en el archivo!");
try {
if (dos != null) dos.close(); // cierra el archivo
}
catch (IOException e) {
System.err.println("Error: "+e.getMessage());
}
}
}
// Método para leer el archivo
m = matriz.length;
n = matriz[0].length;
try {
// crear un flujo hacia un archivo que permita escribir datos de tipo primitivo usando un buffer
dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(archivo)));
import java.io.*;
class MatricesOp {
public static void main(String args[]) {
// Declaración de variables
File archivo = null;
archivo = new File ("Matrices.dat");
MatricesArchivo archivoM = new MatricesArchivo();
/* Aquí se coloca la declaración de matrices y los métodos para leer y hacer operaciones con las matrices */
// Llamar desde el programa principal al método para grabar una matriz en un archivo
try{
archivoM.grabarArchivoM(archivo, matriz); }
catch (IOException e) {
System.out.println("Error: "+e.getMessage()); }
// Llamar desde el programa principal al método para leer una matriz de un archivo
try{
matriz = archivoM.leerArchivoM("Matrices.dat”); }
catch (IOException e) {
System.out.println("Error: "+e.getMessage()); }
PROGRAMACIÓN I
Applets
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
APPLETS.
Los programas en Java se dividen en dos tipos o categorías: aplicaciones y
applets. Las aplicaciones en Java son similares a un programa hecho en
C o C++, pero requieren de la Máquina Virtual de Java para ser ejecutados.
Las aplicaciones se usan para resolver diversos problemas y pueden
agruparse para formar sistemas, como inventarios, nómina, control escolar,
etcétera.
Un applet, es un programa diseñado para ser transmitido por Internet y
ejecutado en un navegador Web compatible con Java. Los applets tienen
algunas limitaciones ya que necesitan de ciertas condiciones de seguridad
para evitar daños en el sistema en el que está funcionando el navegador.
Algunas limitaciones son:
* Los applets no pueden leer o escribir en el sistema de archivos de la
computadora ya que pueden producir daños en los archivos o propagar
virus.
* Los applets no pueden establecer conexiones entre la computadora de un
usuario y otra computadora, excepto el servidor donde estén almacenados
los applets.
* Los applets no pueden ejecutar programas de la computadora donde está
el navegador, ya que pueden originar daños al sistema.
Así, un applet es una pequeña aplicación a la que se accede en un
navegador de Internet, se transmiten a través de la red, se instalan
automáticamente y se ejecutan como parte de un documento Web. Cuando
un applet llega a un cliente tiene acceso limitado a los recursos, por lo que
puede crear una interfaz de usuario multimedia y ejecutar cálculos
complejos sin ningún riesgo de virus o de violación de la integridad de los
datos.
Los applets se diferencian de las aplicaciones en algunas áreas clave ya
que no se estructuran de la misma forma que las aplicaciones. A
continuación presentamos un ejemplo sencillo de un applet.
import java.awt.*;
import java.applet.Applet;
public class Applet001 extends Applet
{
public void paint (Graphics g)
{
g.drawString ("Hola... Este es mi primer Applet en JAVA", 50, 100);
}
}
Este applet comienza con dos sentencias import. La primera importa las
clases del conjunto de herramientas de ventana abstracta (Abstract Window
Toolkit, AWT). Los applets interactúan con el usuario a través del AWT, no a
través de las clases de Entrada/Salida basadas en la consola o teclado. El
AWT permite desarrollar interfaces gráficas, basadas en el sistema de
ventanas. El AWT es bastante amplio y sofisticado y cuenta con múltiples
métodos y clases que permiten crear y manejar ventanas. Sin embargo,
solo se verán algunas de las técnicas necesarias para utilizar eficazmente
el AWT cuando se crean applets o aplicaciones.
La segunda sentencia import importa el paquete applet, el cual contiene la
clase Applet. Cada applet que se cree, debe ser una subclase de Applet.
La siguiente línea del programa declara la clase Applet001. Esta clase se
debe declarar como public, ya que se accederá a la misma desde código
externo al programa.
Dentro de la clase Applet001, se declara el método paint(). Este método
está definido por AWT y debe ser sobrescrito por el applet. Se llama al
método paint() cada vez que el applet debe mostrar su salida. Esto puede
ser por varias razones, por ejemplo, si la ventana en la se está ejecutando
el applet es tapada por otra ventana y después pasa otra vez a primer
término, o bien si se minimiza la ventana del applet y después se restaura.
También se llama al método paint() cuando comienza la ejecución del
applet, este método tiene un parámetro del tipo Graphics. Este parámetro
contiene el contexto gráfico que define el entorno gráfico en el cual se
ejecuta el applet. Este contexto se utiliza cuando se presenta la salida del
applet.
Dentro de paint() se llama al método drawString(), que es un miembro de
la clase Graphics. Este método es similar a System.out.print() que se
utiliza en modo texto, pero imprime una cadena en entorno gráfico a partir
de la posición X, Y especificada. Tiene la siguiente forma general:
void drawString(String mensaje, int x, int y)
Donde mensaje es la cadena que se imprimirá a partir de las coordenadas
x, y. En una ventana de Java, la esquina superior izquierda corresponde a
la posición 0, 0. En el ejemplo, la llamada al método drawString() en el
applet da lugar a que se imprima el mensaje "Hola... Este es mi primer
Applet en JAVA" en la posición 50, 100 de la ventana.
A diferencia de los programas Java, los applets no comienzan ejecutando el
método main() ya que la gran mayoría de los applets no tienen dicho
método. La ejecución de un applet comienza cuando se pasa el nombre de
su clase a un visualizador de applets o a un navegador web.
Después de introducir el código fuente de applet, este se compila de la
misma forma que se han compilado los programas, sin embargo su
ejecución es un proceso distinto. Existen varias formas de ejecución de un
applet:
• Ejecutar el applet dentro de un navegador Web compatible con Java,
como Internet Explorer o Netscape Navigator (recomendable).
• Utilizar un visualizador de applets como appletviewer, que es una
herramienta del equipo de desarrollo Java (JDK). Un visualizador ejecuta el
applet en una ventana. En general, esta es la forma más rápida y sencilla
de probar el applet.
• Algunos entornos de desarrollo, como el jGRASP, cuentan con un
visualizador de applets el cual permite ejecutar applets directamente.
A continuación se describe cada uno de estos métodos.
Para ejecutar un applet en un navegador Web, es necesario escribir un
pequeño archivo de texto HTML que contiene la etiqueta APPLET
apropiada. A continuación se muestra el archivo HTML, el cual llamaremos
Runapp.HTML y que ejecuta el applet Applet001:
<applet code="Applet001" width=300 height=200>
</applet>
Las sentencias width y height especifican las dimensiones de área de la
pantalla utilizada por el applet. Después de crear este archivo, se ejecuta el
navegador y entonces se carga este archivo. Como resultado se ejecutará
Applet001.
Para ejecutar Applet001 con un visualizador de applets, se ejecuta también
el archivo de texto con la etiqueta APPLET y que en este caso llamamos
Runapp.HTML. Entonces, utilizamos la siguiente línea de comando para
ejecutar Applet001:
C:\>j2sdk1.4.0\bin\appletviewer Runapp.html
Otro método para realizar pruebas rápidamente, consiste en incluir un
comentario en la cabecera del archivo fuente de Java que contiene la
etiqueta APPLET. De esta forma, el código está documentado con un
prototipo de las sentencias HTML necesarias, y se puede probar el applet
compilado, iniciando simplemente el visualizador de applets con el archivo
del código fuente Java.
import java.awt.*;
import java.applet.Applet;
/*
<applet code="Applet001" width=300 height=200>
</applet>
*/
public class Applet001 extends Applet
{
public void paint (Graphics g)
{
g.drawString ("Hola... Este es mi primer Applet en JAVA", 50, 100);
}
}
De esta manera, se pueden desarrollar rápidamente applets siguiendo
estos tres pasos:
Método Descripción
void destroy( ) Método llamado por el navegador justo antes de que
termine el applet. El applet debe sobrescribir este método
si necesita liberar algún recurso antes de finalizar.
AccesibleContext getAccesibleContext( ) Devuelve el contexto de accesibilidad del objeto.
AppletContext getAppletContext( ) Devuelve el contexto asociado al applet.
String getAppletinfo( ) Devuelve una cadena que describe al applet.
AudioClip getAudioClip(URL url) Devuelve un objeto AudioClip que encapsula el archivo
de audio encontrado en la dirección especificada por url.
AudioClip getAudioClip(URL url, String Devuelve un objeto AudioClip que encapsula el archivo
clipName) de audio encontrado en la dirección especificada por url y
que tiene el nombre especificado por clipName.
URL getCodeBase( ) Devuelve el URL asociado con el applet que llama al
método.
URL getDocumentBase( ) Devuelve el URL del documento HTML que invoca al
applet.
Image getImage(URL url) Devuelve un objeto Image que encapsula la imagen
encontrada en la dirección especificada por url.
Image getImage(URL url, String imageName) Devuelve un objeto Image que encapsula la imagen
encontrada en la dirección especificada por url y que tiene
el nombre especificado por imageName.
Método Descripción
Locale getLocale( ) Devuelve un objeto Locale que se utiliza por varias clases
y métodos que pueden trabajar con ese tipo de objetos.
void resize(Dimension dim) Cambia el tamaño del applet en función de las dimensiones
especificadas por dim. Dimension es una clase de java.awt
que contiene dos campos enteros: width y height.
void resize(int width, int height) Cambia el tamaño del applet en función de las dimensiones
especificadas por width y height.
final void setStub(AppletStub stubObj) Hace que stubObj sea el stub (resguardo) del applet. Este
método lo utiliza el intérprete de Java y normalmente no lo
utiliza el applet. Un stub es una pequeña parte de código que
proporciona el enlace entre el applet y el navegador.
void showStatus(String str) Muestra la cadena str en la ventana de estado del navegador o
del visor de applets. Si el navegador no dispone de una ventana
de estado, entonces no se realiza ninguna acción.
void start( ) El navegador llama a este método cuando debe comenzar (o
continuar) la ejecución de un applet. Cuando los applets
comienzan por primera vez, se ejecuta automáticamente
después de init( ).
void stop( ) El navegador llama a este método para parar o detener la
ejecución del applet. Una vez detenido, un applet puede volver
a ejecutarse cuando el navegador llama al método start( ).
Arquitectura de un applet.
Un applet es un programa basado en ventanas. Su arquitectura es
diferente de la de los programas basados en consola, también llamados
aplicaciones independientes, programas en modo plano o modo texto, o
simplemente aplicaciones.
En primer lugar, los applets son conducidos u orientados a eventos. El
applet espera hasta que ocurra un evento. El AWT notifica el evento al
applet llamando a un gestor de eventos para que lo trate. Después, el
applet debe ejecutar la acción que desee el programador y devolver el
control rápidamente al AWT. Esto es muy importante ya que un applet no
debe entrar en un nuevo modo de operación que mantenga el control
durante un periodo largo de tiempo. Por el contrario, el applet debe realizar
acciones específicas en repuesta a eventos y después devolver el control
al AWT. En las situaciones en las que el applet necesite realizar una tarea
repetitiva (por ejemplo, mostrar un mensaje largo en su ventana), se
deberá arrancar un nuevo hilo que ejecuta esta tarea. Auque en este curso
no se ve la programación multihilo, se verá un ejemplo que aplique este
concepto utilizando applets.
En segundo lugar, es el usuario el que inicia una interacción con un applet,
y no al revés. En un programa sin ventanas, cuando el programa necesita
una entrada, aparece el apuntador (prompt) y se llama a algún método de
entrada, como por ejemplo readLine(). Un applet no trabaja así, sino que es
el usuario el que interactúa con el applet como y cuando él quiera. Estas
interacciones se mandan la applet como eventos a los que el applet debe
responder. Por ejemplo, cuando el usuario hace clic dentro de la ventana de
un applet, se genera un evento clic. Si el usuario presiona una tecla cuando
la ventana del applet tiene el foco, se genera un evento keypress. Así, los
applets pueden contener varios controles, como botones o checkbox.
Cuando el usuario interactúa con uno de esos controles, se genera un
evento.
Debido a que la arquitectura de un applet no es tan fácil de entender como
la de un programa basado en consola, el AWT d Java lo hace lo más simple
posible, proporcionando un acceso mucho más claro y sencillo.
Estructura de un applet.
Casi todos los applets más pequeños sobrescriben una serie de métodos
que proporcionan el mecanismo básico mediante el cual el navegador o el
visor de applets se conectan con el applet y controlan su ejecución. Cuatro
de estos métodos, init(), start(), stop() y destroy(), los define Applet.
Otro, paint(), lo define la clase Component. Se proporcionan herramientas
por defecto para todos estos métodos. Los applets no necesitan
sobrescribir los métodos que no utilizan. Sin embargo, sólo los applets muy
sencillos no necesitan sobrescribir todos ellos, estos cinco métodos se
pueden ensamblar.
Es importante entender el orden en el que se llama a los diferentes
métodos en el applet. Cuando comienza un applet, el AWT llama a los
siguientes métodos en el siguiente orden:
init( )
El método init() es el primer método al que se llama. Es aquí cuando se
deben inicializar las variables. A este método sólo se le llama una sola vez
durante la ejecución del applet.
start( )
Al método start() se le llama inmediatamente después del método init().
También es llamado para reanudar un applet después de que este se haya
detenido o parado. Aunque a init() sólo se le llama una vez (cuando
inicialmente se carga un applet), a start() se le llama cada vez que un
documento HTML de un applet se visualiza en la pantalla. Por lo tanto, si un
usuario deja una página Web y vuelve atrás, el applet continúa la ejecución
en start().
paint( )
Al método paint() se le llama cada vez que la salida del applet tiene que
redibujarse. Esto puede ocurrir por varias razones. Por ejemplo, otra
ventana tapa la ventana en la que está corriendo el applet y hay que
visualizarla de nuevo. O cuando se minimiza la ventana del applet y
después se restaura. A paint() también se le llama cuando el applet
comienza a ejecutarse. Cualquiera que sea la causa, siempre que el applet
tenga que volver a dibujar su salida, se llama a paint(). El método paint()
tiene un parámetro del tipo Graphics. En este parámetro estará el contexto
gráfico, que describe el entonro gráfico en el que se está ejecutando el
applet. Este contexto se usa siempre que se requiera una salida al applet.
Cuando finaliza un applet, se llama a los siguientes métodos en este orden:
stop( )
Al método stop() se le llama cuando un navegador deja el documento
HTML que contiene el applet (por ejemplo, cuando se va a otra página).
Cuando se llama a stop(), probablemente el applet continúa ejecutándose.
Se debería usar stop() para suspender tareas que no necesiten ejecutarse
cuando el applet no es visible. Se puede reiniciar estas tareas cuando se
llama a start(), o sea, si el usuario vuelve a la página.
destroy( )
Al método destroy() se le llama cuando el entorno determina que el applet
necesita ser borrado completamente de la memoria. Aquí es cuando hay
que liberar cualquier recurso que pueda estar utilizando el applet. Al método
stop() se le llama siempre antes que a destroy().
Los métodos utilizados para visualizar applets se encuentran definidos en el
AWT, nosotros veremos solamente algunos métodos sencillos que nos
permitan crear nuestros primeros applets.
Métodos sencillos para la visualización de applets.
update( )
Este método está definido en AWT pero el usuario puede sobrescribirlo. La
versión por defecto de update() rellena primero un applet con el color de
fondo que haya por defecto y después llama a paint(). Si se rellena el fondo
con un color diferente con paint(), el usuario verá un flash del fondo cada
vez que se llame a update(), es decir, siempre que se vuelva a pintar la
ventana. Para evitar esto, se sobrescribe el método update() para que
realice lo necesario para una buena visualización. Entonces paint()
simplemente llama a update(). En algunas aplicaciones, el applet
sobrescribe update() y update() de la siguiente forma:
public void update(Graphics g) {
// código para redibujar la ventana.
}
public void paint (Graphics g) {
update(g);
}
drawString( )
Se utiliza para mostrar una cadena de texto en la ventana de un applet.
drawString( ) es un método de la Graphics. Normalmente se llama desde
update o desde paint. Su forma general es la siguiente:
void drawString(String mensaje, int x, int y)
Donde nuevoColor especifica el nuevo color. La clase Color define las constantes
que se muestran a continuación y que pueden ser utilizadas para especificar
colores.
Color.black Negro Color.magenta Morado
Color.blue Azul Color.orange Naranja
Color.cyan Azul cielo Color.pink Rosa
Color.darkGray Gris oscuro Color.red Rojo
Color.gray Gris Color.white Blanco
Color.green Verde Color.yellow Amarillo
Color.ligthGray Gris claro
Un buen lugar para establecer el color de fondo y el de frente es el método init().
Aunque stos colores pueden cambiarse tantas veces como sea necesario durante la
ejecución del applet. Los colores por defecto son: negro para el texto y gris claro
para el fondo.
getBackground( ) y getForeground( )
Los métodos setBackground() y setForeground(), se utilizan para obtener
los colores que actualmente están establecidos para el fondo y el texto,
respectivamente. Se encuentran definidos en la clase Component de la
siguiente manera:
Color getBackground( )
Color getForeground( )
repaint( )
El método repaint() está definido en AWT y se utiliza para actualizar el
contenido de una ventana cuando su información cambia. Esto hace que el
sistema ejecute una llamada al método update() del applet, y éste método a
su vez, llama por defecto a paint(). Si queremos que otra parte del applet
presente algo en su ventana, lo que se hace es guardar esa salida y llamar
a repaint(), entonces, AWT ejecutará una llamada a paint(), que visualiza la
información guardada. El método repaint() tiene cuatro formas:
La primera es la versión más simple y hace que toda la ventana sea
repintada.
void repaint( )
La siguiente versión especifica la parte o región que será repintada:
void repaint(int left, int top, int width, int height)
getParameter( )
En HTML, la etiqueta APPLET permite pasar parámetros a un applet. Para
recuperar el valor de un parámetro se utiliza el método getParameter().
Este devuelve el valor del parámetro como un objeto String. Por lo tanto,
para valores numéricos y bolean, se necesitará convertir sus
representaciones de tipo String a sus formatos internos. Por lo que deberán
verificarse los valores de retorno desde getParameter(). Si un parámetro no
está disponible, getParameter() devolverá null. Las conversiones a tipo
numérico también se deben manejar con sentencias try y catch, tratando la
excepción NumberFormatException.
String getParameter(String mensaje)
getDocumentBase( ) y getCodebase( )
Comúnmente, se crearán applets que necesiten explícitamente cargar texto
e imágenes y/o sonido. Java permite cargar datos desde el directorio en el
que se encuentra el archivo HTML que arranca el applet (base del
documento) y desde el directorio desde el cual el archivo clase applet fue
cargado (base de código). Estos directorios se devuelven como objetos
URL mediante getDocumentBase() y getCodebase(). Pueden
concatenarse en una cadena que nombre el archivo que se quiere cargar.
Para cargar otro archivo, se utilizará el método showDocument() definido
por la interfaz AppletContext.
URL getDocumentBase( )
URL getCodebase( )
AppletContext y showDocument()
Java puede mostrar imágenes activas y animación para dar un aspecto
gráfico a la navegación por Internet. Para permitir al applet transferir el
control a otra URL, se debe utilizar el método showDocument(), definido
por la interfaz AppleContext, la cual es una interfaz que da información
desde el entorno de ejecución.
Así, dentro de un applet, y una vez que se ha obtenido el contexto del
applet, se puede visualizar otro documento llamando a showDocument().
Este método no devuelve ningún valor ni lanza ninguna excepción si falla
por lo que hay que utilizarlo con precaución. Hay dos métodos
showDocument(). El método showDocument(URL) visualiza el
documento en la URL especificada. El método showDocument(URL,
where) visualiza el documento especificado en el lugar especificado (where)
dentro de la ventana del navegador. Algunos argumentos válidos para
where son: “_self” (lo muestra en el frame actual), “_parent” (lo muestra en
el frame padre), “_top” (lo muestra en el frame superior), y “_blank” (lo
muestra en una nueva ventana del navegador). También se puede
especificar un nombre, para que el documento se muestre en una nueva
ventana del navegador con ese nombre.
Método Descripción
Applet getApplet(String appletName) Devuelve el applet especificado por
appletName si está dentro del contexto del
applet actual. En caso contrario devuelve null.
Enumeration getApplets( ) Devuelve una enumeración con los applets
que se encuentran dentro del contexto del
actual applet.
AudioClip getAudioClip(URL url) Devuelve un objeto AudioClip que encapsula
el archivo de sonido encontrado en la posición
especificada por url.
Image getImage(URL url) Devuelve un objeto Image que encapsula la
imagen encontrada en la posición especificada
por url.
void showDocument(URL url) Visualiza el documento que se encuentra en el
URL especificado por url. Este método no se
puede utilizar cuando se trabaja con visores de
applets.
void showDocument(URL url, String where) Visualiza el documento que se encuentra en el
URL especificado por url. Este método no se
puede utilizar cuando se trabaja con visores de
applets. La posición del documento en el texto
viene especificada por where.
void showStatus(String str) Muestra la cadena str en la ventana de estado.
Interfaz AudioClip
La interfaz AudioClip define los siguientes métodos:
play( ) (reproduce un archivo de sonido desde el principio),
stop( ) (detiene la reproducción del archivo de sonido), y
loop( ) (reproduce un archivo de sonido en forma continua). Después de
cargar un clip o archivo de audio utilizando getAudioClip( ), estos
métodos se pueden usar para oírlo.
UNIVERSIDAD AUTONOMA DE SINALOA
FACULTAD DE INFORMÁTICA DE MAZATLAN
PROGRAMACIÓN I
Manejo de Eventos
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
EVENTOS.
Donde src es el objeto que genera ese evento. A su vez, EventObject contiene dos
métodos: getSource( ) y toString( ). El método getSource() devuelve la fuente del
evento. Su forma general es la siguiente:
Object getSource( )
Donde src es una referencia al objeto que ha generado ese evento. El tipo
del evento se especifica con type, y la cadena cmd corresponde a su
comando. El argumento modifiers indica que teclas modificadoras (ALT,
CTRL, META y/o SHIFT) se han presionado cuando se ha generado el
evento.
Se puede obtener el nombre del comando del objeto invocado ActionEvent
utilizando el método getActionCommand( ), como se muestra a
continuación:
String getActionCommand( )
Por ejemplo, cuando se presiona un botón, se genera un evento de acción
que tiene un nombre de comando igual a la etiqueta (label) de ese botón.
El método getModifiers( ) devuelve un valor que indica qué tecla
modificadora (ALT, CTRL, META y/o SHIFT) se han presionado cuando el
evento se ha generado. Su forma es la siguiente:
int getModifiers( )
La clase FocusEvent.
Se genera un objeto evento de la clase FocusEvent cuando un
componente está o deja de estar activo. Estos eventos se identifican
mediante las constantes enteras: FOCUS_GAINED y FOCUS_LOST.
FocusEvent es una subclase de ComponentEvent y tiene estos
constructores:
FocusEvent(Component src, int type)
FocusEvent(Component src, int type, boolean temporaryFlag)
Donde src es una referencia al componente que ha generado el evento. El tipo del
evento es especificado por type. El momento en el que ha ocurrido el evento ratón
se pasa con when. El argumento modifiers indica qué modificador se ha presionado
cuando ha ocurrido un evento ratón. Las coordenadas del ratón se pasan con x, y.
El número de clicks se pasa con clicks. La etiqueta triggersPopup indica si ese
evento hace que aparezca un menú en esa plataforma.
Los métodos que más se usan en esta clase son getX( ) y getY( ). Estos métodos
devuelven las coordenadas X, Y del ratón cuando ha ocurrido el evento. Sus formas
son las siguientes:
int getX( )
int getY( )
También se puede usar el método getPoint( ) para obtener las coordenadas del
ratón:
Point getPoint( )
Este devuelve un objeto Point que contiene las coordenadas X, Y en sus miembros
enteros: x, y.
El método translatePoint( ) traduce la posición del evento. Su forma es la siguiente:
void translatePoint(int x, int y)
2. La interfaz AdjustmentListener.
Esta interfaz define el método adjustmentValueChanged( ) que se invoca
cuando se produce un evento de ajuste. Su forma general es la siguiente:
void adjustmentValueChanged(AdjustmentEvent ae)
3. La interfaz ComponentListener.
Esta interfaz define cuatro métodos que se invocan cuando a un
componente se le cambia el tamaño, se mueve, se muestra o se oculta. Sus
formas generales son las siguientes:
void componentResized(ComponentEvent ce)
void componentMoved(ComponentEvent ce)
void componentShown(ComponentEvent ce)
void componentHidden(ComponentEvent ce)
4. La interfaz ContainerListener.
Esta interfaz tiene dos métodos. Cuando se añade un componente a un
contenedor, se invoca a componentAdded( ). Cuando se borra un
componente de un contenedor, se invoca a componentRemoved( ). Sus
formas generales son las siguientes:
void componentAdded(ContainerEvent ce)
void componentRemoved(ContainerEvent ce)
5. La interfaz FocusListener.
Esta interfaz define dos métodos. Cuando un componente obtiene el foco
del teclado, se invoca focusGained( ). Cuando un componente pierde el
foco del teclado, se llama a focusLost( ). Sus formas generales son las
siguientes:
void focusGained(FocusEvent fe)
void focusLost(FocusEvent fe)
6. La interfaz ItemListener.
Esta interfaz define el método itemStateChanged( ) que se invoca cuando
cambia el estado de un elemento. Su forma general es la siguiente:
void itemStateChanged(ItemEvent ie)
7. La interfaz KeyListener.
Esta interfaz define tres métodos. Los métodos keyPressed( ) y
keyReleased( ) se invocan cuando se presiona y se libera una tecla,
respectivamente. El método keyTyped( ) se invoca cuando se introduce un
carácter.
Por ejemplo, si un usuario presiona y libera la tecla A, se generan tres
eventos en este orden: tecla presionada, carácter introducido, tecla
liberada. Si un usuario presiona y libera la tecla INICIO, se generan dos
eventos en este orden: tecla presionada, tecla liberada.
Las formas generales de estos eventos son las siguientes:
void keyPressed(KeyEvent ke)
void keyReleased(KeyEvent ke)
void keyTyped(KeyEvent ke)
8. La interfaz MouseListener.
Esta interfaz define cinco métodos. Si se presiona y se libera el ratón en el
mismo punto, se invoca a mouseClicked( ). Cuando el ratón se introduce
en un componente, se llama al método mouseEntered(). Cuando el ratón
sale del componente, se llama a mouseExited(). Los métodos
mousePressed( ) y mouseReleased( ) se invocan cuando se presiona y
se libera el ratón, respectivamente.
Las formas generales de estos métodos son las siguientes:
void mouseClicked(MouseEvent me)
void mouseEntered(MouseEvent me)
void mouseExited(MouseEvent me)
void mousePressed(MouseEvent me)
void mouseReleased(MouseEvent me)
9. La interfaz MouseMotionListener.
Esta interfaz define dos métodos. Al método mouseDragged( ) se le llama
tantas veces como se arrastre el ratón. Al método mouseMoved( ) se le
llama tantas veces como se mueva el ratón. Sus formas generales son:
void mouseDragged(MouseEvent me)
void mouseMoved(MouseEvent me)
10. La interfaz TextListener.
Esta interfaz define el método textChanged( ) que se invoca cuando hay
un cambio en un área de texto o en un campo de texto. Su forma general
es la siguiente:
void textChanged(TextEvent te)
Donde ml es una referencia al objeto que recibe los eventos del ratón, y mml es
una referencia al objeto que recibe los eventos de movimiento del ratón.
La gestión de eventos del teclado.
Para gestionar eventos de teclado se utiliza la misma arquitectura que se
acaba de ver para los eventos de ratón. La diferencia es que se
implementará la interfaz Key Listener. El applet incluye la gestión de
algunas teclas especiales (virtuales), como los cursores o las teclas de
función, utilizando el manejador keyPressed( ), ya que no están
disponibles a través de keyTyped( ). Para identificar las teclas, hay que
utilizar sus códigos de tecla virtuales. Un aspecto que hay que conocer
antes de que el programa pueda procesar eventos del teclado, es que tiene
que pedir el foco de entrada. Para hacer esto, hay que llamar a
requestFocus( ), que está definido por Component. Si no se hace esto,
entonces el programa no recibirá ningún evento del teclado.
UNIVERSIDAD AUTONOMA DE SINALOA
FACULTAD DE INFORMÁTICA DE MAZATLAN
PROGRAMACIÓN I
Herramientas gráficas AWT
TITULAR DE LA MATERIA:
DR. JOSÉ NICOLÁS ZARAGOZA GONZÁLEZ
HERRAMIENTAS GRÁFICAS AWT.
Container
MenuContainer
Interface
Window Panel
Frame
Trabajar con ventanas Frame.
Después del applet, el tipo de ventana más común es el derivado de la
clase Frame. Se utilizan para crear ventanas hijas dentro de los applets y
ventanas de nivel superior o hijas para las aplicaciones con un estilo
estándar. Los dos constructores de la clase Frame son:
Frame( )
Frame(String título)
El primero crea una ventana estándar que no tiene título. El segundo crea
una ventana con el título indicado en la cadena título. Las dimensiones de
la ventana se establecen una vez que se ha creado la ventana. No se
pueden establecer sus dimensiones en el constructor. A continuación se
verán algunos métodos que se utilizan al trabajar con ventanas Frame.
1. Establecer las dimensiones de una ventana.
El método setSize( ) se utiliza para establecer las dimensiones de una
ventana:
void setSize(int newWidth, int newHeight)
void setSize(Dimension newSize)
Una vez creada la ventana Frame tiene vida propia. Aunque main() termina
con la llamada a unaAplicacionVentana.setVisible(true). El programa
sigue ejecutándose hasta que se cierra la ventana. Básicamente, cuando se
crea una aplicación con ventanas, se utilizará main() para lanzar su
ventana de nivel superior. Después, el programa funcionará igual que una
aplicación basada en Interfaz Gráfica del Usuario (Graphic User Interface o
GUI), y no como los anteriores programas basados en consola.
/* MiAplicacionVentana.java */
import java.awt.*;
import java.awt.event.*;
// Crea una ventana marco o frame.
public class MiAplicacionVentana extends Frame
{
String keyMensaje = " ";
String mouseMensaje = " ";
int ratonX = 30, ratonY = 30;
public MiAplicacionVentana() {
addKeyListener(new MiKeyAdapter(this));
addMouseListener(new MiMouseAdapter(this));
addWindowListener(new MiVentanaAuditora());
}
public void paint(Graphics g)
{
g.drawString(keyMensaje, 10, 40);
g.drawString(mouseMensaje, ratonX, ratonY);
}
// Crea la ventana.
public static void main(String args[ ])
{
MiAplicacionVentana unaAplicacionVentana = new MiAplicacionVentana();
unaAplicacionVentana.setSize(new Dimension(300, 200));
unaAplicacionVentana.setTitle("Apicacion basada en el AWT");
unaAplicacionVentana.setVisible(true);
}
} // Fin de la clase.
/* MiKeyAdapter.java */
import java.awt.*;
import java.awt.event.*;
public class MiKeyAdapter extends KeyAdapter
{
MiAplicacionVentana appVentana;
/* MiVentanaAuditora.java */
import java.awt.*;
import java.awt.event.*;
public class MiVentanaAuditora extends WindowAdapter
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
} // Fin de la clase
Gráficos.
En el sentido más amplio, una ventana es un contenedor de información, la
cual puede presentar textos de alta calidad y gráficos. Gran parte de la
potencia del AWT viene de estos elementos, y el AWT tiene una amplia
variedad de métodos gráficos. Todos los gráficos se dibujan en una
ventana, que puede ser la ventana principal de un applet, una ventana hija
de un applet, o una ventana de una aplicación independiente. El origen (0,0)
de cada ventana está en la esquina superior izquierda. Las coordenadas
están dadas en píxeles. Todas las salidas sobre una ventana se hacen a
través de un contexto gráfico el cual está encapsulado en la clase Graphics
y se obtiene de dos posibles maneras:
•Se pasa a un applet cuando se llama a alguno de sus métodos, como
paint( ) o update( ).
•Es devuelto por el método getGraphics( ) de Component.
Los gráficos pueden aparecer en la ventana principal de un applet o en
cualquier otra ventana. En la clase Graphics se definen un conjunto de
métodos para dibujar. Se puede dibujar una figura o una forma rellena, o
sólo su borde. Los objetos se dibujan y se rellenan con el color que esté en
ese momento seleccionado, el color por defecto es el negro. Cuando se
intenta dibujar un objeto gráfico de dimensiones mayores que las de la
ventana, la salida se corta automáticamente.
Entre otras figuras, Java permite dibujar:
•Líneas;
•Rectángulos;
•Óvalos (y por consecuencia también círculos);
•Arcos.
También pueden dibujarse:
•Rectángulos con realce (tridimensionales);
•Rectángulos con esquinas redondeadas;
•Polígonos.
Además, se puede especificar un color para rellenar las figuras.
Un objeto se dibuja en el color actual, que puede cambiarse mediante el
método setColor(). Los colores disponibles son:
black Negro magenta Morado
blue Azul orange Naranja
cyan Azul cielo pink Rosa
darkGray Gris oscuro red Rojo
gray Gris white Blanco
green Verde yellow Amarillo
ligthGray Gris claro
Método Descripción
public abstract void clearRect (int x, Borra el rectángulo especificado, llenándolo con el color de fondo.
int y, int ancho, int alto)
public void draw3DRect (int x, int y, Dibuja un rectángulo resaltado en 3D. Si el valor de relieve es
int ancho, int alto, boolean relieve) verdadero (true), el rectángulo aparece con relieve.
public void drawArc (int x, int y, int Dibuja un arco circular o elíptico. El arco se dibuja empezando
ancho, int alto, int anguloInicio, int desde anguloInicio hasta anguloInicio+anguloArco. Los ángulos
anguloArco) se miden en grados. Un ángulo de 0 grados representa la posición
de las 3:00 en el reloj. Un valor de anguloArco positivo indica un
sentido contrario a las manecillas del reloj.
public abstract boolean drawImage Dibuja la imagen dentro del rectángulo especificado, escalándola
(Image imagen, int x, int y, int ancho, en caso de ser necesario. Debe especificarse un objeto como el
int alto, ImageObserver observador) último parámetro. Este objeto es notificado en caso de que la
imagen no se cargue completamente. Por lo general, este
parámetro es simplemente this.
public void drawLine (int x1, int y1, Dibuja una línea desde las coordenadas x1, y1 hasta x2, y2.
int x2, int y2)
public void drawOval (int x, int y, int Dibuja una elipse o un círculo (si el ancho y el alto son iguales).
ancho, int alto)
public void drawPolygon (int puntosX[ Dibuja un polígono cerrado, utilizando los pares de coordenadas
], int puntosY[ ], int puntosn) en los dos arreglos. Se dibuja una línea desde el primer hasta el
último punto.
public void drawRect (int x, int y, int Dibuja un rectángulo, utilizando el color actual.
ancho, int alto)
java.awt.Graphics (import java.awt.Graphics; o import java.awt.*;)
Método Descripción
public void drawRoundRect (int x, int Dibuja un rectángulo con esquinas redondeadas en el color actual.
y, int ancho, int alto, int anchoArco, int anchoArco es el diámetro horizontal del arco en las cuatro
altoArco) esquinas y altoArco es el diámetro vertical.
public void drawString (String cad, Dibuja la cadena especificada en cad. La línea base del primer
int x, int y) carácter se encuentra en la coordenada x, y. Los caracteres están
en el tipo de letra y color actuales.
public void fillArc (int x, int y, int Dibuja una figura en forma de pastel, utilizando de relleno el color
ancho, int alto, int anguloInicio, int actual.
anguloArco)
public void fillOval (int x, int y, int Dibuja una elipse o círculo relleno.
ancho, int alto)
public void fillPolygon (int puntosX[ ], Rellena un polígono con el color actual.
int puntosY[ ], int puntosn)
public void fillRect (int x, int y, int Rellena un rectángulo con el color actual.
ancho, int alto)
public void fillRoundRect (int x, int y, Rellena un rectángulo redondeado con el color actual.
int ancho, int alto, int anchoArco, int
altoArco)
public void setColor (Color c) Establece el color actual. Los colores disponibles son los
indicados en la tabla anterior.
java.awt.Button (import java.awt.Button; o import java.awt.*;)
Método Descripción
public Button (String etiqueta) Crea un botón con la etiqueta indicada.
public String getLabel( ) Devuelve la etiqueta en este botón.
Método Descripción
public Canvas( ) Crea un lienzo para dibujar.
public void paint (Graphics g) Vuelve a dibujar el lienzo. Normalmente el programador redefine
este método.
Método Descripción
public Checkbox (String cad) Crea una casilla de verificación con la etiqueta cad.
public Checkbox (String cad, Crea una casilla de verificación con la etiqueta cad, dentro del grupo
Checkboxgroup g, boolean estado) de casillas de verificación de nombre g y con el estado inicial.
public boolean getState ( ) Devuelve el estado de la casilla de verificación.
Método Descripción
public Choice ( ) Crea un nuevo grupo de cuadros de opción al que se le pueden
agregar más de este tipo de cuadros.
public void addItem (String Agrega un elemento a este cuadro de opción.
elemento)
public String getSelectedItem( ) Devuelve el elemento seleccionado.
Método Descripción
public Color getBackground( ) Devuelve el color de fondo.
public Graphics getGraphics( ) Devuelve el contexto de gráficos que, por lo general se llama g.
public void paint (Graphics g) El programador lo redefine para dibujar la ventana, g es el contexto
de gráficos.
public void repaint ( ) El programador lo invoca cuando la pantalla necesita volver a
dibujarse. Ocasiona que se invoque a paint().
public void setSize (int ancho, int Cambia el tamaño del componente al tamaño especificado en la
alto) pantalla.
public void setVisible (boolean Hace que el componente sea visible (o no) en la pantalla.
visible)
java.awt.Container (import java.awt.Container; o import java.awt.*;)
Método Descripción
public Component add Agrega el componente al final del contenedor.
(Component comp)
public void remove Elimina el componente del contenedor.
(Component comp)
public void setSize (int Cambia el tamaño del componente al tamaño especificado.
ancho, int alto)
public void setLayout Administrador de esquemas. Las opciones son: FlowLayout(), GridLayout(),
(LayoutManager m) BorderLayout().
Método Descripción
public FileDialog Crea una ventana de diálogo de archivos. El padre es el marco que crea la
(Frame padre, String ventana. El título es el título de la ventana. El modo puede ser FileDialog.LOAD
titulo, int modo) o FileDialog.SAVE.
public String getFile( ) Devuelve el nombre del archivo que ha sido seleccionado, o un valor nulo si no
se ha seleccionado ninguno.
Método Descripción
public FileDialog ( ) Crea un marco.
public void setTitle Establece el título del marco en la cadena cad.
(String cad)
java.awt.Label (import java.awt.Label; o import java.awt.*;)
Método Descripción
public Label (String etiqueta) Crea una nueva etiqueta.
Método Descripción
public List (int r, boolean varios) Crea una nueva lista con r renglones visibles. Si varios es
verdadero (true), entonces pueden seleccionarse varios
elementos. Si varios es falso (false), entonces sólo puede
seleccionarse un elemento.
public void add (String elemento) Agrega el elemento a la lista.
public void add (String elemento, int Agrega el elemento en el índice especificado.
índice)
public String getSelectedItem ( ) Devuelve una cadena, que es el nombre del elemento
seleccionado, o null si no hay elemento seleccionado (la lista sólo
permite que se seleccione un elemento).
public String[ ] getSelectedItem ( ) Devuelve una cadena, que es el nombre del elemento
seleccionado, o null si no hay elemento seleccionado (la lista
permite que se seleccionen varios elementos).
public void remove (int índice) Elimina el elemento que se encuentre en el índice especificado.
public void remove (String Elimina la primera ocurrencia del elemento.
elemento)
java.awt.Menu (import java.awt.Menu; o import java.awt.*;)
Método Descripción
public MenuItem add (MenuItem mi) Agrega un elemento a un menu.
public void addSeparator ( ) Agrega un separador a un menú.
public Menu (String cadena) Crea un menú con el nombre especificado por la cadena.
Método Descripción
public Menu add (Menu m) Agrega un menú a una barra de menús.
public MenuBar ( ) Crea una barra de menus.
Método Descripción
public MenuItem ( ) Crea un elemento de menú con la cadena especificada como
etiqueta.
Método Descripción
public ScrollBar (int orientación, int Crea una nueva barra de desplazamiento.
valor, int visible, int mínimo, int
máximo)
public int getValue ( ) Devuelve el valor entero.
java.awt.TextArea (import java.awt.TextArea; o import java.awt.*;)
Método Descripción
public TextArea (int renglones, int Crea una nueva área de texto con un tamaño definido por el
columnas) número de renglones y por el número de columnas.
public TextArea (String texto, int Crea una nueva área de texto, iniciándola con la cadena.
renglones, int columnas, int vista) vista especifica las barras de desplazamiento a mostrar,
mediante uno de los siguientes valores:
SCROLLBARS_BOTH
SCROLLBARS_HORIZONTAL_ONLY
SCROLLBARS_VERTICAL_ONLY
SCROLLBARS_NONE
public void append (String cad) Agrega la cadena cad al final del texto actual.
public void insert (String cad, int aquí) Inserta la cadena cad en el índice aquí.
Método Descripción
public TextField (int cols) Crea un nuevo campo de texto, con una anchura de cols
caracteres.
Texto.
El AWT permite trabajar con diversos tipos de letra, los cuales han surgido
de los tipos tradicionales de imprenta y se han convertido en una parte
importante de las visualizaciones de los documentos generados por
computadora. El AWT proporciona gran flexibilidad para las operaciones de
manipulación de tipos de letra y permite la selección dinámica de dichos
tipos de letra.
En Java 2, los tipos de letra tienen un nombre de familia, un nombre lógico
y un nombre. El nombre de familia es el nombre general del tipo de letra,
por ejemplo: Courier. El nombre lógico especifica una categoría del tipo de
letra, como SansSerif. El nombre o nombre face especifica el tipo de letra,
como Courier Italic. La clase Font encapsula los tipos de letra. En la
siguiente tabla se muestran algunos de los métodos definidos por la clase
Font.
Método Descripción
static Font decode(String cad) Devuelve un tipo de letra dando su nombre.
boolean equals(Object FontObj) Devuelve true si el objeto que llama ala método contiene el mismo tipo
de letra que el especificado por FontObj. En caso contrario devuelve
false.
String getFamily( ) Devuelve el nombre de la familia de tipo de letra a la que pertenece el
tipo de letra que ha realizado la llamada.
static Font getFont(String Devuelve el tipo de letra asociado a la propiedad especificada por
property) property. Devuelve null si no existe property.
static Font getFont(String Devuelve el tipo de letra asociado a la propiedad especificada por
property, Font defautlFont) property. Devuelve null si no existe property. Devuelve el tipo de letra
especificado por defaultFont si no existe property.
String getFontName( ) Devuelve el nombre del tipo de letra que ha llamado al método.
String getName( ) Devuelve el nombre lógico del tipo de letra que ha llamado al método.
int getSize( ) Devuelve el tamaño, en puntos, del tipo de letra que llama al método.
int getStyle( ) Devuelve el valor del estilo del tipo de letra que llama al método.
int hashCode( ) Devuelve el código hash asociado al objeto que llama al método.
boolean isBold( ) Devuelve true si el tipo de letra incluye el estilo BOLD. En caso
contrario devuelve false.
boolean isItalic( ) Devuelve true si el tipo de letra incluye el estilo ITALIC. En caso
contrario devuelve false.
boolean isPlaint( ) Devuelve true si el tipo de letra incluye el estilo PLAIN. En caso
contrario devuelve false.
String toString( ) Devuelve la cadena equivalente al tipo de letra que llama al método.
La clase Font define las siguientes variables:
Variable Significado
String name Nombre del tipo de letra.
float pointSize Tamaño, en puntos, del tipo de letra.
int size Tamaño, en puntos, del tipo de letra.
int style Estilo del tipo de letra.
Este método devuelve un arreglo de objetos Font que contiene todos los
tipos de letra disponibles.
Para seleccionar u nuevo tipo de letra, primero hay que construir un objeto
Font que describa ese tipo de letra. Una de las formas del constructor
Font tiene el siguiente formato:
Font(String fontName, int fontStyle, int pointSize)
Una vez que se tiene el tipo de letra que se está utilizando, se puede
obtener información de él utilizando varios métodos definidos por la clase
Font.
El siguiente ejemplo muestra una aplicación de la clase Font y el manejo de
las cinco fuentes básicas:
import java.awt.*;
import java.awt.event.*;
// Crea una ventana marco o frame.
public class Texto extends Frame
{
Font f;
String msg;
public Texto() {
this.addWindowListener(this);
}
public void miFuente (int x)
{
switch (x) {
case 1 : f = new Font ("Dialog", Font.PLAIN, 12);
setFont (f);
msg = "Dialog"; break;
case 2 : f = new Font ("DialogInput", Font.PLAIN, 12);
setFont (f);
msg = "DialogInput"; break;
case 3 : f = new Font ("SansSerif", Font.PLAIN, 12);
setFont (f);
msg = "SanSerif"; break;
case 4 : f = new Font ("Serif", Font.PLAIN, 12);
setFont (f);
msg = "Serif"; break;
case 5 : f = new Font ("Monospaced", Font.PLAIN, 12);
setFont (f);
msg = "Monospaced";
}
}
public void paint(Graphics g)
{
g.drawString ("Hola... Esta es una aplicación con texto", 10, 200);
miFuente(1);
g.drawString (msg, 20, 50);
miFuente(2);
g.drawString (msg, 20, 75);
miFuente(3);
g.drawString (msg, 20, 100);
miFuente(4);
g.drawString (msg, 20, 125);
miFuente(5);
g.drawString (msg, 20, 150);
}
public static void main(String args[ ])
{
Texto unaAplicacionVentana = new Texto();
unaAplicacionVentana.setSize(new Dimension(300, 300));
unaAplicacionVentana.setTitle("Apicacion basada en el AWT");
unaAplicacionVentana.setVisible(true);
}
} // Fin de la clase.
APLICACIONES CON ENTORNO GRÁFICO.
El primer formato crea un checkbox cuya etiqueta está inicialmente vacía y el estado
del checkbox es no seleccionado. El segundo formato crea un checkbox cuya
etiqueta está especificada en cad y el estado del checkbox está también como no
seleccionado. El tercer formato permite establecer el formato inicial del checkbox. Si
on es true, el checkbox está inicialmente seleccionado; si no, esta no seleccionado.
Los formatos cuarto y quinto crean un checkbox cuya etiqueta viene especificada
por cad y cuyo grupo está especificado por cbGroup. Si este checkbox no pertenece
a ningún grupo, cbGroup tiene que ser null. El valor de on determina el estado
inicial del checkbox.
Listas.
La clase List proporciona una lista de selección compacta, con
desplazamiento, que permite realizar selecciones múltiples. Se puede
construir un objeto List que muestre cualquier número de opciones en una
ventana. También se puede configurar de manera que se puedan realizar
selecciones múltiples. List tiene estos constructores:
List( )
List(int numRenglones)
List(int numRenglones, boolean selecciónMúltiple)
La primera versión crea un control List que permite que haya solo un
elemento seleccionado en cada instante. En el segundo formato, el valor de
numRenglones especifica el número de entradas en la lista que estarán
visibles (las demás se pueden ver cuando sea necesario desplazándose por
la ventana). En el tercer formato, si selecciónMúltiple es verdadero, el
usuario puede seleccionar dos o más elementos a al vez. Si es falso, sólo
se puede seleccionar un elemento.
Barras de menú y menús.
Una ventana de nivel superior puede tener asociada una barra de menú,
que muestra una lista de opciones de menú de nivel superior. Cada opción
está asociada a un menú desplegable. Este concepto se implementa en
Java con las clases: MenuBar, Menu y MenuItem. En general, una barra
de menú tiene uno o más objetos Menu. Cada objeto Menu tiene una lista
de objetos MenuItem. Cada objeto MenuItem representa algo que el
usuario puede seleccionar. Debido a que Menu es una subclase de
MenuItem, se puede crear una jerarquía de submenús anidados. También
se pueden incluir elementos de menú que puedan verificar (o seleccionar),
que son opciones de menú de la clase CheckboxMenuItem y aparece una
marca al lado de ellos cuando se seleccionan.
Para crear una barra de menú, primero hay que crear una instancia de
MenuBar. Esta clase solo define el constructor por defecto. Después, se
crean instancias de Menu que definan las selecciones que se muestran en
la barra.
Los constructores de Menu son los siguientes:
Menu( )
Menu(String nombreOpción)
Menu(String nombreOpción, boolean removible)
Arriba (NORTH)
Izquierda Derecha
(CENTER)
Abajo (SOUTH)
Ejemplos:
setLayout (new FlowLayout (FlowLayout.CENTER ) ;
setLayout (new GridLayout (Renglones, Columnas, SeparaciónX, SeparaciónY ));
setLayout (new BorderLayout ( ));
showInputDialog
JOptionPane.showInputDialog(null, “Mensaje”);
JOptionPane.showInputDialog(null,“Mensaje”,null,JOptionPane.QUESTION_MESSAGE);
JOptionPane.showInputDialog(null,“Mensaje”,null,JOptionPane.INFORMATION_MESSAGE);
showMessageDialog
JOptionPane.showMessageDialog(null, “Mensaje”);
JOptionPane.showMessageDialog(null,“Mensaje”,null,JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null,“Mensaje”,null,JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(null,“Mensaje”,null,JOptionPane.ERROR_MESSAGE);
Ejemplo de aplicación de los métodos de JOptionPane:
import java.io.*;
import javax.swing.*;
c = a + b;
// . . . Otros métodos . . .
public static void main(String args[]) { // se agrega un verificador para que cierre la ventana con la x de arriba
JScrollPane barra; ventana.addWindowListener(new WindowAdapter() {
JButton boton1; public void windowClosing(WindowEvent e) {System.exit(0);}
ventana.setTitle("Ejemplo de una Ventana o Frame"); });
ventana.setBackground(java.awt.Color.white); } // termina main
ventana.setExtendedState(ICONIFIED); } // termina clase
ventana.setSize(600,400);
ventana.setVisible(true);
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ventana.setLayout(new BorderLayout());
JTextArea texto1 = new JTextArea(400,200);
texto1.setEditable(false);
texto1.append("\n\n\n\n\n\n\n\n\t\tEste texto se escribe en la
ventana\n\n\n");
ventana.add(texto1);
barra = new JScrollPane(texto1);
ventana.getContentPane().add(barra, BorderLayout.CENTER);
boton1 = new JButton("Este boton aparece arriba y permite cerrar
la ventana");
ventana.add(boton1, BorderLayout.NORTH);
boton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ventana.dispose();} });
Explicación del código (1)
import java.text.*; // Este paquete tiene parte de las clases para formato de fecha y hora
import java.util.*; // Este paquete contien también clases para formato de fecha y hora
import java.awt.*; // Paquete con clases para el manejo de entorno gráfico
import java.awt.event.*; // Paquete con clases para el manejo y gestión de eventos
import javax.swing.*; //Java Swing contiene clases que permiten manejar entorno gráfico y eventos
JTextArea texto1 = new JTextArea(400,200); /* JTextArea es una clase que permite definir y
manejar áreas de texto, en esta aplicación crea un área de texto de 400 x 200 pixeles, en ésta área de texto no
se puede escribir o editar texto desde el teclado, sin embargo si puede imprimirse texto desde el programa.
También permite colocar un panel con barras de desplazamiento */
texto1.setEditable(false); // Elimina la posibilidad de escribir texto desde el teclado en el área de texto
texto1.append("\n\n\n\n\n\n\n\n\t\tEste texto se escribe en la ventana\n\n\n"); /* Se le añade texto al área
de texto para imprimirlo posteriormente */
ventana.add(texto1); // Se inserta el área de texto en la ventana
barra = new JScrollPane(texto1); /* Se crea el objeto barra para aplicar las barras de
desplazamiento (horizontal y vertical) ,dentro de la ventana */
ventana.getContentPane().add(barra, BorderLayout.CENTER); /* Se añaden las barras de
desplazamiento a la ventana, se define una malla (Layout) en la ventana para colocarlas y se colocan en la
parte central de la ventana para lo cual se usa la opción BorderLayout.CENTER */
boton1 = new JButton("Este boton aparece arriba y permite cerrar la ventana"); // Crea el objeto boton1
ventana.add(boton1, BorderLayout.NORTH); /* Coloca el objeto boton1 en la parte superior de la
ventana, el botón se mostrará a todo lo ancho de la ventana de acuerdo al tamaño que ésta tenga. Para
colocar el botón en la parte superior se usa la opción BorderLayout.CENTER */
boton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ventana.dispose();} }); /* Se anida la clase ActionListener dentro del método main(), esto se hace
para aplicar el método actionPerformed en el cual se definen las acciones que se deben llevar a cabo, cuando
se genera un evento sobre un determinado objeto, en este caso en particular se define la acción de cerrar la
ventana actual, al momento de hacer clic en el botón definido (boton1). Las clases anidadas son permitidas por
el lenguaje Java . Recordemos que el campo de acción de una clase anidada se limita a la clase que la
contiene. Esto es, si la clase B se define dentro de la clase A, entonces B es conocida dentro de A, pero no
fuera de A. Una clase anidada tiene acceso a los miembros, incluyendo miembros privados, de la clase en la
que está anidada. Sin embargo, la clase que la contiene no tiene acceso a los miembros de la clase anidada */
Explicación del código (3)
Date hoy = new Date(); // Define un objeto llamando a la clase Date para mostrar la fecha
String patron = "EEEE dd-MMM-yyyy, HH:mm:ss"; // Define el patrón para mostrar la fecha
SimpleDateFormat formato = new SimpleDateFormat(patron); // Define el formato a partir del patrón
String salida = formato.format(hoy); /* A través del objeto formato, guarda la fecha actual en una
variable de tipo cadena para imprimirla en la ventana */
Label mensaje=new Label("Esto aparece en la barra de estado: "+salida); /* Crea una etiqueta para
imprimir un mensaje y la fecha y hora en el formato especificado /*
ventana.add(mensaje, BorderLayout.SOUTH); /* Añade el mensaje en la parte inferior de la
ventana. Para colocar el mensaje en la parte inferior se usa la opción BorderLayout.SOUTH */
ventana.setExtendedState(NORMAL); /* Expande la ventana para mostrarla en el tamaño en el cual fue
definida, al crear la ventana se definió como ICONIFIED, por lo cual se mantuvo minimizada hasta que esta
parte del código la maximiza a su tamaño normal y permite mostrar el botón, el panel con las barras de
desplazamiento, el área de texto y la etiqueta con los mensajes */
// se agrega un verificador para que cierre la ventana con la |x| de la esquina superior derecha
ventana.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);} });
} // termina main
} // termina clase
Finalmente el siguiente programa crea un menú de opciones para una
aplicación de operaciones con matrices, las opciones del menú principal y
de los submenús son:
Datos
Leer
Sumar
Multiplicar
Transponer
Salir
Archivo
Grabar
Lectura
Capturar
Mostrar
Ayuda
Indice
import java.awt.*; archivo.add(capturar); LOSE);
import java.awt.event.*; archivo.add(mostrar); Date hoy = new Date();
import java.util.*; ayuda.add(indice); String patron = "EEEE dd-MMM-yyyy, HH:mm:ss";
import java.text.*; barraMenu.add(datos); SimpleDateFormat formato = new
import javax.swing.*; barraMenu.add(archivo); SimpleDateFormat(patron);
barraMenu.setHelpMenu(ayuda); String salida = formato.format(hoy);
public class EjemploVentana2 extends JFrame { setMenuBar(barraMenu); Label mensaje=new Label("Selecciona una opción.
pack(); "+salida);
MenuItem leer = new MenuItem("Leer", new show(); ventana.setLayout(new BorderLayout());
MenuShortcut('L')); repaint(); ventana.add(mensaje, BorderLayout.SOUTH);
MenuItem sumar = new MenuItem("Sumar", new addWindowListener(new AplicacionVentana2 ()); } } // termina main
MenuShortcut('O')); void acciones() { } // Fin de la clase.
MenuItem restar = new MenuItem("Restar", new leer.addActionListener(new AplicacionVentana2());
MenuShortcut('C')); sumar.addActionListener(new AplicacionVentana2 // Archivo de librería con actionPerformed
MenuItem multiplicar = new MenuItem("Multiplicar", ()); import java.awt.*;
new MenuShortcut('B')); restar.addActionListener(new AplicacionVentana2 import java.awt.event.*;
MenuItem transponer = new MenuItem("Transponer", ()); import javax.swing.*;
new MenuShortcut('T')); multiplicar.addActionListener(new public class AplicacionVentana2 implements
MenuItem salir = new MenuItem("Salir", new AplicacionVentana2 ()); ActionListener, WindowListener {
MenuShortcut('S')); transponer.addActionListener(new
MenuItem grabar = new MenuItem("Grabar"); AplicacionVentana2 ()); public void actionPerformed (ActionEvent e) {
MenuItem lectura = new MenuItem("Lectura"); salir.addActionListener(new AplicacionVentana2 ()); if (e.getActionCommand().compareTo("Salir")==0)
MenuItem capturar = new MenuItem("Capturar"); grabar.addActionListener(new AplicacionVentana2 System.exit(0);
MenuItem mostrar = new MenuItem("Mostrar"); ()); if (e.getActionCommand().compareTo("Indice")==0)
MenuItem indice = new MenuItem("Indice"); lectura.addActionListener(new AplicacionVentana2 {
Menu datos = new Menu("Datos"); ()); JOptionPane.showMessageDialog(null,"Programa
Menu archivo = new Menu("Archivo"); capturar.addActionListener(new AplicacionVentana2 hecho por: Aquí ponga su
Menu ayuda = new Menu("Ayuda"); ()); Nombre.",null,JOptionPane.INFORMATION_MESSAG
MenuBar barraMenu = new MenuBar(); mostrar.addActionListener(new AplicacionVentana2 E); }
()); }
public EjemploVentana2 () { ayuda.addActionListener(new AplicacionVentana2
acciones(); ()); } public void windowClosing(WindowEvent we) {
datos.add(leer); System.exit(0); }
datos.add(sumar); public static void main(String args[]) { public void windowIconified(WindowEvent we) { }
datos.add(restar); EjemploVentana2 ventana = new EjemploVentana2 (); public void windowOpened(WindowEvent we) { }
datos.add(multiplicar); ventana.setTitle("Ejemplo de un Frame o Ventana"); public void windowClosed(WindowEvent we) { }
datos.add(transponer); ventana.setBackground(java.awt.Color.white); public void windowDeiconified(WindowEvent we) {
datos.addSeparator(); ventana.setExtendedState(NORMAL); }
datos.add(salir); ventana.setSize(600,400); public void windowActivated(WindowEvent we) { }
archivo.add(grabar); ventana.setVisible(true); public void windowDeactivated(WindowEvent we) {
archivo.add(lectura); }
archivo.addSeparator(); ventana.setDefaultCloseOperation(JFrame.EXIT_ON_C } // Fin de la clase