Documente Academic
Documente Profesional
Documente Cultură
AUTNOMA DE PUEBLA
FACULTAD DE CIENCIAS DE LA
COMPUTACIN
Programacin en
JAVA++
CAPTULO I
JAVA
1.1 QU ES JAVA?
Como
Java
El
JAVA VS C++
1.3. JAVA ES
INDEPENDIENTE
DELAPLATAFORMA
La independencia de la plataforma es la
capacidad del programa de trasladarse
con
facilidad
de
un
sistema
computacional a otro.
Esta independencia de la plataforma es
una de las principales ventajas que tiene
Java sobre otros lenguajes de
programacin, en particular para los
sistemas que necesitan trabajar en
varias plataformas.
Interprete
Java
Compilador
Java
Cdigo de
Java
Pentium
Bytecode
de Java
PowerPC
SPARC
El
Al
Principios de animacin
Los grficos animados son una reciente
adicin al rico contenido de multimedia
que est disponible en World Wide Web.
La creacin de animaciones efectivas
dentro de las limitaciones del entorno
Web puede ser una tarea agotadora para
el diseador Web.
Animacin en Web
World Wide Web fue desarrollada a
principios de los 90 por Tim BernesLee. Inicialmente fue creada como una
forma de manejar
documentos de
hipertexto en redes clientes servidor
basadas en TCP/IP, por documentos
desplegados por software de cliente
denominador navegador.
Transferencia
sincronizada
reproduccin
Formatos en la animacin
Otro problema con la animacin Web es
que cuando le ha llegado al usuario,
ste debe tener la aplicacin auxiliar o
plug-in apropiados para desplegar la
animacin.
Actualmente
existen
muchos formatos de animacin para
Web, con diferentes capacidades y usos.
CAPTULO II
LENGUAJE JAVA
2.1 INSTRUCCIONES Y
EXPRESIONES
Algunas veces,
las instrucciones
regresan valores. Por ejemplo, cuando
sumamos dos valores o una prueba
para ver si un valor es igual al otro.
Este tipo de enunciados se llaman
expresiones.
Una instruccin puede ser escrita en un
solo rengln o en mltiples renglones
y el compilador Java lo entender
perfectamente.
2.2 LA DECLARACIN
IMPORT (IMPORTAR)
import java.awt.Graphics;
import java.awt.Color;
La segunda forma de la declaracin
import logra que todas las clases de un
paquete estn disponibles mediante su
nombre de clase. Por ejemplo:
import java.awt.*;
Los
2.4.1 DECLARACION DE
VARIABLES
2.4.2 TIPOS DE
VARIABLES
Enteros
Existen cuatro tipos de enteros Java,
cada uno con un rango diferente de
valores, todos tienen signo.
Tipo Tamao
byte
8 bits
short 16 bits
int
long
Rango
-128 a 127
-32, 768 a 32, 767
32 bits
64 bits
-9,223,372,036,854,775,808 a
9,223,372,036,854,775,807
Punto flotante
Los tipos de punto flotante contienen
ms informacin que los tipos enteros.
Las variables de punto flotante son
nmeros fraccionarios. Existen dos
subtipos de punto flotante : float y
double.
Puede forzar el nmero al tipo float al
agregarle la letra f o F a ese nmero
( 2.56f).
Tipo
Double
Float
Rango
-1.7x10-308 a 1.7x10308
-3.4x10-38 a 3.4x1038
Booleanos
El tipo booleano tiene dos valores:
True
y False (verdadero y falso).
Carcter
El tipo carcter representa un carcter
con base en el conjunto de caracteres de
Unicode. Este tipo se define con la
palabra
clave
char.
El
valor
correspondiente a un tipo de carcter
debe estar encerrado entre comillas
sencillas (). Se representa con un cdigo
de 16 bits, permitiendo 65,536 caracteres
diferentes: una magnitud mayor que la
del conjunto de caracteres ASCII/ANSI.
Escape
/n
/t
/b
/r
/f
//
/
/
/ddd
/xdd
/udddd
Significado
Lnea nueva
Tabulador
Retroceso
Regreso de carro
Alimentacin de forma
Diagonal inversa
Comilla sencilla
Comilla doble
Octal
Hexadecimal
Carcter Unicode
Cadenas y arreglos
Con excepcin de los tipos entero, de
punto flotante, booleano y carcter, la
mayora de los tipos restantes en Java
es un objeto. En esta regla se incluyen
las cadenas y los arreglos, los cuales
pueden tener su propia clase.
Asignacin e inicializacin de
variables
Una vez que se ha declarado una
variable puede asignarle un valor
mediante el uso del operador de
asignacin =
Size =14;
tooMuchCaffiene = true;
int goo;
goo=100;
char coal;
Char
Else
break
byte
generic case
In
cast
Outer catch
Short class
throws cons
break
byte
case
cast
catch
class
cons
break
byte
case
cast
catch
class
cons
break
byte
case
cast
catch
class
cons
break
byte
case
cast
catch
class
cons
break
byte
case
cast
catch
class
cons
volatile
continue
continue
continue
continue
continue
continue
2.5 EXPRESIONES Y
OPERADORES
2.5.1 ARITMETICAS
Significado
Ejemplo
+
*
/
%
Suma
Resta
Multiplicacin
Divisin
Mdulo
3+4
57
5*5
14 / 7
20 % 7
class Class1 {
public static void main (String args[ ])
{
short x = 6;
int y = 4;
float a = 12.5f;
float b = 7f;
El resultado que
siguiente listado es:
x es 6, y es 4
x + y = 10
x-y=2
x/y=1
x%y=2
a es 12.5, b es 7
a / b = 1.78571
obtendr
del
System.out.println("1.2345 * 2 = " +
(1.2345 * 2 ) );
System.out.println(" 15 / 3 = " + (15 /
3 ));
}
}
class Class1 {
public static void main (String args[ ])
{
int result;
result = 2000000 * 3000000;
System.out.println(" 200 * 300 = " +
result);
}
}
Asignacin
La asignacin de variables es una
forma de expresin; de hecho, puesto
que una asignacin resulta de un valor,
se pueden encadenar de la siguiente
manera:
x = y = z = 0;
En este ejemplo, ahora las tres
variables tienen el valor de 0.
Expresin
Significado
X+=Y
X-=Y
X*=Y
X/=Y
X=X+Y
X=X-Y
X=X*Y
X=X/Y
2.5.2 INCREMENTOS
Y
DECREMENTOS
Expresin
Y = X++
Y = ++X
Z=X++ +Y
Z=X + --Y
Significado
Y=X
X=X+1
X=X+1
Y=X
Z = X +Y
X=X+1
Y = Y-1
Z=X+Y
1. current_count = count++;
La instruccin de asignacin indica a
Java que asigne el valor actual de
count a la variable current_count.
Adems el operador de incremento
sufijo le dice que aumente l valor
actual de count.
de
de
2. current_count = ++count;
Esta instruccin indica a Java que
primero incremente el valor de count y
luego asigne el resultado a la variable
current_count. Al usar el operador de
incremento prefijo, se logra que la
instruccin anterior sea equivalente a
las dos instrucciones siguientes:
count = count+1;
current_count = count;
int small_count = 0;
int big_count = 1000;
int small_count = 0;
int big_count = 1000;
2.5.3 COMPARACIONES
Operador
==
!=
<
>
<=
>=
Significado
Igual
Diferente
Menor que
Mayor que
Menor o igual que
Mayor o igual que
2.5.4 OPERADORES
LGICOS
Operador Significado
Forma
&
AND
&&
AND
lgico.
OR
||
OR
lgico.
XOR
lgico.
NOT
class Class1 {
public static void main (String args[ ])
{
boolean usuario_dueo_de_perro
= true;
boolean usuario_dueo_de_gato
= true;
if (usuario_dueo_de_perro)
System.out.println("Los
perros
son grandiosos");
if (usuario_dueo_de_gato)
System.out.println ("Los gatos
son grandiosos");
if
((usuario_dueo_de_perro) &&
(usuario_dueo_de_gato))
System.out.println ("Los
perros y gatos son grandiosos");
if
((usuario_dueo_de_perro) ||
(usuario_dueo_de_gato))
System.out.println ("Las
mascotas son grandiosas");
}
}
Se
emplean
para
desempear
operaciones de bits en Java, los puede
observar en la tabla siguiente:
Operador
&
|
^
<<
>>
>>>
Significado
AND de bits
OR de bits
XOR de bits
Desplazamiento a la izquierda
Desplazamiento a la derecha
Llenado de ceros a la derecha
Operador Significado
~
Complemento de bits
<<=
Asignacin de desplazamiento
izquierda (X = X<<Y)
a la
>>=
>>>=
X&=Y
X|=Y
X^=Y
System.out.println("OR
inclusivo
lgico booleano
(|)" );
System.out.println ("F | F: " + (false |
false));
System.out.println ("F | T: " + (false |
true));
System.out.println ("T | F: " + (true |
false));
System.out.println ("T | T: " + (true |
true));
System.out.println
("OR exclusivo
lgico
booleano
(^)");
System.out.println ("F ^ F: " + (false
^ false));
System.out.println ("F ^ T: " + (false
^ true) );
System.out.println ("T ^ F: " + (true ^
false));
System.out.println ("T ^ T: " + (true ^
true));
2.5.6
PRECEDENCIA DE
OPERADORES
Operador
.[]()
Notas
Expresiones de grupo entres parntesis
( ); punto(.) se utilizan para el acceso a
mtodos y a variables dentro de los
objetos y clases; [] se usa para arreglos.
2.5.7
ARITMTICA
DE CADENAS
2.6
REFERENCIAS
EN JAVA
class MyProgram {
class Point {
int m_x;
int m_y;
public Point ( ){
this (0,0);
}
public Point ( int x, int y){
int m_x;
int m_y;
}
}
void testblock ( ) {
int x = 10;
{
// start of block
int y = 50;
System.out.println (inserta el
bloque :);
System.out.println (x: + x );
System.out.println (y: + y);
} // end of block
}
2.7.1 CONDICIONALES if
class Class1 {
public static void main (String args[ ])
{
int TestScore = 95;
if (TestScore >= 90)
System.out.println("Felicidades
obtuviste una A");
}
}
class Class1 {
public static void main (String args[ ])
{
int TestScore = 95;
if (TestScore >= 90){
System.out.println ("Felicidades
obtuviste una A");
System.out.println ("Tu puntuacin
es" + TestScore);
}
else
{
System.out.println
("Deberas
estudiar mas");
System.out.println ("Perdiste de tu
puntuacin" + (TestScore - 10) );
}
}
}
// fase de inicializacin
total = 0;
counter = 1;
//fase de procesamiento
while (counter <= 10 ) {
System.out.print ("Teclee calificacin
de letra: " );
System.out.flush ( );
grade = System.in.read ( );
if (grade == 'A' )
total = total + 4;
else if (grade == 'B' )
total = total + 3;
else if (grade == 'C' )
total = total + 2;
else if (grade == 'D' )
total = total + 1;
else if (grade == 'F' )
total = total + 0;
System.in.skip ( 2 );
//Saltar el
carcter de nueva
lnea
counter = counter + 1;
}
//fase de terminacin
average = total / 10; //divisin entera
System.out.println ("El promedio del
grupo es " + average);
}
}
El operador condicional
Una alternativa para utilizar las
palabras claves if y else en un
enunciado condicional es usar el
operador condicional
tambin
conocido como el operador ternario.
El operador condicional es ms til
para condicionales cortos o sencillos,
y tiene esta apariencia:
test ? trueresult : falseresult
default: defaultresult;
}
switch (x){
case 2:
case 4:
case 6:
case 8:
system.out.println(x es un nmero
par.);
break;
default: system.out.println(x es
cualquier nmero.);
}
Ejemplos:
System.out.print("" + count);
}
}
count+
System.out.println(""+ letter );
for (value = 0; value
value += 0.1, x +=20)
System.out.println(""+ value);
}
}
<1.0;
Ciclos while
Se utilizan para repetir un enunciado
o bloque de enunciados, siempre que
una condicin en particular sea
verdadera. Los ciclos while tienen
esta apariencia:
while (condition) {
bodyOfLoop
}
do{
bodyOfLoop
} while (condition);
if (result =='1' )
passes = passes +1;
else
failures = failures + 1;
student = student + 1;
System.in.skip (2);
}
// fase de inicializacin
total = 0;
counter = 0;
//fase de procesamiento
System.out.print (Teclee
calificacin de letra, Z para
terminar: );
System.out.flush ( );
grade = System.in.read ( );
while (grade != 10 ) {
if (grade == A )
total = total + 4;
else if (grade == B )
total = total + 3;
else if (grade == C )
total = total + 2;
else if (grade == D )
total = total + 1;
else if (grade == F )
total = total + 0;
System.in.skip ( 1 );
//Saltar el
carcter de nueva
lnea
counter = counter + 1;
System.out.print(Teclee
calificacin de letra, Z para terminar:
);
System.out.flush( );
grade = System.in.read ( );
}
//fase de terminacin
if (counter != 0 ) {
average = (double) total / counter;
System.out.println (El promedio del
grupo es + average);
}
else
System.out.println( No se
introducieron calificaciones );
}
}
if (count ==5)
break;
// Romper el ciclo
slo si count ==5
System.out.println(Integer.toString
(count ));
}
System.out.print ("Me sal del ciclo
con count = " + count);
}
if ( count ==5 )
continue; //saltarse el resto del
cdigo slo si count==5
System.out.println(Integer.toString (
count ));
}
System.out.println("Us
continue
para no I mprimir 5");
}
}
2.7.5
EXCEPCIONES
try-catch-throw
try {
// Normalmente este cdigo corre
desde arriba del bloque hasta
// el final sin problemas. Pero
algunas veces puede ocasionar
// excepciones o salir del bloque con
una sentencia break,
// continue, o return.
sentencias;
} catch( AlgunaException e1 ) {
// El manejo de un objeto de
excepcion el de tipo AlgunaExcepcion
// o de una subclase de ese tipo.
sentencias;
catch( OtraException e2 ) {
// El manejo de un objeto de
excepcin e2 de tipo OtraExcepcion
// o de una subclase de ese tipo.
}
try (tratar)
La clusula try simplemente establece
un bloque de cdigo que habr de
manejar todas las excepciones y
salidas anormales(va break, continue
o propagacin de excepcin). La
clsula try, por s misma, no hace nada
interesante.
catch (atrapar)
Un bloque try puede ir seguido de cero
o ms clusulas catch, las cuales
especifican el cdigo que manejar los
distintos tipos de excepciones. Las
clusulas catch tienen una sintaxis
inusual: cada una se declara con un
argumento, parecido a un argumento de
mtodo. Este argumento debe ser del
tipo Throwable o una subclase.
2.7.6
CONTROL GENERAL
DEL FLUJO
break [etiqueta]
continue [etiqueta]
return expr;
etiqueta: sentencia;
En caso de que nos encontremos con
bucles anidados, se permite el uso de
etiquetas para poder salirse de ellos, por
ejemplo:
uno: for( )
{ dos: for( )
{
continue;
// seguira
en el bucle interno
continue uno;
//
seguira en el bucle principal
break uno;
// se
saldra del bucle principal
}
}
int func()
{
if ( a == 0 )
return 1;
return 0;
// es imprescindible
porque se retorna un
entero
CAPTULO III
APPLETS DE JAVA
3.1 APPLETS Y
APLICACIONES
import java.awt.Graphics;
public class
HelloWorldApplet
extends java.applet.Applet {
public void paint (Graphics g) {
g. drawString (Hola
mundo, 5, 25);
}
}
import java.awt.Graphics;
import java.applet.*;
public class
extends Applet {
HelloWorldApplet
Caractersticas
importantes
mencionar sobre las applets:
que
El
<HTLM>
<HEAD>
<TITLE>Hola a todos! </TITLE>
</HEAD><BODY>
<P> Mi applet de Java dice:
<APPLET
CODE=HelloWorldApplet.class
WIDTH=150
HEIGHT
=25><APPLET>
</BODY>
</HTLM>
Puede referirse a
un Applet en sus
archivos
HTLM
con
la
etiqueta
<APPLET>.
Utilice el atributo CODE para indicar
el nombre de la clase que contiene
su applet.
Emplee los atributos WIDTH y
HEIGHT para sealar el tamao del
applet. El visualizador utiliza estos
valores para saber que tanto espacio
dejar en la pgina para el applet.
Aqu se crea una cuadro de 150 pixeles
de ancho por 25 de alto.
Un
Start
Despus de que el
applet ejecuta la funcin init, este
llama la funcin especial start, cuyo
propsito es iniciar (start) el
procesamiento. En la mayor parte de
las applets, la funcin start crear uno
o ms threads de ejecucin, que a su
vez ejecutar el procesamiento del
applet. Las instrucciones siguientes,
muestran y ejecutan un ejemplo de la
funcin start, que crea y ejecuta un
thread (proceso):
Stop
Dependiendo del explorador
y del propsito de la pgina Web que
contiene el applet, habr ocaciones en
que el explorador detendr el applet si
el usuario cambia el foco activado de
la vista. Luego cuando regrese el foco
activo a la vista, el explorador
reiniciar la ejecucin del applet. Para
iniciar y detener el applet de esta
manera, el explorador utiliza las
funciones start y stop.
Paint
Cada vez que el explorador
necesita actualizar la ventana del
applet, ste llama la funcin paint. Por
ejemplo, cuando el explorador presenta
por primera vez el applet, ste
automticamente llama la funcin
paint. Lo mismo ocurre cuando el
usuario cambia el tamao o mueve la
ventana
Ejemplo:
public void paint (graphics g);
{
g.drawstring (hola, 5, 15);
}
Dentro de la funcin paint, el applet
debe
dibujar
cada
elemento
previamente escrito en la ventana.
Suponga que se dibuja un rectngulo y
el usuario minimiza la ventana.
Dependiendo
del
tipo
de
procesamiento que realice el applet, en
algunos ocasiones ser necesario
actualizar el contenido de la ventana.
En esos casos se llama la funcin
repaint que, a su vez, llama la funcin
paint.
Destroy Lafuncin
init
puede
inicializar las variables importantes;
con la funcin destroy se eliminan los
objetos al finalizar el applet. Por
ejemplo, puede utilizarse la funcin
destroy para liberar la memoria
reservada para guardar un arreglo:
public void destroy ( )
{
// sentencias
}
1)
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public
class
HelloAgainApplet
extends java.applet. Applet{
Font f= new Font ("TimesRoman",
Font.BOLD, 36);
int result;
result = 2000000 *
3000000;
g.drawString("200 * 300 =
" + result, 5 , 25);
}
}
6)
import java.awt.*;
import java.applet.*;
public class PrefijoSufijo extends
Applet
{
public void paint (Graphics g)
{
int small_count = 0;
int big_count = 1000;
g.drawString ("small_count is " +
small_count, 5, 10);
g.drawString ("small_count is " +
small_count++, 5, 25);
g.drawString ("El valor final de
samall_count es " +
small_count, 5, 40);
boolean usuario_dueo_de_gato =
true;
if (usuario_dueo_de_perro)
g.drawString ("Los perros
son grandiosos", 5 ,15);
if (usuario_dueo_de_gato)
g.drawString ("Los gatos son
grandiosos", 5 ,30);
if ((usuario_dueo_de_perro) &&
(usuario_dueo_de_gato))
g.drawString ("Los perros y gatos
if
((usuario_dueo_de_perro) ||
(usuario_dueo
_de_gato))
g.drawString ("Las mascotas
son
grandiosas", 5 ,60);
}
}
8)
import java.awt.Graphics;
import java.applet.Applet;
public
class
OperadoresLgicos
Class1 extends Applet {
public void paint (Graphics g)
{
9)
import java.awt.*;
import java.applet.*;
public class VariableCount extends
Applet
{
public void paint (Graphics g)
{
int count ;
int end_count = 10;
for (count = 1; count
<=end_count ; count++)
g.drawString("" + count, count *10,
25);
}
}
a= p(1 + r)2
donde
p es la cantidad original invertida
r es la tasa de inters anual
n es el nmero de aos
a es la cantidad del depsito de n-simo
ao.
CAPTULO IV
JAVA Y LA
PROGRAMACION
ORIENTADA A OBJETOS
4.1 LA TERMINOLOGIA
DE LA OOP
4.1.1
OBJETOS
Variables
Limpiarse
Permanecer
echado
4.1.2
CLASES
El concepto ms importante de la
OOP es la clase. Las clases pueden
compararse como anteproyectos de
un edificio, pero no con el edificio en
s. Las clases son los anteproyectos de
los objetos.
En otras palabras, una clase es un
prototipo que define los mtodos y
datos que sern incluidos en un tipo
de objeto particular.
Concreto
rbol
Clase rbol
(genrico)
rbol
Atributos (datos)
Los atributos son las caractersticas
individuales que diferencian a un
objeto de otro, y determinan la
apariencia, estado u otra cualidades de
ese objeto. Puesto que crearemos una
clase terica llamada Motorcycle,
entre sus atributos podemos describir
los siguientes:
Comportamiento (Mtodos)
El comportamiento de clase determina
que instancias de esa clase requieren
cambiar su estado interno, o cuando esa
instancia es llamada para realizar algo
por otra clase u objeto.
El comportamiento es la nica manera
de que los objetos, puedan hacerse algo a
si mismos o tener que hacerles algo. Por
ejemplo, en la clase Motorcycle podemos
encontrar algunos comportamientos:
Arrancar la mquina.
Detener la mquina.
Acelerar.
Cambiar de velocidades.
Frenar.
4.1.4
CREACION DE
OBJETOS Y
CLASES.
return count;
Ejemplo 1:
import java.awt.*;
import java.applet.*;
public class Class1 extends Applet {
public class Counter
{ int count;
void SetValue ( int value)
{
count = value; }
int GetValue ( )
{
return count; }
}
Ejemplo2:
Se toma la clase Date, la cual crea un
objeto de fecha.
import java.util.Date;
import java.awt.Graphics;
import java.applet.Applet;
public class Class1 extends Applet {
Date system, user;
public void init()
{
+system.toString(),25,25);
g.drawString("Fecha del
usuario: "
+user.toString(),25,40);
}
}
Class_name object
(value,value2,value3);
Clases abstractas
Una de las caractersticas ms tiles de
cualquier lenguaje orientado a objetos es
la posibilidad de declarar clases que
definen como se utiliza solamente, sin
tener que implementar mtodos.
Esto es muy til cuando la
implementacin es especfica para cada
usuario, pero todos los usuarios tienen
que utilizar los mismos mtodos. Un
ejemplo de clase abstracta en Java es la
clase Graphics:
myObject .var;
Referencias a objetos
Al trabajar con objetos se hace uso
de las referencias a dichos objetos.
Cuando asigna objetos a las variables,
o los pasa a los mtodos como
argumentos, usted traslada referencias
a ellos , no los objetos mismos o las
copias de sos.
import java.awt.Point;
class ReferencesTest {
public static void main (String args[]){
point pt1,pt2;
pt1 = new Point(100, 100);
pt2 = pt1;
pt1.x = 200;
pt1.y = 200;
system.out.printl(Point1: + pt1.x + ,
+ pt1.y);
system.out.printl(Point2: + pt2.x + ,
+ pt2.y);
}
}
Objeto punto
x:200
y:200
4.2
LAS
CARACTERISTICAS
DE LA OOP
(ENCAPSULAMIENTO,
POLIMORFISMO,
HERENCIA,
VINCULACION
DINAMICA)
Existen
principales:
cuatro
caractersticas
Encapsulamiento
Polimorfismo
Herencia
Vinculacin dinmica
4.2.1
ENCAPSULAMIENTO
Para
darse
una
idea
del
encapsulamiento, imagine que tiene
problemas con su automvil, falla el
filtro del aceite y olvid remplazarlo. Al
paso del tiempo el aceite se ensucia
mucho ms, esto a su vez puede dar
lugar a otros problemas con el motor. El
motor
del
automvil
no
esta
encapsulado, es decir, el aceite no est
oculto o protegido del motor.
En programacin, el encapsulamiento
permite construir subsistemas (como un
motor virtual) que no pueden ser
manipulados o corrompidos por otros
subsistemas, a menos que se le otorgue
un permiso especial. Un error en alguno
no corromper a otro.
Cuando se crea una nueva clase en Java,
se puede especificar el nivel de acceso
que se quiere para las variables de
instancia y los mtodos definidos en la
clase:
public
Public void
CualquieraPuedeAcceder(){}
Cualquier clase desde cualquier lugar
puede acceder a las variables y
mtodos de instacia pblicos.
Ejemplo:
import java.awt.*;
import java.applet.*;
public class Class1 extends Applet
{
class PublicExample {
public int variable;
int funtion()
{return (1);}
}
}
Class2:
import java.awt.*;
public class Class2
{
public void paint(Graphics g)
{
Class1 objeto= new Class1();
objeto.variable=3; //Es posible
acceder
private
private String
NumeroDelCarnetDeIdentidad;
Las variables y mtodos de instancia
privados slo pueden ser accedidos
desde dentro de la clase. No son
accesibles desde las subclases.
Class1:
import java.awt.*;
import java.applet.*;
public class Class1 extends Applet
{
Class2:
import java.awt.*;
public class Class2
{
public void paint(Graphics g)
{
Class1 objeto= new Class1();
objeto.variable=3; //No es posible
acceder
g.drawString("El valor de la funcin es: "
+ objeto.funtion(),5,30);
g.drawString("El valor de la funcin es: "
+ objeto.variable,5,30); }
acceso
al
protected
protected void SoloSubClases(){}
Slo las subclases de la clase y nadie
ms puede acceder a las variables y
mtodos de instancia protegidos.
4.2.2
POLIMORFISMO
El polimorfismo se refiere a la
naturaleza de los objetos. Los
mensajes enviados de un objeto a otro
dan por resultado un comportamiento
distinto entre los diversos objetos. El
comportamiento es dependiente de la
naturaleza del objeto dado. Este
polimorfismo contribuye a que los
objetos de la OOP sean reutilizables.
4.2.3
HERENCIA
Reutilizacin
Reutilizacin es una palabra que se
escucha a menudo en el mundo de la
programacin orientada a objetos. Se
refiere a tomar una clase e instanciarla
directamente en sus programas o bien
utilizarla como una base nueva clase
que herede algunas de o todas sus
caractersticas. Derivando de una clase
de una clase base, usted efectivamente
reutiliza el cdigo de la clase de base
para satisfacer sus necesidades.
La herencia es probablemente la
caracterstica que da mayor poder al
concepto de clase, ya que permite
construir
y
extender
clases
desarrolladas bsicamente sin lmite.
Partiendo de la clase ms simple, se
pueden derivar cada vez ms
complejas que no solo son fciles de
depurar, sino que tambin son
simples por s solas.
4.2.3.1
JERARQUA
DE CLASES
Clase A
Clase B
Clase C
Clase D
Clase E
jerarqua,
puede
descomponer
informacin comn para mltiples
clases en superclases, y despus
volver a utilizar esa informacin de
esa superclase otra vez. Cada
subclase obtendr esa informacin
comn de esa superclase.
Cambiar
Objeto
Vehculo
Vehculos movidos
por el hombre
Vehculos movidos
por motor
Vehculos movidos
por motor y de dos
ruedas
Motocicleta
Motoneta
Motocicleta con
pedales
4.2.3.2 FUNCIONAMIENTO
DE LA HERENCIA
Clase
Clase
Clase
Clase
Clase
Objeto
El mensaje se enva al
objeto y se transmite
a las clases superiores
de la jerarqua hasta
encontrar
una
definicin
Objeto
Clase
El mtodo es
sobrepuesto
mediante esta
definicin
Clase
El mensaje se enva al
objeto y se transmite a
las clases superiores de
la
jerarqua
hasta
encontrar una definicin
Clase
Clase
Objeto
Objeto
import java.awt.*;
import java.applet.*;
public class OverloadAddvalues
extends Applet
{
int AddValues ( int a, int b)
{
return (a + b);
}
int AddValues ( int a, int b, int c)
{
return (a + b + c);
}
import java.awt.*;
import java.applet.*;
public class
OverloadShowMessage extends
Applet
{
int ShowMessage (Graphics g ,
String Message)
{
g.drawString (Message , 5 ,
15);
}
4.3 EJEMPLOS
19:
20: //obtener la coordenada en y
21: public double getY() {return
y;}
22:
23: //convertir el punto en una
representacin String
24: public String toString()
25:
{return "[" + x "," + y
+"]";}
26: }
27:
28: //definicin de la clase Circle
29:
30: public class Circle extends
Point {
31: protected double radius;
32:
33: //constructor sin argumentos
34: public Circle()
35: {
36:
super(0,0);
37:
setRadius(0);
38: }
39:
40: //constructor
41: public Circle (double r, double
a, double b)
42: {
43:
super (a,b);
44:
setRaduis(r);
45: }
46:
47: //establecer el radio del circulo
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
import java.awt.Graphics;
import java.applet.Applet;
public class Test extends Applet{
private Point pointRef, p;
private Circle circleRef, c;
public void init()
{
p= new Point (3.5, 5.3);
c= new Circle (2.7,1.2,8.9);
77: }
78:
79: public void paint (Graphics g)
80: {
81:
g.drawString("Punto p: "+
p.toString(), 25,25);
82:
g.drawString("Circulo c: "
+ c.toString(),25,40);
83:
84:
85:
pointRef=c;
86: g.drawString("Circulo c (va
por ref):" +
87:
pointRef.toString(),25,70);
88:
89: //tartar un Circle como un
Circle con algo de mutacin
90: pointRef=c;
91: circleRef=(Circle)
pointRef;
//mutar super a sub
92: g.drawString ("Circulo c (va
circleRef):" +
93: circleRef.toString(),25,100);
Ejemplo
de
constructores
finalizadores en subclases
3:
4:
5:
6:
7:
8:
9:
10.
11:
toString());
12: }
13:
14: //finalizador
15: public void finalize()
16: {
17: System.out.println("Finalizador
de Point: " +
18: toString());
19: }
20:
51: }
52:
53: //constructor
54: public Circle(double r, double
a, double b)
55: {
56: super(a,b);
57: setRadius(r);
58: System.out.println
("Constructor de Circle:" +
59:
toString());
60: }
61:
62:
63:
64:
65:
//finalizador
public void finalize ()
{
System.out.println
("Finalizador de circle: " +
66:
toString());
67: }
68:
69:
70: public void setRadius(double
r)
71: { radius = (r>=0 =? r:0);}
72:
73:
74: public double getRadius() {
return radius; }
75:
76:
77: puiblis doble ares()
78: { return 3.14159 * radius *
radius;}
79:
80:
81: public String toString()
82: {
83: return
"Centro=
"+
super.toString()+
84:
"; Radio= " + radius;
85: }
86: }
87:
88: //Demostracin de cundo se
invocan los constructores y
89: // finalizadores de la superclase y
la subclase.
90: import java.awt.Graphics;
7:
8:
//constructor
public Point(double a, double b){
setPoint(a,b);}
9:
10: //fijar las coordenadas x,y del
Point
11: public void setPoint(double a,
double b)
12: {
13:
x=a;
14:
y=b;
15: }
16:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12: }
13:
14: //constructor
15: public Circle (double r, double
a, double b)
16: {
17:
super (a,b);
18:
setRaduis(r);
19: }
20:
21: //fijar el radio del circle
22: public void setRadius(double r)
23: { radius = (r >= 0.0 ? r: 0.0);}
24:
25: //obtener el radio del Circle
26: public double getRaduis()
{return radius;}
27:
28: //calcular el rea del Circle
29: public double area
30: (){ return 3.14159*radius *
radius;}
31: {
32: //convertir el Circle en String
33: public String toString()
34: {
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
private Circle c;
public void init()
{
c=new Circle(2.5,3.7,4.3);
}
public void paint (Graphics g)
{
g.drawString("La
coordenada X es" +
c.getX(),25,25);
55:
56:
57:
58:
59:
60:
g.drawString("La
coordenada Y es" +
c.getY(),25,40);
g.drawString("El radio es"
+ c.getRadius(),25,55);
c.setRadius(4.25);
c.setPoint(2,2);
g.drawString("La nueva
posicin y el radio de c son
",25,85);
61:
62:
63:
64: }
65:}
g.drawString
(c.toString(),40,100);
g.drawString("El rea es"
+ c.area(),25,115);
1:
2: // Definicin de la clase Cylinder
3: public class Cylinder extends
Circle {
4: protected double height;
5:
6: //El constructor Cylinder llama al
constructor Circle
7: public Cylinder (double h,double
r, double a, double b)
8: {
9:
super (r,a,b);
10:
setHeight(r);
11: }
12:
13: //establecer la altura de
Cylinder
14: public void setHeight(double h)
15: {height=(h>=0? h:0);}
16:
17: //obtener la altura de Cylinder
18: public double
getHeight()
{return height;}
19:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
g.drawString("La
coordenada X es" +
c.getX(),25,25);
g.drawString("La
coordenada Y es" +
c.getY(),25,40);
g.drawString("El radio es"
+ c.getRadius(),25,55);
g.drawString("La
altura
es" + c.getHeight(),25,70);
c.setHeight(10);
c.setRadius(4.25);
58:
59:
60:
c.setPoint(2,2);
g.drawString("La nueva
posicin, el radio y la
altura" +
61:
" de c son",25,100);
62: g.drawString(c.toString(),
40,115);
63: g.drawString("El rea es" +
c.area(),25,130);
64:
g.drawString("El volmen es"
+ c.volume(),25,145);
65: }
66: }
4.4 INTERFACES
Y PAQUETES
Interfaces
Los mtodos abstractos son tiles
cuando
se
quiere
que
cada
implementacin de la clase parezca y
funcione igual, pero necesita que se
cree una nueva clase para utilizar los
mtodos abstractos. Las interfaces
proporcionan un mecanismo para
abstraer los mtodos a un nivel
superior.
Por ejemplo:
public interface VideoClip {
// comienza la reproduccin del
video
void play();
// reproduce el clip en un bucle
void bucle();
// detiene la reproduccion
void stop();
}
Implementacin
interfaces
uso
de
//java.applet.Applet es la superclase
public
class
Neko
extends
java.applet.Applet
implements Runnable{
.
}
interface Fruitlike{
void decay();
void squish();
...
}
class Fruit implements Fruitlike{
private Color myColor;
private int daysTillRot;
interface Spherelike{
void toss();
void rotate();
}
class
Orange
extends
Fruit
implements Spherelike{
//lanzarla
(toss
())
pudiera
aplastarme (squish ()) (nicamente a
mi)
}
class
Sphere
implements
Spherelike{ // extiende a Object
private float radius;
}
class Orange extends Sphere
implements Fruitlike {
.// los usuarios de Orange no
necesitan saber nunca del cambio.
public
class
Neko
extends
java.applet.Applet
implements
Runnable,
Eatable,Soportable,Observable{
}
Al implementar interfaces mltiples
puede haber complicaciones, como es
el caso de que dos interfaces definen
el mismo mtodo, para resolver este
problema se puede hacer:
}
}
}
}
Paquetes
Los paquetes en Java son una manera de
agrupar clases e interfaces relacionadas.
Permiten que grupos modulares de clases
estn disponibles slo cuando se
necesitan,
y
eliminan
conflictos
potenciales entre los nombres de clase, en
diferentes grupos de clase.
La palabra clave package permite
agrupar clases e interfaces. Los nombres
de los paquetes son palabras separadas
por puntos y se almacenan en directorios
que coinciden con esos nombres.
Import
Los paquetes de clases se cargan con la
palabra clave import, especificando el
nombre del paquete como ruta y nombre
de clase (es lo mismo que #include de
C/C++). Se pueden cargar varias clases
utilizando un asterisco.
import java.Date;
import java.awt.*;
Paquetes de Java
El lenguaje Java proporciona una serie
de paquetes que incluyen ventanas,
utilidades,
un
sistema
de
entrada/salida general, herramientas y
comunicaciones. En la versin actual
del JDK, los paquetes Java que se
incluyen son:
java.applet
Este paquete contiene clases diseadas
para usar con applets. Hay una clase
Applet y tres interfaces: AppletContext,
AppletStub y AudioClip.
java.awt
El paquete Abstract Windowing Toolkit
(awt) contiene clases para generar widgets
y componentes GUI (Interfaz Grfico de
Usuario). Incluye las clases Button,
Checkbox, Choice, Component, Graphics,
Menu, Panel, TextArea y TextField.
java.io
El paquete de entrada/salida contiene
las clases de acceso a ficheros:
FileInputStream y FileOutputStream.
java.lang
Este paquete incluye las clases del
lenguaje Java propiamente dicho:
Object, Thread, Exception, System,
Integer, Float, Math, String, etc.
java.net
Este paquete da soporte a las conexiones
del protocolo TCP/IP y, adems, incluye
las clases Socket, URL y
URLConnection.
java.util
Este paquete es una miscelnea de clases
tiles
para
muchas
cosas
en
programacin. Se incluyen, entre otras,
Date (fecha), Dictionary (diccionario),
Random (nmeros aleatorios) y Stack
(pila FIFO).
This y super
Al acceder a variables de instancia de
una clase, la palabra clave this hace
referencia a los miembros de la propia
clase. Puede aadir otro constructor de
la forma siguiente:
public class MiClase {
int i;
public MiClase() {
i = 10;
}
CAPITULO V
ARREGLOS CONDICIONALES
5.1 ARREGLOS
5.1.1 DECLARACIONES
DE VARIABLES DE
TIPO ARREGLO
String[] difficultWords;
Point[] hits;
int[] temps;
Estos dos mtodos son correctos, pero
con frecuencia el segundo es ms
legible.
Cmo crear objetos de arreglo
Usar new.
Inicializar de manera directa el
contenido de ese arreglo.
{jalapeo,
myArray [subscript];
myArray[subscript];
5.1.4
EJEMPLOS
import java.awt.Graphics;
import java.applet.Applet;
public class Class1 extends Applet
{
int n[ ];
public void init()
{
n=new int[10];
}
3)
import java.awt.Graphics;
import java.applet.Applet;
public class Class1 extends Applet
{
final int arraySize = 10;
int s[ ];
public void init ( )
{
s = new int [arraySize];
yPosition +=15;
g.drawString(String.valueOf(i),25,y
Position);
g.drawString(String.valueOf(s[i]),10
0,yPosition);
}
}
}
}
}
import java.awt.Graphics;
import java.applet.Applet;
public class Class1 extends Applet
{
int responses[] = {1,2,3,4,5,6,7,8,9,10,
1,6,3,8,6,10,3,8,2,7,
6,5,7,6,8,6,7,5,6,6,
5,6,7,5,6,4,8,6,8,10};
int frecuency[];
g.drawString("Calificacin",25,
yPosition);
g.drawString("Frecuencia",100,
yPosition);
for ( int rating = 1; rating < frecuency
.length; rating++) {
yPosition +=15;
g.drawString(String.valueOf( rating), 25,
yPosition);
g.drawString(String.valueOf(frecuency
[rating]),100, yPosition);
}
g.drawString("Valor",100,
yPosition);
g.drawString("Histograma",175,
yPosition);
for ( int i = 0; i< n.length; i++) {
yPosition +=15;
g.drawString(String.valueOf(i), 25,
yPosition);
g.drawString(String.valueOf(n[i]),1
00, yPosition);
xPosition = 175;
for (int j = 1;j <= n[i];j++){
g.drawString("*",xPosition , yPosition);
xPosition += 7;
}
}
}
}
import java.awt.Graphics;
import java.applet.Applet;
public class Class1 extends Applet
{ int a[] = { 0,1,2,3,4 };
public void paint (Graphics g)
{
int yPosition = 25,xPosition= 25;
g.drawString("Efectos de pasar todo
el arreglo por
referencia:",xPosition,yPosition);
yPosition += 15;
g.drawString("Los valores del arreglo
original son:",xPosition, yPosition);
yPosition += 15;
xPosition += 15;
for ( int i = 0; i< a.length; i++) {
g.drawString(String.valueOf(a[i]),
xPosition, yPosition);
xPosition +=15;
}
xPosition = 25;
yPosition += 30;
modifyArray (a);
g.drawString("Los valores del
arreglo modificado
son:",xPosition,
yPosition);
xPosition += 15;
yPosition += 15;
for ( int i = 0; i< a.length; i++) {
g.drawString(String.valueOf(a[i]),
xPosition, yPosition);
xPosition +=15;
}
xPosition = 25;
yPosition += 30;
g.drawString("Efectos de pasar un
elemento de un arreglo por
valor:",xPosition, yPosition);
yPosition += 15;
g.drawString( "a[3] antes de
modifyElement: " + a[3],xPosition,
yPosition);
yPosition += 15;
modifyElement(a[3]);
5.1.5 ARREGLOS
DIMENSIONALES
1)
int x=25;
for (int i = 0; i<= a.length;i++){
for (int j = 0; j< a[i].length;j++){
g.drawString(String.valueOf(a[i][j]),x,y);
x += 15;}
x= 25;
y+=15;
}
}
}
yPosition+=15;
g.drawString("Calificacin ms alta:",
xPosition, yPosition);
int max = maximum();
g.drawString(String.valueOf(max),
xPosition + 85, yPosition);
yPosition+=15;
for (int i = 0; i<=students;i++){
g.drawString("El promedio del
estudiante" +i+ "es",
25,yPosition);
double ave=average(grades[i]);
g.drawString(String.valueOf(ave),165,yPo
sition);
yPosition+=15;
}
}
public int minimum ()
{
int lowGrade= 100;
for (int i=0; i< students; i++)
if (grades[i][j]
<lowGrade)lowGrade=grades [i][j];
return lowGrade;
}
if (grades[i][j] >
highGrade)highGrade=grades [i][j];
return highGrade;
}
public double average (int
setOfGrades[])
{
int total=0;
for (int i = 0; i<
setOfGrades.lenght;i++)
total+= setOfGrades[i];
return (double) total/setOfGrades[i];
}
public void printArray ( Graphics g)
{
xPosition = 80;
for (int i = 0;
i<exams;i++){
g.drawString("[" + i
+"]",xPosition,yPosition);
xPosition += 30;}
for (int i = 0; i<students;i++){
xPosition = 25;
yPosition += 15;
g.drawString("Grades["+i+"]",xPosition,
yPosition);
xPosition = 80;
for (int j = 0; j<exams;j++){
g.drawString(String.valueOf(grades[i][j]),
xPosition,yPosition);
xPosition += 30;}
}
}
}
}
CAPTULO VI
GRFICOS Y FUENTES
DE COLOR
extends
6.1.1 EL SISTEMA DE
COORDENADAS
GRFICAS
0,0
+x
El sistema de coordenadas
grficas de Java
+y
6.1.2.1 LNEAS
Dibujo de lneas
6.1.2.2 RECTNGULOS
As quedan dibujados:
Los
rectngulos
redondeados
son
rectngulos con bordes redondos. Los
mtodos
drawRoundRect(
)
y
FillRoundRect( ) para dibujar rectngulos
redondeados, son similares a los rectngulos
ordinarios, pero con la diferencia de que
tienen dos argumentos extra para la anchura
y altura del ngulo de las esquinas. Estos dos
argumentos determinan que tan lejos de los
lmites del rectngulo empezar el arco para
la esquina; el primero para el ngulo en el
plano horizontal, el segundo para el plano
vertical.
Rectngulos
redondeados
import java.awt.Graphics;
import java.applet.Applet;
public class Class1 extends Applet{
public void paint(Graphics g) {
g.draw3DRect(20,20,60,60,true);
g.fill3DRect(120,20,60,60, false);
}
Rectngulos
tridimensionales
6.1.2.3 POLGONOS
=
=
import java.awt.Graphics;
import java.awt.Polygon;
public class MyPoly2 extends java.applet.
Applet{
public void paint(Graphics g) {
int exes[ ] = {39,94,97,142,53,58,26};
int whys[ ] = {33,74,36,70,108,80,106};
int pts = exes,length;
Polygon poly = new Polygon (exes,
whys,pts);
g.fillPolygon(poly);
}
}
import java.awt.Graphics;
public
class
MyPoly3
extends
java.applet. Applet{
public void paint(Graphics g) {
int exes[ ] = {39,94,97,142,53,58,26};
int whys[ ] = {33,74,36,70,108,80,106};
int pts = exes,length;
g.drawPolyline(exes,whys,pts);
}
}
6.1.2.4 VALOS
6.1.2.5 ARCOS
100
100
Construccin de un arco
circular
90o
90o
180o
90o
180
270o
Arco sobre
crculo
Dos arcos
circulares
140
30
Arcos sobre
elipses
90o
25o
90o
0o
-130o
Arcos sobre
elipses
270o
import java.awt.Graphics;
public class MyOval extends
java.applet.Applet{
public void paint(Graphics g) {
g.drawArc(10,20,150,50,25,130);
g.fillArcl(10,80,150,50,25,130);
}
}
import java.awt.Graphics;
import java.awt.Graphics;
public class ManyFonts extends
java.applet.Applet{
public void paint(Graphics g) {
Font
f
=
new
Font(TimesRoman, Font.PLAIN,
18);
Font fb = new Font(TimesRoman,
Font.BOLD, 18);
Font f i= new Font(TimesRoman,
Font.ITALIC, 18);
6.4 COLOR
Valor RGB
Color.white
255,255,255
Color.black
0,0,0
Color.lightGray
192,192,192
Color.gray
128,128,128
Color.darkGray
64,64,64
Color.red
255,0,0
Color.green
0,255,0
Color.blue
0,0,255
Color.yellow
255,255,0
Color.magenta
255,0,255
Color.cyan
0,255,255
Color.pink
255,175,175
Color.orange
255,200,0
1)
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.Color;
public class Class1 extends Applet{
private Color c;
public void init()
{
c=Color.blue;
}
""+
2)
import java.awt.Graphics;
import java.awt.Color;
import java.applet.Applet;
public class Class1 extends Applet
{
public void paint (Graphics g)
{
g.setColor(Color.pink);
g.fillOval(20,10,100,50);
g.setColor(Color.yellow);
g.fillOval(100,10,100,50);
g.setColor(Color.orange);
g.fillRect(190,10,80,50);
g.setXORMode(Color.yellow);
g.fillOval(180,25,60,20);
g.setColor(Color.blue);
g.fillArc(150,20,20,20,0,360);
g.setColor( Color.red);
g.fillRect(120,25,20,20);
}
}
3)
import java.awt.Graphics;
import java.applet.Applet;
CAPTULO VII
MULTIHILOS
7.1 INTRODUCCIN
7.2
MTODOS DE HILOS .
public Thread()
7.3
ESTADOS DE HILOS.
nacido
start
listo
Expiracin
de cuanto
notify
wait
despachar
En ejecucin
sleep
En espera
dormido
Expira intervalo
de sueo
stop
Completar
E/S
Solicitud
de E/S
suspend
suspendido
bloqueado
completar
resume
muerto
Hilos listos
Prioridad 10
Prioridad 9
Prioridad 8
C
D
Prioridad 7
G
Prioridad 6
H
Prioridad 5
Prioridad 4
Prioridad 3
Prioridad 2
Prioridad 1
Figura 7.4.1.
7.5
EJEMPLOS
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
thread3 = new
PrintThread("3");
thread4 = new
PrintThread("4");
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
21:
22:
23:
24:
25
26:
27:
28:
29:
30:
public
PrintThread
(String id)
{
super(id);
31:
sleepTime = (int)
(Math.random()*5000);
32:
33:System.out.println("Nombre:
"+ getName() + "; dormir: "
+ sleepTime);
34:
35:
}
36:
37:
38:
public void run()
39:
{
40:
41:
try {
42:
sleep(sleepTime);
43:
}
44: catch
(InterruptedException
exception) {
45: System.err.println("Excepcin:
" + exception.toString());
46:
47:
}
48:
49:
50:
System.out.println ("Hilo"
+getName());
51:
52: }
1:
2:
3:
4:
5:
6:
import java.awt.Graphics;
import java.awt.Font;
import java.util.Calendar;
import
java.util.GregorianCalendar;
public class Class1 extends
java.applet.Applet
implements Runnable{
7:
8:
9:Font theFont= new Font("TimesRoman",
Font.BOLD,24);
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
GregorianCalendar
theDate;
Thread runner;
public void start () {
if (runner == null){
runner=new Thread(this);
runner.start();
}
}
public void stop() {
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
if (runner !=null){
runner.stop();
runner=null;
}
}
public void run(){
while (true){
repaint();
try {Thread.sleep(1000); }
31:catch (InterruptedException e) {}
32:
}
33:
}
34:
35:public void paint(Graphics g ){
36:theDate= new
GregorianCalendar();
37: g.setFont(theFont);
38: g.drawString("" +
theDate.getTime(),10,50);
39:
}
40: }
7.6
SINCRONIZACIN
DE HILOS
Los
datos
compartidos
pueden
corromperse si no sincronizamos el
acceso entre mltiples hilos. Considere
una
relacin
productor/consumidor
sencilla en la que un hilo productor
deposita una secuencia de nmeros
(usaremos 0,1,2,...) en una ranura de
memoria compartida. El hilo consumidor
lee estos datos de la ranura de memoria
compartida y los imprime. Imprimiremos
lo que el productor produce en el
momento en que lo consume.
1: //Mostrar
mltiples
hilos
modificando un objeto compartido.
2:
3:
4: public class SharedCell {
5:
public static void main(
String args[] )
6:
{
7:
HoldInteger h = new
HoldInteger ();
8:
ProduceInteger p = new
ProduceInteger (h);
9:
ConsumeInteger c = new
ConsumeInteger (h);
10:
11:
p.start();
12:
c.start();
13:
}
14:}
15:
16: class ProduceInteger extends
Thread {
17: private HoldInteger pHold;
18:
19: public ProduceInteger (
HoldInteger h )
20: {
21:
pHold = h;
22: }
23:
24: public void run()
25: {
26:
for ( int count = 0; count <
10; count++ ) {
27:
pHold.setSharednt (
count );
28:
System.out.println( El
producto puso +
29: count en sharedInt );
30:
41:
42: class ConsumeInteger extends
Thread {
43:
private HoldInteger cHold;
44:
45:
public ConsumeInteger (
HoldInteger h )
46:
{
47:
cHold = h;
48: }
49:
50: public void run()
51: {
52:
int val;
53:
54:
val = cHold.getSharedInt();
55: System.out.println(El
consumidor recuper + val );
56:
57: while (val !=9) {
58: // dormir durante un intervalo
aleatorio
59: try {
60: sleep ( (int) (Math.random() *
3000 ) );
61:}
62: catch (InterruptedException e ) {
63: System.err.println ( Exception
+ e.toString() );
64: }
65:
66: val = cHold.getSharedInt();
67: System.out.println (El
consumidor recupero + val );
68: }
69: }
70: }
71:
72: class HoldInteger {
73: private int sharedInt;
74:
75: public void setSharedInt ( int
val ) { sharedInt = val;}
76:
77: public void getSharedInt() {
return sharedInt;}
78: }
Relacin productor/consumidor
con sincronizacin de hilos
La aplicacin muestra un consumidor
y un productor accediendo con
sincronizacin a una celda de memoria
compartida, de modo que el
consumidor slo consuma despues de
que el productor haya producido un
valor. La clase HoldInteger (lnea 74)
se redefini para este ejemplo.
9:
10:
11:
HoldInteger h = new
HoldInteger();
ProduceInteger p = new
ProduceInteger ( h );
ConsumeInteger c = new
ConsumeInteger ( h );
12:
13:
p.start();
14:
c.start();
15: }
16: }
17:
18: class ProduceInteger extends
Thread {
19:
private HoldInteger
pHold;
20:
21: public
ProduceInteger(HoldInteger h)
22: {
23:
pHold = h;
24: }
25:
26: public void run()
27: {
28: for ( int count = 0; count<10;
count++) {
29: pHold.setSharedInt( count );
30: System.out.println ("El
productor puso" + count +
41: }
42: }
43:
44: class ConsumeInteger extends
Thread {
45:
private HoldInteger cHold;
46:
47:
public ConsumeInteger (
HoldInteger h )
48:
{
49:
cHold = h;
50: }
51:
52: public void run()
53: {
54: int val;
55:
56:
val = cHold.getSharedInt();
57: System.out.println("El
consumidor recuper" + val );
58:
59: while (val !=9) {
60: // dormir durante un intervalo
aleatorio
61: try {
62. sleep ( (int) (Math.random() * 3000 )
);
63: }
64: catch (InterruptedException e ) {
65: System.err.println ( "Exception" +
e.toString() );
66: }
67:
68: val = cHold.getSharedInt();
69: System.out.println
("El
consumidor recupero" + val );
70: }
71: }
72: }
73:
74: class HoldInteger {
75: private int sharedInt;
76: private boolean writeable = true;
77:
78: public synchronized void
setSharedInt (int val)
79: {
80: while ( !writeable ) {
81:
try {
82:
wait();
83: }
84: catch (InterruptedException e )
{
85: System.err.println
("Excepcin:" + e.toString() );
86: }
87: }
88:
89: sharedInt = val;
90: writeable = false;
91: notify();
92: }
93:
94: public synchronized int
getSharedInt ()
95:{
96: while (writeable) {
97:
try{
98:
wait();
99: }
100: catch (InterruptedException e) {
101: System.err.println
("Excepcin:" + e.toString() );
102: }
103: }
104:
105: writeable = true;
106: notify();
107: return sharedInt;
108: }
109: }
Los
mtodos
getSharedInt
y
setSharedInt se implementan de forma
similar.
Cuando
el
objeto
ConsumeInteger invoca el mtodo
getSharedInt, adquiere un candado para
el objeto HoldInteger. La estructura
while de la lnea 96 prueba la variable
writeable. Si esta variable es true (es
decir, si no hay nada que consumir), se
invoca el mtodo wait.
Relacin productor/consumidor:
El buffer circular
El programa accede correctamente a los
datos compartidos, pero tal vez no tenga
un rendimiento ptimo. Dado que los
hilos
se
estn
ejecutando
asincrnicamente, no podemos predecir
sus relativas velocidades.
Si el
productor desea producir ms deprisa de
lo que el consumidor puede consumir,
no podr hacerlo.
Hilos daemon
Un hilo daemon es un hilo que se ejecuta
en beneficio de otros hilos. Los hilos
daemon se ejecutan en segundo plano (es
decir, cuando hay tiempo de procesador
disponible que de otra manera se
desperdiciara). El recolector de basura
es un hilo daemon. Los hilos no daemon
son hilos de usuario convencionales.
Designamos a un hilo daemon con la
llamada de mtodo
setDaemon (true);
Interfaz Runnable
C++ apoya la herencia mltiple, en la que
una subclase puede heredar de ms de una
superclase. La herencia mltiple es una
capacidad muy potente pero es empleo y
adolece de problemas de ambigedad y
rendimiento. Java no reconoce la herencia
mltiple. Esta decisin es congruente con la
omisin, por parte de Java, de varios otros
aspectos complejos de C++. Lo que s
reconoce Java es el concepto de interfaces,
un esquema ms sencillo que ofrece
algunas de las ventajas clave de la herencia
mltiple.
La implementacin de la interfaz
Runnable nos permite tratar nuestra
nueva clase como un objeto Runnable
(as como heredar de una clase nos
permite tratar nuestra subclase como un
objeto de su superclase). Al igual que
cuando derivamos de la clase Thread, el
cdigo que controla el hilo se coloca en
el mtodo run.
El constructor:
public
Thread
(Runnable
objetoEjecutable, String nombreHilo)
construye un Thread con el nombre
nombreHilo y registra el mtodo run de
su primer argumento (llamado aqu
objetoEjecutable) como el mtodo que
se invocar cuando el hilo comience a
ejecurtarse.
CAPTULO VIII
ANIMACIN, IMGENES,
SUBPROCESOS Y
SONIDOS
8.1
INTRODUCCIN
8.3 SUBPROCESOS
Hay
cinco
modificaciones
necesarias para crear un applet que
utilice subprocesos:
Cambiar la firma del applet para
incluir la palabra Runnable
Incluir una variable de instancia para
almacenar el subproceso de este
applet.
Crear un mtodo start ( ) que no
haga nada ms que crear un
subproceso e iniciar la ejecucin.
El segundo
paso es agregar una
variable de instancia para almacenar el
subproceso de ese applet. Puede tener
cualquier nombre, es una variable de
tipo Thread (la cual es una clase de
java.lang, por lo tanto no es necesario
importarla):
Thread runner;
import java.awt.Graphics;
import java.awt.Font;
import java.util.Calendar;
import
java.util.GregorianCalendar;
public class Class1 extends
java.applet.Applet
implements Runnable{
Font theFont= new
Font("TimesRoman",
Font.BOLD,24);
Thread runner;
Desafortunadamente si se ejecuta el
ciclo while() en el subproceso del
sistema principal, ste monopolizar
los recursos de Java y evitara que se
realice otras actividades. No se vera
nada en la pantalla porque Java estara
esperando que el ciclo while()
terminara para hacer otra cosa.
1.
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
public
class
Class1
extends
java.applet.Applet
implements Runnable{
Font f= new Font("TimesRoman",
Font.BOLD,48);
Color colors[]= new Color[50];
Thread runner;
int i =0;
while (true){
setForeground(colors[i]);
repaint();
i++;
try {Thread.sleep(200); }
catch
(InterruptedException e) {}
if (i==colors.length) i=0;
}
8.5
RECUPERAR Y
UTILIZAR
IMGENES
El mtodo getDocumentBase ( )
deuelve un objeto URL que
representa el directorio del archivo
HTML que contiene este
applet.
Por ejemplo, si el archivo
HTML
est en http://www.
Myserver.com/
htmlfiles/javahtml/, el mtodo
getDocumentBase( ) devolver
un
URL apuntando a esa
direccin.
El mtodo getCodeBase ( )
devuelve una cadena que
representa el directorio en el cual se
almacena el applet (el cual
puede
ser o no el mismo directorio en que
se encuentra el
archivo HTML
dependiendo de si est el atributo
CODEBASE definido en <APPLET>
o no.
El uso de getDocumentBase ( ) o
getCodeBase ( ) depende de si las
imgenes son relativas a los archivos
HTML o sin son relativas al archivo de
clase Java.Se utiliza el que convenga
ms
a
la
situacin;
utilizar
getDocumentBase ( ) o getCodebase ( )
permite cambiar los archivos HTML y
los applets, al mismo tiempo deja que
Java encuentre sus imgenes.
=
),
=
),
// 50%
xpos += (iwidth / 4) + 10;
g.drawImage(bugimg, xpos,
10,iwidth / 2, iheight / 2 ,this);
// 100%
xpos += (iwidth / 2) + 10;
g.drawImage(bugimg, xpos,
10, this);
// 150% x 25% y
g.drawImage(bugimg, 10,
iheight + 30,(int)(iwidth * 1.5),
iheight / 4, this);
}
}
Observadores de imagen
This aparece como argumento tanto en
getWidth() como en getHeight(). Su uso
es pasar un objeto que funcione como
un ImageObserver (esto es, un objeto
que implemente la interaccin con
ImageObserver).
8.6 COMO
CREAR
ANIMACIN USANDO
IMGENES
int xpos;
int ypos = 50;
Ahora, en el cuerpo del applet.
Durante su inicializacin, leer todas
las imgenes y las almacenar en el
arreglo nekopics. Este es el tipo de
operaciones que funcionan bien con un
mtodo init().
Entra
//alto y pausa
currentimg = nekopics[2]
repaint();
pause(1000);
currentimg = nekopics[8];
repaint();
pause(500);
nekorun(xpos, size().width +
10);
Paso 4 terminado
Todas las imagines de la animacin
tiene fondo blanco. Dibujarlas sobre el
fondo predeterminado del applet
significa tener un desagradable fondo
blanco alrededor de cada imagen. Para
resolver este problema solo hay que
asignar el color de fondo del applet a
blanco, tambin al inicio del mtodo
run():
setBackground(Color.white);
getImage(getCodeBase(),
"images/" + nekosrc[i]);
}
}
// yawn
currentimg = nekopics[3];
repaint();
pause(1000);
// scratch four times
nekoscratch(4);
// sleep for 5 "turns"
nekosleep(5);
// wake up and run off
currentimg = nekopics[8];
repaint();
pause(500);
La siguiente lnea
reproduce un sonido:
recupera
play(getCodeBase(),
audio/mew.au);
El mtodo play recupera y reproduce
el sonido dado lo ms pronto que
puede. Si no puede encontrar el sonido,
no se generar un error, ni se obtendr
el audio cuando se esperaba.
AudioClip clip=
getAudioClip(getCodeBase(),
audio/loop.au);
Para reproducir el clip una vez se utiliza
el mtodo play():
clip.play();
Para detener un sonido en ejecucin se
usa el mtodo stop():
clip.stop();
un
import java.awt.Graphics;
import java.applet.AudioClip;
public class AudioLoop
java.applet.Applet
implements Runnable {
extends
AudioClip bgsound;
AudioClip beep;
Thread runner;
public void start() {
if (runner == null) {
runner = new Thread(this);
runner.start();
}
mport java.awt.Graphics;
import java.awt.Color;
public
class
Checkers
extends
java.applet.Applet
implements
Runnable {
Thread runner;
int xpos;
// Draw checker
g.setColor(Color.red);
g.fillOval(xpos,5,90,90);
}
}
Thread runner;
int xpos;
Image offscreenImg;
Graphics offscreenG;
public void init() {
offscreenImg
createImage(this.size().width,
this.size().height);
offscreenG
offscreenImg.getGraphics();
}
=
=
// Draw checker
offscreenG.setColor(Color.red);
offscreenG.fillOval(xpos,5,90,90);
g.drawImage(offscreenImg,0,0,this);
}
public void destroy() {
offscreenG.dispose();
}
}