Sunteți pe pagina 1din 210

1.

1
CAPITULO I: PROGRAMACIN ORIENTADA AL
OB1ETO CON 1AVA

1.1 Introduccin

1.1.1. Conceptos Bsicos de Ingeniera de Software

El Software:

No solo abarca los programas de computacion asociados con alguna
aplicacion o producto.
Junto con los programas, el soItware incluye toda la documentacion
necesaria para instalar, usar, desarrollar y mantener esos programas.

Software Programas + Documentacin


Caractersticas del Software:

1. El SoItware es costoso.
2. Entregado con atraso.
Costo mayor al presupuestado.
Poco conIiable.
3. Costo asociado a la mantencion.


Ingeniera de Software:
Aplicacion de un enIoque sistematico, disciplinado y cuantiIicable, al
desarrollo, operacion y mantenimiento de soItware.

1.2
Etapas en el Desarrollo de un Sistema de Software:
1. Diagnostico (IdentiIicar el problema)
2. Factibilidad (Evaluar alternativas de solucion)
3. Analisis (Que se quiere?)
4. Diseo (Como se hace?)
5. Implementacion (Se hace!)
CodiIicacion
Pruebas (Testing)
Depuracion (Debugging)
6. Instalacion
7. Mantencion
Correctiva (Corregir Errores)
Adaptiva (Cambios en el Ambiente)
PerIectiva
(Cambios en las Solicitudes del Usuario)

Existen distintos enfoques para desarrollar software
















~EL
PROCESO
DEL
SOFTWARE

Desarrollo de
Sistemas de
Software
Descomposicion
Funcional
Top-Down
Diseo
Estructurado de
Jackson
Desarrollo
Orientado al Objeto



D F D` Estructura de los T D A`
datos`

D E` 1 S D Ocultamiento
1ackson Structured Development de informacin`


E
S
P
Algoritmo - Proceso
1.3
1.1.2. Repaso de Aspectos Bsicos de 1ava

Comentarios en 1ava
/*
Este es un comentario de bloque,
Puede tener mas de 1 linea de largo.
*/

// Este es un comentario de EXACTAMENTE 1 linea.

Operadores Aritmticos en 1ava

Operador Significado Tipo
Suma int, double
- Resta int, double
` Multiplicacion int, double
/ Division int, double
Resto int

Operadores Relacionales en 1ava

Operador Significado
< Menor que
> Mayor que
< Menor o igual que
> Mayor o igual que
Igual a
! Distinto de

Operadores Lgicos en 1ava

Operador Significado
&& - & and
,, - , or
` or exclusivo
1.4
Ejemplos:


Ejemplo 1

class IfElse

public static void main(String args||)
int mes 4;
String estacion;

if (mes 12 ,, mes 1 ,, mes 2)
estacion "Verano";
}
else
if (mes 3 ,, mes 4 ,, mes 5)
estacion "Otoo";
}
else
if (mes 6 ,, mes 7 ,, mes 8)
estacion "Invierno";
}
else
if (mes 9 ,, mes 10 ,, mes 11)
estacion "Primavera";
}
else
estacion "Mes incorrecto";
}
System.out.println("Abril esta en " estacion ".");
}

}

1.5
class SwitchEstacion

public static void main(String args||)
int mes 4;
String estacion;

switch (mes)
case 12:
case 1:
case 2:
estacion "Verano";
break;
case 3:
case 4:
case 5:
estacion "Otoo";
break;
case 6:
case 7:
case 8:
estacion "Invierno";
break;
case 9:
case 10:
case 11:
estacion "Verano";
break;
default:
estacion "Mes Incorrecto";
}
System.out.println("Abril esta en " estacion ".");
}
}

1.6
Ejemplo 2
Utilizar el metodo de clase sqrt, de la clase Math.
class Variables
public static void main ( String args | | )
double a 3;
double b 4;
double c;
cMath.sqrt (a*ab*b);
System.out.println ('c ' c );
}
}

Ejemplo 3
class Ruteo
public static int calculo(int N)
int Iact 1;
Ior(int i 1; i N; i)
Iact Iact * i;
return Iact;
}
public static void main(String args||)
int H 4;
int total calculo(H);
System.out.println('total total);
int valor total/H;
System.out.println('Valor valor);
}
}


H total valor N Iact i
4 6 1 4 1 1
2 2
6 3

total 4
Valor 1
Se imprime:
En el main:

En calculo:

1.7
1.2 Conceptos Bsicos de Orientacin al Objeto

1.2.1. Tipos, Tipos de Datos y Tipos de Datos Abstractos


Tipo: Coleccion de valores

Ejemplos:
Tipo Boolean, 2 valores: False y True.
Tipo Integer, todos los numeros enteros entre 32768 y 32767


Operacin: Es un proceso que lleva a cabo alguna tarea.

Ejemplo:









Tipo de Dato: Consiste de

1. Un tipo T.

2. Una coleccion de operadores, tal que para cada operador hay un
operando o resultado cuyo tipo es T.


La suma: Operandos


3 5


Operador
Read (SIile, valor)


Operandos


Operador

1.8
Tipo de Dato Abstracto (TDA)

Se compone de:

Estructuras de datos, y
Los procedimientos o Iunciones que manipulan esas estructuras de
datos.

TDA Representacion Operaciones
(Datos) (Funciones y Procedimientos)


En O.O., las operaciones se llaman mtodos.

Estructura de un TDA

























Metodo 1
Metodo 2


Interfaz Pblica
















Implementacin Privada
Representacin:
E. de Datos
(variables de instancia)
Implementacin de
Mtodos:

Codigo Metodo 1
Codigo Metodo 2
1.9
1.2.2. Aproximacin Orientada al Objeto: objeto, clase, instancia,
mtodo y mensaje

Se trata de resolver problemas, identiIicando los objetos asociados con el
problema y convirtiendolos en objetos del programa.

Por ejemplo, son objetos:
Jose Garcia
Compaia ABC S.A.
Lassie
Proceso Numero 7468

Un objeto es, sencillamente, algo que tiene sentido en el contexto de la
aplicacion.
Un objeto tiene estado, exhibe una conducta bien deIinida y tiene una
identidad unica.



Ejemplo del objeto martillo

1.10
Conceptos asociados en la orientacin al objeto
Abstraccin: Se enIoca en las caracteristicas esenciales de algun objeto,
relativa a la perspectiva de quien mira al objeto.




Encapsulacin: Oculta los detalles de la implementacion de un objeto.



1.11
Para la encapsulacion se deben respetar los siguientes puntos:
La abstraccion de un objeto deberia preceder a las decisiones sobre su
implementacion.
Una vez que se ha seleccionado la implementacion, debe tratarse como
un secreto de la abstraccion, oculto para la mayoria de los clientes.
Ninguna parte de un sistema complejo debe depender de los detalles
internos de otras partes.

El elemento de la abstraccion es la clase.


Modularidad:
Permite subdividir una aplicacion en partes mas pequeas (llamados
modulos), cada una de las cuales debe ser tan independientes como sea
posible de la aplicacion en si y de las restantes partes.

La modularizacion consiste en dividir un programa en modulos que se
puedan compilar por separado, pero que tienen conexiones con otros
modulos.

La modularidad es la propiedad de un sistema que permite su
descomposicion en un conjunto de modulos cohesivos y debilmente
acoplados.

La modularidad empaqueta las abstracciones en unidades discretas.

En el caso de Java se hace a traves de los paquetes.

1.12

1erarqua
Polimorfismo

Una ventaja de utilizar la orientacion al objeto es que la brecha semantica se
minimiza, ya que los objetos de la realidad son directamente mapeados en
objetos en el modelo.







Diferencia semntica entre la realidad y el modelo
Casa
Tom
Auto
rbol
Casa Auto
Tom
rbol
Vive en Conduce
un
Realidad
Brecha
Semntica
Modelo
Conceptos que se veran mas adelante
1.13
En la etapa de analisis aparecen los objetos del dominio del problema, es
decir, los objetos del mundo real.

Cuando se especiIica la solucion, aparecen nuevos objetos, desde el punto de
vista de la solucion del problema.




















Cinco palabras claves del vocabulario O.O

Objeto: Coleccion de datos privados y operaciones publicas.


Clase: Descripcion de un conjunto de objetos con propiedades
(atributos) similares, con relaciones comunes con otros
y con una semantica comun.
Especificacin de la
solucin
Objetos deIinidos durante el
diseo
Dominio del problema
Objetos deIinidos durante
el analisis
Cmo?
Qu?
Capas de especificaciones de objetos resultantes del
proceso de refinamiento
1.14
Instancia: Una instancia de una clase, es un objeto de esa clase.


Mtodo: Un cuerpo de procedimiento que implementa una
operacion.


Mensaje: Un llamado a un procedimiento. Un requerimiento
para ejecutar un metodo.


Ejemplo:
Clase con sus atributos:










Objetos con sus valores






p1: Persona

nombre Juan Garcia
edad 24
Persona

nombre: string
edad : integer
p2: Persona

nombre Maria Perez
edad 40
1.15
Objeto:

Coleccion de campos, junto a una coleccion de procedimientos
(llamados metodos) que operan en los campos.

Un objeto encapsula los componentes pasivos (campos) y los
componentes activos (metodos) en una unica entidad.

Este encapsulamiento incrementa la modularidad del programa: al aislar
un objeto del resto del programa, se obtiene un programa que es mas
Iacil de entender y de modiIicar.

El estado de un objeto, es representado por un conjunto de atributos.

Los atributos mantienen inIormacion acerca de un objeto.

El comportamiento de un objeto, representa las acciones que pueden
ser realizadas sobre el objeto.

Estas acciones ocurren cuando un mensaje es enviado hacia el objeto.



Clase:
Una clase es un conjunto de objetos que comparten una estructura
comun y un comportamiento comun.

Un objeto particular es simplemente una instancia de una clase.

Un objeto no es una clase.

Una clase puede ser un objeto ! (Por lo tanto, a la clase se le puede
enviar un mensaje, por ejemplo, new)
1.16
Ejemplos de Clases:
Puerta Para una empresa que Iabrica puertas y ventanas
Empleado Para un sistema de remuneraciones
Habitacion Para un sistema de reservas de un hotel
Vehiculo Para un sistema de arriendo de vehiculos

Ejemplos de Atributos:
Puerta largo
ancho
espesor
tipo de madera

Empleado rut
nombre
direccion particular
Iono particular
Iono empresa

Habitacion numero
cantidad de camas
metros cuadrados
citoIono
valor

Vehiculo patente
marca
modelo
ao

1.17
Ejemplo de Comportamiento:
Puerta abrir
cerrar
poner llave
sacar llave

Ejercicio
Se tiene que hacer un programa que maneje inIormacion de los alumnos y
proIesores de la UCN. IdentiIique las clases e indique para ellas atributos y
comportamiento. Muestre para cada una de las clases identiIicadas, 2
ejemplos de objetos.

















Interface de una clase

La interIace de una clase proporciona su vista externa y por lo tanto
enIatiza la abstraccion, mientras esconde su estructura y los secretos de su
comportamiento.
a1: Alumno
numMat 111
nombre Juan
Garcia
edad 24
Alumno

numMat: string
nombre: string
edad : integer


getNumMat()

a2: Alumno
numMat 222
nombre Juan Perez
edad 19
Profesor

nombre: string
tipo: int


getNombre()

p1: ProIesor
nombre Raul Vega
tipo 1
p2: ProIesor
nombre Pedro Soto
tipo 2
1.18

En un nivel abstracto, una clase es una interIace que deIine la conducta de
sus objetos












Implementacin de una clase
La implementacion de una clase corresponde a su vista interna, la que
abarca los secretos de su comportamiento.

La implementacion de una clase consiste principalmente de la
implementacion de todas las operaciones deIinidas en la interIace de la
clase.

Se puede dividir la interIace de una clase en tres tipos de visibilidades:
PUBLIC
PROTECTED
PRIVATE

Programa de
Aplicacion
Caja negra del
objeto de la
clase
Las operaciones, o Iunciones e interIaces,
proporcionan un canal de comunicacion hacia
y desde el objeto de la clase.
requerimiento de la operacion
resultado de la operacion
1.19
PUBLIC: Es una declaracion que esta visible a todos los clientes.

PROTECTED: Es una declaracion que esta visible solamente a la
misma clase y a sus subclases.

PRIVATE: Es una declaracion que esta visible solamente a la misma clase.


Diagrama de clase













Ejemplo:










Nombre de Clase

Visibilidad tipo de dato 1 nombre atributo 1
Visibilidad tipo de dato 2 nombre atributo 2
. . .

Visibilidad nombre operacion 1 (lista argum.1): tipo de resultado 1

Visibilidad nombre operacion 2 (lista argum.2): tipo de resultado 2
. . .

Persona

- String nombre
- int edad

Persona()
getEdad(): int
getNombre(): String
setEdad()
setNombre()

1.20
1.2.3. Variables y Mtodos de Instancia, Variables y Mtodos
de Clase

Variable de Instancia:
Una variable de instancia pertenece a una instancia. Su valor solo
puede ser cambiado por operaciones que pertenecen a la instancia.

Existe tanto como lo hace la instancia, es decir, la existencia de la
variable de instancia depende de la existencia del objeto que la contiene.


Variable de Clase:
Variable compartida por todas las instancias de una clase (una UNICA
copia).
Todos los objetos de la clase la pueden ver.

Ejemplo:












CuentaAhorro

- int numero
- int saldo
- $ double interes




Variable de clase

Variable de
instancia
1.21
Mtodos de instancia:
Pertenece a un objeto.

Mtodos de clase:
Esta asociado a una clase.


Ejemplo:
















Forma de invocacin:
c.getNumero() c es un objeto de la clase CuentaAhorro

CuentaAhorro.getInteres()


CuentaAhorro

- int numero
- int saldo
- $ double interes

getNumero(): int
$ getInteres(): double



Metodo de clase

Metodo de instancia

Variables de instancia

Variable de clase
1.22
1.2.4. Operaciones sobre un objeto

En la practica se ha encontrado que un cliente realiza tipicamente cinco tipos
de operaciones sobre un objeto.
ModiIicador
Selector
Iterador
Constructor
Destructor

Modificador: Es una operacion que altera el estado de un objeto
(Metodos set).

Selector: Es una operacion que accesa al estado de un objeto,
pero no lo altera (Metodos get).

Iterador: Es una operacion que permite que todas las partes de un objeto
sean accesadas, en algun orden bien deIinido.

Constructor: Es una operacion que crea un objeto y/o inicializa
su estado.

Destructor: Es una operacion que libera el estado de un objeto
y/o destruye el objeto mismo.

1.23
Ejemplo:










class Alumno
private String nombre;
private String numMatr;

public Alumno (String nom, String num)
nombre nom;
numMatr num;
}
public String getNombre()
return nombre;
}
public String getNumMatr()
return numMatr;
}
public void setNombre(String nom)
nombre nom;
}
public void setNumMatr(String num)
numMatr num;
}
}

Alumno

- String nombre
- String numMat

Alumno()
getNombre(): String
getNumMatr(): String
setNombre()
setNumMatr()
1.24
1.2.5. Ejemplo de programa en 1ava

Se desea manejar la inIormacion de las cuentas bancarias de un banco. De
cada cuenta interesa el saldo. Se puede depositar y girar sobre una cuenta
bancaria. Se pide hacer un programa en java que cree una cuenta, luego haga
un deposito sobre ella y por ultimo un giro. Una vez hechas las transacciones
sobre la cuenta, se debe desplegar su saldo.

Diagrama de clases












// Muestra la sintaxis bsica de un POO
// Para correr el programa se debe ejecutar: C:\>java BankApp

class CuentaBancaria
private int saldo; // saldo de la cuenta

public CuentaBancaria (int valorApertura) // constructor
saldo valorApertura;
}
public void depositar(int cantidad) // efectuar un depsito
saldo saldo cantidad;
}

CuentaBancaria
- int saldo
CuentaBancaria()
depositar()
girar()
getSaldo(): int

Nombre de la Clase
Variable de Instancia
Metodos de Instancia
1.25
public void girar(int cantidad) // efectuar un retiro
saldo saldo - cantidad;
}
public int getSaldo() // Obtiene el saldo
return saldo;
}
} // fin class CuentaBancaria


class BankApp

public static void main(String|| args)

//Crea una cuenta
CuentaBancaria cb1 new CuentaBancaria(100);
System.out.println("Saldo antes de las transacciones: "
cb1.getSaldo());

cb1.depositar(74); // efectuar un depsito

cb1.girar(20); // efectuar un retiro

System.out.println("Despues de las transacciones: "
cb1.getSaldo());
} // fin main()

} // fin class BankApp

Diagrama de objetos





cb1: CuentaBancaria

saldo 100

174

154
1.26
1.3 Lenguaje de Programacin Orientado al Objeto 1AVA

1.3.1. Caractersticas de 1AVA

El elemento basico de la P.O.O. en JAVA es una clase. Java tiene la
particularidad de poder crear aplicaciones muy especiales, los APPLETS,
que es una mini (-LET) aplicacion (APP-), diseada para ejecutarse en un
navegador.


Java es un lenguaje de programacion universal (multiplataIorma). Fue
diseado por James Gosling para SUN. Sus principales caracteristicas son:
Simple
Orientado a objetos
Distribuido
Robusto
Arquitectura neutral
Seguro
Portable
Interpretado
Multihilo
Dinamico


Java es mas que un lenguaje, es una plataIorma Iomada por:
Lenguaje de programacion completo.
Maquina virtual con set de instrucciones propio.
InterIaz para programacion de aplicaciones.


1.27
El codigo en lenguaje JAVA se compila a un codigo llamado bytecode,
que es el que toma la maquina virtual (dependiente de la maquina) y lo
interpreta. Para esto, usa las API (InterIaz de Programacion de
Aplicaciones).

















El principal aporte de JAVA a la Comunidad de Usuarios y Programadores es
la Portabilidad.
La portabilidad permite que los usuarios se puedan mover Iacilmente entre
sistemas operativos y plataIormas diIerentes.
La portabilidad permite que los programadores puedan transIerir Iacilmente
sus trabajos a distintas maquinas con diIerentes sistemas.

JAVA es un lenguaje de programacion creado por SUN Microsystems
(http://www.sun.com, http://java.sun.com).
El desarrollador en JAVA requerira del JDK (Java Development Kit) para
compilar y ejecutar sus programas, en cambio si se desea solamente la
ejecucion de programas ya compilados bastara el JRE (Java Runtime
Enviroment).
API
I
API
II
API
III
Una Maquina Virtual
Una InterIaz de Programacion de
Aplicaciones
Un Lenguaje de Programacion

Public class Hola
Public static void main (String | | args)
System.out.println('Hola Mundo);
}
}
Plataforma 1AVA
1.28
La version actual del JDK es la 5.0 y puede ser obtenida en Iorma
gratuita desde http://java.sun.com .
MicrosoIt tambien posee una version de Java, pero ha introducido
cambios que atentan contra la portabilidad.

MicrosoIt:
J
Visual J
Internet Explorer
Maquina Virtual Java de MicrosoIt

Cuando un programador realiza una aplicacion o un applet en JAVA y lo
compila, en realidad, el compilador no trabaja como un compilador de un
lenguaje tradicional.
El compilador JAVA unicamente genera el denominado BvteCode. Este
codigo es un codigo intermedio entre el lenguaje de maquina del
procesador y Java.
Evidentemente, este codigo no es ejecutable por si mismo en ninguna
plataIorma de hardware, pues no corresponde con el lenguaje de ninguno
de los procesadores que actualmente se conocen.
Por lo tanto, para ejecutar una aplicacion JAVA, es necesario disponer de
un mecanismo que permita ejecutar el Byte Code.
Este mecanismo es la denominada MAQUINA VIRTUAL JAVA (Java
Runtime Enviroment).
En cada plataIorma (Unix, Linux, Windows 95/NT, Macintosh, etc.)
existe una maquina Virtual especiIica.
Asi, cuando el BvteCode llega a la maquina Virtual, esta lo interpreta
pasandolo a codigo de maquina del procesador donde se este trabajando.



1.29
Errores en
tiempo de
ejecucion
Errores de
compilacion
y warnings
Salida
incorrecta
Editor

Compilador

Interprete

import .
public class Temperatura
..
}

public class App
public class void main (String | | args)
..
}
}
0000000 1771231 2345678 2345698 4567892
0000020 0121231 2312078 3578208 9065781
0000040 1230823 1095678 2345698 4567892
0000060 0125681 1232478 3590008 9060988
0000000 1771231 2345678 2345698 4567892
0000020 0121231 2312078 3578208 9065781

X

OK
X
...

Ciclo de un programa 1ava
1.30
1.3.2. Tipos de datos y Variables

Tipos de datos
1. Tipos Primitivos.
2. Objetos.

Java tiene 8 tipos primitivos:

Enteros: byte
short
int
long

Numeros de Punto Ilotante: Iloat
double

Caracteres: char

Booleano: boolean

Todos los tipos no indicados anteriormente, son CLASES

Variables

Las variables de tipo primitivo almacenan valores.

Ejemplo: x, y son enteros




Concepto de Casteo
Desde qu punto de vista quiero ver: double o int?
int i;
double d;

DiIieren en la magnitud
DiIieren en la magnitud
x y
4 5

x y 5

1.31
Quiero verlo como entero:
i d; No se puede perder inIormacion. Por lo tanto:
\\ i (int) d; //Se quiere ver como entero

Quiero verlo como double:
\\ d i; // No hay prdida de informacin
\\ d (double) i;

Las variables de tipo objeto almacenan referencias al objeto.

Ejemplo: x, y son objetos de una clase





Los objetos en JAVA, tienen una ~Semntica por Referencia
('ReIerence Semantics). Es decir, ellos son realmente punteros.


1.3.3. Declaracin, Creacin, Asignacin, Comparacin y
Destruccin de Objetos

A. Declaracin del objeto

nombre-clase nombrevariable;

La declaracion no establece almacenamiento para la variable.

Ejemplo: Persona p;
a

x y
b

y
x
iI (x y) verdadero
1.32
B. Creacin de objetos

Un objeto en JAVA, se construye unicamente por la expresion de creacion
dinamica, que tiene la Iorma:

new nombreclase (parametrosactuales);

Ejemplo: new Persona (25);

La evaluacion de esta expresion signiIica:
a) Asignacion de memoria para un nuevo objeto de la clase
nombreclase, asociandole valores iniciales a las variables del objeto.
b) Se invoca el constructor apropiado de la clase, con los parametros
correspondientes.
c) Se regresa como resultado la reIerencia al objeto creado.

Si no hay rutina constructora, se crea igual el espacio y todos los atributos
quedan en nulo.

C. Asignacin de Objetos

Ejemplo: miObjeto tuObjeto;

'Shallow Copv o Copia SuperIicial

Nuevo almacenamiento no es creado para el objeto destino, en la
asignacion de objetos.



x y
x y
1.33
D. Comparacin de Objetos

Los operadores (igual) y ! (no igual) se utilizan para comparar
expresiones cuyos valores son referencias a objetos.

Esta comparacion prueba si al evaluar las dos expresiones, el resultado es
o no, la referencia al mismo objeto (identidad versus igualdad).

Ejemplo de identidad:

String x, y






Ejemplo de igualdad:

int x, y




E. Destruccin de objetos

En Java no existe el concepto de destructor explicito de objetos.

La recuperacion de memoria de los objetos, que ya no son utiles, se realiza
automaticamente por el proceso recolector de basura, el cual se ejecuta de
manera concurrente con el programa en Java.

5 5
x y
iI (x y) verdadero
a
x
a
y
iI (x y) Ialso
iI (x.equals(y)) verdadero


X Y;
iI ( X Y) true
(1)
(2)
(2)
1.34
1.3.4. Sintaxis de la declaracin de clase

class nombreclase extends nombre superclase

variable1;
- -
- -
variablen;


metodo1(...)
........;
}

metodoh(...)
.........;
}

}


Las clases no andan sueltas, se agrupan en paquetes!

Los paquetes contienen en su interior deIiniciones de una o mas clases
logicamente relacionadas.

Es una Iorma de modularizar los programas en JAVA.

1.35

static PrintStream out


Ejemplo: Una minima aplicacion en JAVA
public class HelloWorld

public static void main ( String args| |)

System.out.println('Hola Mundo!);
}
}

Para compilar:
javac HelloWorld.java (Se genera HelloWorld.class)
Para ejecutar:
java HelloWorld

Observaciones respecto al ejemplo anterior:
Java diIerencia entre mayusculas y minusculas en lo que se reIiere a todas
las palabras claves e identiIicadores. Por ejemplo:
Main es distinto de main

void, indica que main, no devuelve nada.

System.out.println(...);
Se aplica el metodo println a la variable de clase out, deIinida en la clase
System.

Clase System




out es una variable de la clase System y es del tipo PrintStream que tiene
un metodo println.

A una variable que es de la clase se debe colocar static.

es del tipo PrintStream
variable de la clase
clase
1.36
Ejercicio
Dado el siguiente diagrama de clases, completelo y escriba en Java la clase
Asignatura y un programa Java que cree un objeto Asignatura cuyo codigo
es 'cc 571 y creditos 14. Una vez creado el objeto se debe desplegar por
pantalla sus datos.










Solucin








Asignatura
codAsig
creditos

Asignatura()
getCodAsig()
getCreditos()
setCodAsig()
setCreditos()
Asignatura

- String codAsig
- int creditos

Asignatura()
getCodAsig(): String
getCreditos(): int
setCodAsig()
setCreditos()

1.37
class Asignatura
private String codAsig;
private int creditos;

public Asignatura(String ca, int cre)
codAsig ca;
creditos cre;
}

public String getCodAsig()
return codAsig;
}

public int getCreditos()
return creditos;
}

public void setCodAsig(String c)
codA c;
}

public void setCreditos(int cred)
creditos cred;
}
}

class App

public static void main (String | | args)
Asignatura a new Asignatura ('cc 571, 14);
System.out.println('Datos de la asignatura: Codigo '
a.getCodAsig() 'creditos ' a.getCreditos());
}

}
1.38
Notas:
La rutina constructora no tiene un tipo asociado al resultado, debido a
que retorna el objeto.
Los parametros en JAVA son solo de modo IN.

Ejemplo
El programa siguiente, crea dos objetos Punto diIerentes y pone valores
unicos en cada uno.

class Punto
private int x;
private int y;

public void setX(int xx)
x xx;
}
public void setY(int yy)
y yy;
}
public int getX()
return x;
}
public int getY()
return y;
}
}

class DosPuntos

public static void main(String args||)
Punto p1 new Punto();
Punto p2 new Punto();

Punto
- int x
- int y

setX()
setY()
getX(): int
getY(): int
1.39
p1.setX(10);
p1.setY(20);

p2.setX(42);
p2.setY(99);

System.out.println ("x " p1.getX() " y " p1.getY());

System.out.println ("x " p2.getX() " y " p2.getY());
}
}






class Punto
private int x;
private int y;

public void init (int x, int y)
x x;
y y;
}

public int getX()
return x;
}

public int getY()
return y;
}

}
p1: Punto

x 10
y 20
p2: Punto

x 42
y 99
x 10 y 20
x 42 y 99
Imprime
1.40
El programa siguiente, aprovecha el metodo init para eIectuar la
inicializacion del objeto.

class TwoPointsInit

public static void main(String args||)

Punto p1 new Punto();
Punto p2 new Punto();

p1.init(10, 20);
p2.init(42, 99);

System.out.println ("x " p1.getX() " y " p1.getY());
System.out.println ("x " p2.getX() " y " p2.getY());
}

}

1.41
1.3.5. Mensajes a THIS

Dentro de la implementacion de un metodo, el identiIicador this
representa un parametro implicito, que reIerencia al objeto para el cual
el metodo Iue invocado.

'Un mensaje a this, es un mensaje al mismo objeto

En: C: this
Smalltalk: selI
Delphi Pascal: selI

Si el objeto al que se quiere enviar el mensaje es el mismo, se debe usar
el this.



Ejemplo 1 :
Inicializar las variables de una clase, utilizando el constructor.










Punto
- int x
- int y
Punto()
getX(): int
getY(): int
1.42
class Punto
private int x;
private int y;

public Punto(int x, int y)
this.x x;
this.y y;
]
public int getX()
return this.x;
]
public int getY()
return this.y;
]
]


class CrearPunto

public static void main(String args||)
Punto p new Punto(10, 20);
System.out.println( "x " p.getX() " y " p.getY());
]
}

Ejemplo 2:







Empleado


calcSueldoTotal(): int
calcDescuentoTotal(): int
calcSueldoFinal(): int


SueldoIinal
this.calcSueldoTotal()
this.calcDescuentoTotal();

1.43
1.3.6. Sobrecarga de mtodos

Ejemplo 1: Un constructor llama a otro constructor, para construir la
instancia.

class Punto
private int x;
private int y;
public Punto(int x, int y)
this.x x;
this.y y;
}
public Punto()
this(-1, -1); //this.Punto(-1,-1);
}
]

Ejemplo 2: Version de la clase Punto que utiliza la sobrecarga de metodo para
crear un constructor alternativo que establece algunos valores por omision para
las coordenadas x e y.

class Punto
private int x;
private int y;
public Punto(int _x, int _y)
this.x x;
this.y y;
}
public Punto()
x -1;
y -1;
}
public int getX()
return x;
}
1.44
public int getY()
return y;
}
]

class PointCreateAlt

public static void main(String args])
Punto p new Punto();
System.out.println("x " p.getX() " y " p.getY());
}
]


Ejemplo 3: Existen dos versiones de un metodo llamado distancia, asociado a
la clase Punto. Unbmetodo toma un par x, y, y el otro toma otro objeto Punto.

class Punto
private int x;
private int y;

public Punto(int x, int y)
this.x x;
this.y y;
]

public int getX()
return x;
]

public int getY()
return y;
]


Punto
- int x
- int y

Punto()
setX()
setY()
getX(): int
getY(): int
distancia(): double
1.45
p1: Punto
x 0
y 0
P2: Punto
x 30
y 40
public double distancia(int x, int y)
int dx this.x - x;
int dy this.y - y;
return Math.sqrt(dx*dx dy*dy);
]

public double distancia(Punto p)
return this.distancia(p.x, p.y);
]
]

class PointDist

public static void main (String args||)
Punto p1 new Punto(0, 0);
Punto p2 new Punto(30, 40);
System.out.println( "p1 " p1.getX() ", " p1.getY());
System.out.println( "p2 " p2.getX() ", " p2.getY());

System.out.println( "p1.distancia(p2) "
p1.distancia(p2));
System.out.println( "p1.distancia(60, 80) "
p1.distancia(60, 80));
]

]






En el ejemplo se utiliza el metodo estatico sqrt de la clase Math para calcular
la raiz cuadrada de su parametro.
1.46
1.3.7. Lecturas y despliegues en pantalla y archivo


/`` Se encarga de leer los datos que se escriben por teclado`/
import java.io.BuIIeredReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Lectura

//Mtodo que lee un String
public static String getString()
String s;
try
InputStreamReader isrnew InputStreamReader(System.in);
//isr: objeto de la clase InputStreamReader
//.in: Lectura desde teclado
//System.in: Cdigo asociado a los caracteres
//InputStreamReader: Clase para transformar
//a los caracteres reales

BuIIeredReader br new BuIIeredReader(isr);
//br: objeto de la clase BufferedReader.

s br.readLine();
//readLine: Se lee la lnea y se guarda
//en el buffer con los caracteres reales

} catch (IOException e)
//Si se produce algn problema en la
//entrada salida, por ejemplo teclado
//desconectado, se levanta una excepcin
s "";
}
return s;
}
Clase Lectura: Para leer desde pantalla
1.47

// Mtodo que lee un Entero
public static int getInt()
String s getString();
try
//Lo transforma a entero
return(Integer.parseInt(s));
}
catch (NumberFormatException e)
//Si se produce algn error en el formato del
//nmero, se despliega el mensaje y se retorna
//el valor ms pequeo de los enteros
System.out.println("Dato Ingresado NO es entero!!!");
return Integer.MINVALUE;
}
}



// Mtodo que lee un float
public static float getFloat()
String s getString();
try
//Lo transforma a float
return(Float.parseFloat(s));
}
catch (NumberFormatException e)
//Si se produce algn error en el formato del
//nmero, se despliega el mensaje y se retorna
//el valor ms pequeo de los float
System.out.println("Dato Ingresado NO es Iloat!!!");
return Float.MINVALUE;
}
}
1.48

//Mtodo que lee un Double
public static double getDouble()
String s getString();
try
//Lo parsea a double
return Double.parseDouble(s);
//return Double.valueOf(s).doubleValue();
}
catch (NumberFormatException e)
//Si se produce algn error en el formato del
//nmero, se despliega el mensaje y se retorna
//el valor ms pequeo de los double

System.out.println("Dato Ingresado NO es double!!!");
return Double.MINVALUE;
}
}

//Mtodo para leer un char
public static char getChar()
String s getString();
int largo s.length(); //Longitud del string
iI(largo 1)
return s.charAt(0);
//obtiene el primer caracter del string
}
else
System.out.println("Dato Ingresado NO es char!!!");
return ' ';
}
}

] //Fin clase Lectura
1.49



import java.io.BuIIeredReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Consola

private BuIIeredReader br;
private InputStreamReader isr;

public Consola()

isr new InputStreamReader(System.in);
//isr: objeto de la clase InputStreamReader
//.in: Lectura desde teclado
//System.in: Cdigo asociado a los caracteres
//InputStreamReader: Clase para transformar a
//los caracteres reales

br new BuIIeredReader(isr);
//br: objeto de la clase BufferedReader.

}


Clase Consola: Para leer y desplegar desde y hacia pantalla
1.50

//Mtodo que lee un String
public String getString()
String s;
try
s br.readLine();
//readLine: Se lee la lnea y se guarda en el
//buffer con los caracteres reales

} catch (IOException e)
//Si se produce algn problema en la entrada
//salida, por ejemplo teclado desconectado,
//se levanta una excepcin
s "";
}
return s;
}

// Mtodo que lee un Entero
public int getInt()
String s getString();
try
//Lo transforma a entero
return(Integer.parseInt(s));
}
catch (NumberFormatException e)
//Si se produce algn error en el formato del
//nmero, se despliega el mensaje y se retorna el
//valor ms pequeo de los enteros
System.out.println("Dato Ingresado NO es entero!!!");
return Integer.MINVALUE;
}
}


1.51

// Mtodo que lee un float
public float getFloat()
String s getString();
try
//Lo transforma a float
return(Float.parseFloat(s));
}
catch (NumberFormatException e)
//Si se produce algn error en el formato del
//nmero, se despliega el mensaje y se retorna el
//valor ms pequeo de los float
System.out.println("Dato Ingresado NO es Iloat!!!");
return Float.MINVALUE;
}
}

//Mtodo que lee un Double
public double getDouble()
String s getString();
try
//Lo parsea a double
return Double.parseDouble(s);
//return Double.valueOf(s).doubleValue();
}
catch (NumberFormatException e)
//Si se produce algn error en el formato del
//nmero, se despliega el mensaje y se retorna
//el valor ms pequeo de los double
System.out.println("Dato Ingresado NO es double!!!");
return Double.MINVALUE;
}
}

1.52

//Mtodo para leer un char
public char getChar()
String s getString();
int largo s.length(); //Longitud del string
iI(largo 1)
return s.charAt(0);
//obtiene el primer caracter del string
}
else
System.out.println("Dato Ingresado NO es char!!!");
return ' ';
}
}


//Mtodos para desplegar a pantalla

//Permite imprimir un mensaje a consola,
//SIN salto de lnea
public void print(Object mensaje)
System.out.print(mensaje);
}

//Permite imprimir un mensaje a consola,
//CON salto de lnea
public void println(Object mensaje)
System.out.println(mensaje);
}

//Permite imprimir una lnea en blanco
public void println()
System.out.println();
}
1.53

//Permite imprimir un int a consola,
//SIN salto de lnea
public void print(int valor)
System.out.print(valor);
}

//Permite imprimir un int a consola,
//CON salto de lnea
public void println(int valor)
System.out.println(valor);
}

//Permite imprimir un double a consola,
//SIN salto de lnea
public void print(double valor)
System.out.print(valor);
}

//Permite imprimir un double a consola,
//CON salto de lnea
public void println(double valor)
System.out.println(valor);
}

//Permite imprimir un float a consola,
//SIN salto de lnea
public void print(Iloat valor)
System.out.print(valor);
}


1.54

//Permite imprimir un float a consola,
//CON salto de lnea
public void println(Iloat valor)
System.out.println(valor);
}

//Permite imprimir un booelan a consola,
//SIN salto de lnea
public void print(boolean valor)
System.out.print(valor);
}

//Permite imprimir un boolean a consola,
//CON salto de lnea
public void println(boolean valor)
System.out.println(valor);
}

//Permite imprimir un char a consola,
//SIN salto de lnea
public void print(char valor)
System.out.print(valor);
}

//Permite imprimir un char a consola,
//CON salto de lnea
public void println(char valor)
System.out.println(valor);
}

] //Fin clase Consola
1.55


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;


public class Archivo

private RandomAccessFile rI;

//Rutina constructora.
//Crea el archivo, ya sea de lectura o de lectura-escritura
public Archivo(String archivo, String tipo) throws IOException

iI(tipo.equals("read"))
try
//El archivo a leer existe.
//Se crea como un archivo de lectura.
//Implcitamente se hizo el open del archivo
rI new RandomAccessFile(archivo,"r");

} catch(FileNotFoundException e)

System.out.println("Archivo: '" archivo "' no
existe. Debe crearlo primero antes de
intentar leerlo!!!");
}

} //Fin es archivo de lectura

else //Es de escritura

Clase Archivo: Para leer y grabar desde y hacia un archivo
1.56

iI(tipo.equals("write"))
//Al ser un archivo de tipo write, el archivo
//puede existir o no:
//- Si el archivo existe, lo asigna al objeto f.
//- Si no, crea un archivo con el nombre
// "archivo" y lo asigna al objeto f.

File I new File(archivo);
//Se crea el archivo

//Se crea el objeto para poder accesar el archivo
rI new RandomAccessFile(I,"rw");
//Se crea como un archivo de lectura-escritura
}
else
System.out.println("Error: Tipo de Archivo Incorrecto!!!");
}

} //Fin es archivo de escritura

] // Fin rutina constructora

//Mtodo para leer un registro del archivo
public String readRegistro()
String line;
try
line rI.readLine();

} catch (IOException e)
//En caso de problemas, la linea queda nula.
line null;
}
return(line);
}
1.57

//Mtodo para cerrar el archivo
public void close()
try
rI.close();
}catch(IOException e)
System.out.println(e.getMessage());
}
}

//Mtodo para grabar un registro en el archivo
public void writeRegistro(String linea)
try
long Iin rI.length();
//El puntero queda apuntando al final del archivo
rI.seek(Iin);

//Graba el registro y le coloca un caracter
//de fin de lnea
rI.writeBytes(linea "\n");

}catch(IOException e)
System.out.println("El archivo es solo de lectura!!!");
}

}

] //Fin clase Archivo
1.58

import java.io.IOException;

import java.util.StringTokenizer;
//Para trabajar con archivos

public class AppLecturas

public static void main(String|| args) throws IOException

//PRUEBA DE LA CLASE LECTURA

//Lectura de un entero,
//sin preocuparse que el dato de entrada
//sea realmente un entero
System.out.print("Ingrese numero entero: ");
int num Lectura.getInt();
System.out.println("numero: " num);

//Lectura de un entero, validando que el dato
//ledo sea entero
int num1;
do
System.out.print("Ingrese numero entero: ");
num1 Lectura.getInt();
}while(num1 Integer.MINVALUE);
System.out.println("numero: " num1);



1.59

//Lectura de un float,
//sin preocuparse que el dato de entrada sea
//realmente un float
System.out.print("Ingrese numero Iloat: ");
Iloat num3 Lectura.getFloat();
System.out.println("numero: " num3);

//Lectura de un float, validando que el dato
//ledo sea float
Iloat num4;
do
System.out.print("Ingrese numero Iloat: ");
num4 Lectura.getFloat();
}while(num4 Float.MINVALUE);
System.out.println("numero4: " num4);

//Lectura de un double,
//sin preocuparse que el dato de entrada sea
//realmente un double
System.out.print("Ingrese numero double: ");
double num5 Lectura.getDouble();
System.out.println("numero: " num5);

//Lectura de un double, validando que el dato
//ledo sea double
double num6;
do
System.out.print("Ingrese numero double: ");
num6 Lectura.getDouble();
}while(num6 Double.MINVALUE);
System.out.println("numero: " num6);


1.60

//Lectura de un char,
//sin preocuparse que el dato de entrada sea
//realmente un char
System.out.print("Ingrese char: ");
char ch Lectura.getChar();
System.out.println("char: " ch);

//Lectura de un char, validando que el dato
//ledo sea char
char ch1;
do
System.out.print("Ingrese char: ");
ch1 Lectura.getChar();
}while(ch1 ' ');
System.out.println("char: " ch1);


//Lectura de un string
System.out.print("Ingrese un string ");
String s Lectura.getString();
System.out.println("string: " s);



1.61

//PRUEBA DE LA CLASE CONSOLA

//Se crea el objeto consola
Consola c new Consola();

//Lectura de un entero,
//sin preocuparse que el dato de entrada sea
//realmente un entero
c.print("Ingrese numero entero: ");
num c.getInt();
c.println("numero: " num);

//Lectura de un entero, validando que el dato ledo
// sea entero
do
c.print("Ingrese numero entero: ");
num1 c.getInt();
}while(num1 Integer.MINVALUE);

//Se usa el println que tiene como parmetro un Object
c.println("numero: " num1);

//Se usa el println que tiene como parmetro un int
c.println(num1);

//Lectura de un float,
//sin preocuparse que el dato de entrada sea
// realmente un float
c.print("Ingrese numero Iloat: ");
num3 c.getFloat();
c.println("numero: " num3);


1.62

//Lectura de un float, validando que el dato ledo
//sea float
do
c.print("Ingrese numero Iloat: ");
num4 c.getFloat();
}while(num4 Float.MINVALUE);

//Se usa el println que tiene como parmetro un Object
c.println("numero4: " num4);

//Se usa el println que tiene como parmetro un float
c.println(num4);


//Lectura de un double,
//sin preocuparse que el dato de entrada sea
//realmente un double
c.print("Ingrese numero double: ");
num5 c.getDouble();
c.println("numero: " num5);

//Lectura de un double, validando que el dato
//ledo sea double
do
c.print("Ingrese numero double: ");
num6 c.getDouble();
}while(num6 Double.MINVALUE);

//Se usa el println que tiene como parmetro un Object
c.println("numero: " num6);


1.63

//Se usa el println que tiene como parmetro un double
c.println(num6);

//Lectura de un char,
//sin preocuparse que el dato de entrada sea
//realmente un char
c.print("Ingrese char: ");
ch c.getChar();
c.println("char: " ch);

//Lectura de un char, validando que el dato
//ledo sea char
do
c.print("Ingrese char: ");
ch1 c.getChar();
}while(ch1 ' ');
//Se usa el println que tiene como parmetro un Object
c.println("char: " ch1);

//Se usa el println que tiene como parametro un char
c.println(ch1);

//Lectura de un string
c.print("Ingrese un string ");
s c.getString();

//Se usa el println que tiene como parmetro un Object
c.println("string: " s);

//Se usa el println que tiene como parmetro un Object
c.println(s);


1.64

//Despliegue de un boolean
boolean bol true;

//Se usa el println que tiene como parmetro un Object
c.println("bol: " bol);

//Se usa el println que tiene como parametro un boolean
c.println(bol);


1.65

//PRUEBA DE LA CLASE ARCHIVO

//Se crea el archivo de lectura
//Implcitamente se hace el open del archivo,
//es decir, deja el puntero al comienzo del archivo
Archivo arch1 new Archivo("datos.txt","read");

//Se crea el archivo de escritura
Archivo arch2 new Archivo("resultado.txt","write");

//Se lee la primera lnea o registro
String linea arch1.readRegistro();

while(linea!null) //Si no es fin de archivo

//Se separa la linea en tokens.
//Un token es un conjunto de caracteres (string).
//La coma (,) es el caracter que se eligi
//para separar los tokens
StringTokenizer st new StringTokenizer(linea,",");


1.66

//Mientras le queden token
while(st.hasMoreTokens())

String nombre st.nextToken();
//Obtiene el proximo token, en este caso
//el primero (nombre)

int edad Integer.parseInt(st.nextToken());
//Segundo token es la edad

String proIesion st.nextToken();
//Tercer token es la profesion

//Despliegue de los tokens a la pantalla
System.out.println("Nombre " nombre ",
Edad " edad ", ProIesion " proIesion);

//Se forma un registro con los 3
//campos anteriores
//(nombre, edad y profesion)
//El caracter separador es la coma (,)
String registronombre "," edad "," proIesion;

//Se graba el registro en arch2
arch2.writeRegistro(registro);

} //Fin mientas queden token

//Se lee la prxima lnea o registro
linea arch1.readRegistro();

]//Mientras no sea fin de archivo

1.67

//Incorrecto, porque es un archivo de lectura
//En este caso se gatilla la excepcin definida
//en la clase Archivo,
//desplegando el mensaje "El archivo es solo ......."
arch1.writeRegistro("hola");

//Se cierra el archivo datos
//Se cierra el objeto de 1ava que permite trabajar
//con el archivo (rf),
//es decir, se liberan los recursos
arch1.close();

//Se graba un nuevo registro al final del archivo
arch2.writeRegistro("nada");

//Se cierra el archivo resultados
arch2.close();

//Se crea otro objeto para el mismo archivo resultado
Archivo arch3 new Archivo("resultado.txt","write");
arch3.writeRegistro("nueva linea");
arch3.close();


1.68

//Suponga que:
//- Se quiere leer un archivo cuyo nombre es "datos1.txt"
//- El archivo "datos1.txt" no existe
//
//Por lo tanto, al crear el objeto de la clase Archivo
//por medio de la siguiente instruccin:
//
// Archivo arch4 new Archivo("datos1.txt","read");
//
//se levanta la excepcin definida en la clase Archivo,
//desplegando el mensaje "No existe el archivo .....
//
//La ejecucin del programa seguira hasta que se intente
//leer el primer registro del archivo.
//Es ah donde se caera, ya que el archivo no existe


] //Fin main

] //Fin AppLecturas




datos.text
juan,20,ingeniero
pedro,30,medico
maria,40,agronomo

resultado.text
juan,20,ingeniero
pedro,30,medico
maria,40,agronomo
nada
nueva linea

1.69
1.4 Relacionamientos entre Clases/Objetos

1.4.1. Concepto de relacionamiento

Conceptualmente, los objetos y las clases no existen aisladas.

El relacionamiento entre clases/objetos es una asociacion natural en el
problema que existe entre uno o mas objetos/clases.


Ejemplo
Para un problema dado, se pueden eIectuar las siguientes aseveraciones:

Un cliente coloca cero o mas ordenes de compra.

Una orden de compra es colocada por uno y solo un cliente.








La linea entre las clases muestra el relacionamiento.

El verbo describe el relacionamiento.

Notar que todos los relacionamientos son bidireccionales, en Iorma
implicita, indicando con ello que pueden ser interpretados en ambas
direcciones.

Cliente Orden
'1 y solo 1 'Cero o mas
Coloca
` 1
1.70
Multiplicidad del relacionamiento

La multiplicidad deIine el minimo y el maximo numero de ocurrencias de un
objeto / clase asociados a una unica ocurrencia del objeto / clase relacionado.

Debido a que todos los relacionamientos son bidireccionales, la
multiplicidad debe ser deIinida en ambas direcciones, para cada
relacionamiento.

Tipos de multiplicidad









Ejemplos de multiplicidad













Clase
n..m
Entre n y m
Clase 1 y solo 1
1
Clase 0 o mas
*
Profesor
Asignatura
1..2 0..4
dicta
Profesor Depto
1 1..*
pertenece
Alumno
Carrera
1 1..*
pertenece
Alumno Libro
1..3 0..1
se le ha prestado
1.71
1.4.2. Agregacin

Una clase especial de relacionamiento puede existir entre objetos / clases:

Algunas veces los objetos / clases estn formados por otros objetos.

Un objeto est compuesto por otros objetos.

Este tipo especial de relacionamiento se llama agregacin.

Un objeto es Iabricado con otros objetos.

Ejemplos:

Auto:
Transmision
Tubo de escape
Motor
Suspension
Ruedas

Ventana:
Botones
Labels
Menus


Se utiliza el simbolo en un extremo del relacionamiento para indicar
la agregacion.


1.72
Ejemplo 1:














Ejemplo 2:


















Chassis Cpu RAM Ventilador
Computador
Monitor
Caja
sistema
Mouse Teclado
1 1 1 1
1 1 1 1
Libro
Cubierta Tabla de
contenido
s
Capitulo Indice
Pagina
ParraIo
Palabra
1..`
1..` 0..1
1..`
1..`
1 1
1.73
1.4.3. Navegabilidad

Se pueden agregar Ilechas en los relacionamientos para indicar
navegabilidad.




A partir de la orden de compra, se puede conocer el cliente asociado.
A partir de un cliente no se puede conocer las ordenes de compra que
tiene asociadas.

La responsabilidad no es simetrica, existe solo resposabilidad a un lado de la
linea.

1.5. Implementacin de las asociaciones

1.5.1. Asociacin 1:1




Ejemplo: Asociacion entre Universidad y Rector.

A



Ref. B.
B



Ref. A.
A B
1 1
Orden
Compra
Cliente
1
`
1.74
Ejercicio
Un medico tiene asociado un rut (string), nombre, registro medico (string) y
especialidad. Un paciente tiene un rut, nombre, diagnostico y medico de
cabecera (solo 1).
Crear las clases necesarias que permitan realizar lo siguiente:
a) Ingresar un medico
b) Ingresar un paciente (solo rut y nombre)
c) Ingresar el diagnostico de un paciente
d) Asignar un medico a un paciente

Nota: Parta haciendo el diagrama de clases correspondiente y un reIino de la
solucion

Solucin
Diagrama de Clases







Refino de la solucin
main( )
Crear el objeto medico
Crear el objeto paciente
Ingresar diagnostico del objeto paciente
Asociar el objeto medico al objeto paciente
}

Medico

- String rutM
- String nombreM
- String regMedico
- String especialidad

Medico()
get y set ..
Paciente

- String rutP
- String nombreP
- String disgnostico
- Medico reIMedico
Paciente ()
setDiagnostico()
getReIMedico(): Medico
asociarMedico()
* 1
setReIMedico()
1.75
class Medico
private String rutM;
private String nombreM;
private String regMedico;
private String especialidad;

public Medico(String ru, String nom, String reg, String esp)
rutM ru;
nombreM nom;
regMedico reg;
especialidad esp;
}
get y set ..
] //Fin clase Medico

class Paciente
private String rutP;
private String nombreP;
private String diagnostico;
private Medico refMedico;

public Paciente (String rutP, String nombreP)
this.rutP rutP;
this.nombreP nombreP;
reIMedico null;
diagnostico null;
}
public void setDiagnostico(String diag)
diagnostico diag;
}
public void asociarMedico(Medico m) //setRefMedico()
reIMedico m;
}
public Medico getRefMedico ()
return reIMedico;
}
] //Fin clase Paciente
1.76
class App
public static void main (String | | args)
Medico m1 new Medico('111-k, 'Juan Perez,
'151-5, 'cardiologo);
Paciente p1 new Paciente('222-1, 'Pedro Soto);
p1.setDiagnostico('Apendicitis);
p1.asociarMedico(m1);
}
}






m1: Medico

rutM111-k

nombreMJuan Perez

regMedico151-5

especialidadcardiologo

p1: Paciente

rutP222-1

nombrePPedro Soto

DiagnosticoApendicitis

reIMedico
Diagrama de Objetos
1.77
1.5.2. Asociacin 1: N





Ejemplo: Asociacion entre Departamento y ProIesor.










1.5.3. Asociacin N: N





Ejemplo: Asociacion entre Producto y Cliente.










A B
A



Conjunto
de ref.
B



Ref. A.


A



Conjunto
Ref. B.
B



Conjunto
Ref. A.
1..n 1
A
B
1..n 1..n
1.78
1.6 Arreglos en 1ava

Ejemplo
Crear un arreglo de enteros; ingresar 10 datos; buscar el valor 66; desplegar
los 10 datos; remover el item con valor 55 y desplegar los 9 datos restantes.

Solucin, mediante una versin procedural tradicional

// Muestra el uso de arreglos en 1ava
// Para correr este programa: C>java ArrayApp

import java.io.`; // para la E/S
////////////////////////////////////
class ArrayApp

public static void main(String] args) throws IOException
int|| arr; // referencia al arreglo
arr new int|100|; // crea un arreglo de 100 elementos
int nElems 0; // cantidad inicial de datos en el arreglo
int j; // para manejar las iteraciones
int claveBusqueda; // dato a buscar en el arreglo
//----------------------------------
arr|0| 77; // insertar 10 valores en el arreglo
arr|1| 99;
arr|2| 44;
arr|3| 55;
arr|4| 22;
arr|5| 88;
arr|6| 11;
arr|7| 00;
arr|8| 66;
arr|9| 33;
nElems 10; // arreglo actual contiene 10 valores

Necesario slo si se deben
leer los datos por teclado
1.79
//----------------------------------
Ior(j0;jnElems; j) //mostrar los datos contenidos en el arreglo
System.out.print(arr|j| " ");
System.out.println("");
//--------------------------------------
claveBusqueda 66; // inicializa el valor del dato a
//buscar en el arreglo (66)
// buscar dato en el arreglo
Ior(j0; j nElems; j) // para cada elemento del arreglo
iI(arr|j| claveBusqueda) // se encuentra el dato?
break; // si, salir del ciclo for
iI(j nElems) // dato no se encuentra?
System.out.println("Dato no se encuentra " claveBusqueda);
else // dato se encuentra
System.out.println("Dato se encuentra " claveBusqueda);
//----------------------------------
claveBusqueda 55; // eliminar dato con valor 55
Ior(j0; j nElems ; j) // buscar el dato
iI(arr|j| claveBusqueda)
break;
Ior(int kj; k nElems-1 ; k)
arr|k| arr|k1|; // desplazamiento a la izquierda de los datos
nElems--; // tamao actual del arreglo disminuye en uno
//--------------------------------------
Ior(j0; jnElems; j) // mostrar el arreglo actual
System.out.print(arr|j| " ");
System.out.println("");

} // end main()
} // end class ArrayApp

Nota:
El subindice de un arreglo parte de 0.
El print y el println Iuncionan igual que en Pascal.
1.80
1.6. Arreglos utilizados para implementar contenedores de datos u
objetos


Definir una clase Contenedor:

Mejorar la interIace con los clientes de la clase.

El usuario de la clase, en este caso Contenedor, debe estar libre para
concentrarse en qu?, en vez de cmo?

Que va a ser insertado?
Que va a ser eliminado?
Que va a ser accesado?, en vez de conocer Como estas
actividades son llevadas a cabo?

El contenedor debe tener metodos metodos tales como: buscar, eliminar,
agregar, etc.
















Contenedor
- double | | a
- int nElems
Contendedor()
encontrar(): double
insertar(): boolean
eliminar(): boolean
getTam(): int
getElemI(): double
1.81
// Contenedor.java
// Para correr este programa: C>java ContenedorApp

import java.io.`; // para E/S

class Contenedor

private double|| a; // referencia el arreglo
private int nElems;// nmero de items
private int max; //Maxima cantidad de elementos para el contenedor

//----------------------------------
public Contenedor(int max) // constructor
a new double|max|;//crea el arreglo
nElems 0; // no tiene items todavia
this.max max;
]

//-----------------------------------
public boolean encontrar(double claveBusqueda)
// encuentra el valor especificado
int j;
Ior(j0; jnElems; j) // para cada elemento
iI(a|j| claveBusqueda) // item encontrado?
break; // sale del loop

iI(j nElems) //no lo encontr
return Ialse;
else
return true; // si lo encontr
} // end econtrar()



1.82
//-----------------------------------
public boolean insertar(double valor) // inserta elemento en
//el contenedor
iI (nElems max) //Hay espacio
a|nElems| valor; // lo inserta
nElems; // incrementa el tamao
return true;
else
return Ialse;
}
//-----------------------------------
public boolean eliminar(double valor)
int j;
Ior(j0; jnElems; j)//buscar el valor
iI( valor a|j| )
break;
iI(jnElems) // no lo encontr
return Ialse;
else // si lo encontr
Ior(int kj; knElems - 1; k)
a|k| a|k1|; //Corrimiento
nElems--; // decrementa el tamao
return true;
}
] // end eliminar()
//-----------------------------------
public int getTam()
return nElems;
}
//-----------------------------------
public double getElem(int i)
return a|i|;
}
]// end class Contenedor

int j 0;
while( jnElems && valor!a|j|)
j;

1.83
class ContenedorApp
public static void main(String|| args)
int tamMaximo 100; // tamao del contenedor
Contenedor arr; // reIerencia al arreglo
arr new Contenedor(tamMaximo); //crea el contenedor
arr.insertar(77); // inserta 10 items
arr.insertar(99);
arr.insertar(44);
arr.insertar(55);
arr.insertar(22);
arr.insertar(88);
arr.insertar(11);
arr.insertar(00);
arr.insertar(66);
arr.insertar (33);
//Despliga los items del contenedor
Ior (int i 0; i arr.getTam() ; i)
System.out.println(arr.getElem(i));
int claveBusqueda 35; // busca el item
iI( arr.encontrar(claveBusqueda))
System.out.println("Encontrado " claveBusqueda);
else
System.out.println("No Encontrado " claveBusqueda);
arr.eliminar(00); // elimina 3 items
arr.eliminar(55);
arr.eliminar(99);
//Despliga los items del contenedor
Ior (int i 0; i arr.getTam() ; i)
System.out.println(arr.getElem(i));

} // end main()

} // end class ContenedorApp
1.84
Nota: Hacer los cambios necesarios en el metodo eliminar, de tal manera
que este haga uso del metodo encontrar.


Ejercicio
En el ejemplo anterior, la estructura de datos, almacena datos de un tipo
primitivo. El siguiente ejemplo, muestra como guardar objetos.













// Persona.java
// Contenedor contiene items que son Persona
// Para correr este programa: C>java ClassDataApp

import java.io.`; // para E/S
///////////////////////////////////////
class Persona
private String apellido;
private String nombre;
private int edad;

Persona()
getApellido():String
getNombre(): String
getEdad(): int
Persona
- String apellido
- String nombre
- int edad
`
ListaPersonas()
encontrarPersona(): Persona
insertar()
eliminar(): boolean
getTam(): int
getElemI(): Persona
ListaPersonas
- Persona | | a
- int nElems
1.85
//----------------------------------
public Persona(String ap, String nom, int ed) //constructor
apellido ap;
nombre nom;
edad ed;
}
//----------------------------------
public String getNombre() //Obtiene el nombre
return nombre;
}
//----------------------------------
public String getApellido() // obtiene el apellido
return apellido;
}
//----------------------------------
public int getEdad() // obtiene la edad
return edad;
}

public set..

} // end class Persona


class ListaPersonas
private Persona|| a; // referencia al arreglo
private int nElems; // cantidad de items

//-----------------------------------
public ListaPersonas(int max) // constructor
a new Persona|max|; // crea el arreglo
nElems 0; // no hay items todavia
}

1.86
public Persona encontrarPersona(String apellido)
//encuentra valor especificado

int j;
Ior(j0; jnElems; j) //para cada elemento,
iI( a|j|.getApellido().equals(apellido) ) //item encontrado?
break; // sale del loop
iI(j nElems)
return null; // no lo encontr
else
return a|j|; // lo encontr
} // end encontrarPersona()
//-----------------------------------
// inserta una persona en el contenedor
public void insertar(String ap, String nom, int ed)
a|nElems| new Persona(ap, nom, ed);
nElems; // incrementa el tamao
}
//-----------------------------------
public boolean eliminar(String apellido)
// elimina la persona del contenedor
int j;
Ior(j0; jnElems; j)
iI(a|j|.getApellido().equals(apellido))
break;
iI(jnElems) // no lo encontr
return Ialse;
else // lo encontr
Ior(int kj; knElems - 1; k) //corrimiento
a|k| a|k1|;
nElems--; // decrementa el tamao
return true;
}
} // end eliminar()
1.87
//-----------------------------------
public int getTam()
return nElems;
}
//-----------------------------------
public Persona getElemI(int i)
return a|i|;
}

} // end class ListaPersonas



class ClassDataApp

public static void main(String|| args)

int maxSize 100; // tamao del arreglo
ListaPersonas arr; // referencia al arreglo
arr new ListaPersonas(maxSize); // crea el arreglo

// inserta 10 items
arr.insertar("Martinez", "Jose", 24);
arr.insertar("Tapia","Luis",37);
arr.insertar("Viorklumds", "Jorge", 43);
arr.insertar("Ferrada", "Cecilia", 63);
arr.insertar("Vega","Carlos",21);
arr.insertar("Salazar","Rozana", 29);
arr.insertar("Galleguillos","Ingrid",72);
arr.insertar("AlIaro","Eduardo",54);
arr.insertar("Sanchez", "Yazmin", 22);
arr.insertar("Vergara","Vladimir",18);
1.88
// despliega los items
Ior(int i 0, i arr.getTam() ; i)
Persona p arr.getElem(i);
System.out.println(p.getApellido() p.getNombre()
p.getEdad());
}

String apellido "Martinez"; // busca el item
Persona Iound;
Ioundarr.encontrarPersona(apellido);
iI(Iound ! null)
System.out.print("Encontrado ");
System.out.println(Iound.getApellido()
Iound.getNombre() Iound.getEdad());
}
else
System.out.println("No encontrado " apellido);

System.out.println("Eliminando Viorklumds, Vega, and
AlIaro"); // elimina 3 items
arr.eliminar("Viorklumds ");
arr.eliminar("Vega ");
arr.eliminar("AlIaro ");

// despliega los items nuevamente
Ior(int i 0, i arr.getTam() ; i)
Persona p arr.getElem(i);
System.out.println(p.getApellido() p.getNombre()
p.getEdad());
}
} // end main()

} // end class ClassDataApp

1.89
Nota: Si se necesita desplegar muchas veces las personas del contenedor,
se podria hacer un metodo estatico en la clase de la aplicacion, de manera de
no repetir el codigo.


class ClassDataApp

// despliega los items
public static void desplegarPersonas(ListaPersonas a)
Ior(int i 0, i a.getTam() ; i)
Persona p a.getElem(i);
System.out.println(p.getApellido() p.getNombre()
p.getEdad());
}
}


public static void main(String|| args)
....
// inserta 10 items
arr.insertar("Martinez", "Jose", 24);
arr.insertar("Tapia","Luis",37);
....

ClassDataApp.desplegarPersonas(arr);
....
arr.eliminar("Viorklumds ");
....
ClassDataApp.desplegarPersonas(arr);

} // end main()

} // end class ClassDataApp

1.90
Ejercicio

Se necesita manejar inIormacion de un pais y sus ciudades. Para un pais
interesa saber su nombre, idioma y cantidad de habitantes. Para una ciudad,
su nombre, alcalde (suponga que solo 1 alcalde por ciudad) y cantidad de
habitantes. Se pide que haga un programa en Java que:
Ingrese el pais Chile. Suponga que tiene 15.000.000 de habitantes.
Ingrese N ciudades de Chile, donde N se lee desde pantalla (lea desde
pantalla los datos de cada ciudad)
Una vez ingresada la inIormacion del pais y sus ciudades, despliegue el
nombre del pais y el nombre de cada una de sus ciudades.

Nota: Comience haciendo el diagrama de clases y un reIino de la solucion


Diagrama de Clases











Pais


- String nombreP
- String idioma
- int cantHabP
- Ciudad | | reICiudades
- int cantCiudades

Pais( )
getNombre(): String
getCantCiudades(): int
getCiudad(i): Ciudad
asociaCiudad() //ingresaCiudad

Ciudad


- String nombreC
- String alcalde
- int cantHabC

Ciudad( )
getNombreC(): String
get y set..


1
1 .. *
1.91
Refino de la solucin
main( )
Crear el objeto pais (p)
Leer N
Ior i 1 to N
Crear el objeto ciudad (c)
Asociar el objeto ciudad al objeto pais (de pais a ciudad)
end Ior
desplegar el nombre del pais y el nombre de sus ciudades
}

~desplegar la informacin del pas y sus ciudades
desplegar nombre del pais
Obtener la cantidad de ciudades del pais (N)
Para cada ciudad (Ior I 0 to N 1):
Obtener la ciudad
obtener su nombre
desplegar el nombre

class Ciudad
private String nombreC;
private String alcalde;
private int cantHabC;

public Ciudad (String nom, String alc, int cant)
nombreC nom;
alcalde alc;
cantHabC cant;
}
public String getNombreC ( )
return nombreC;
}
get y set ...
}
1.92
class Pais
private String nombreP;
private String idioma;
private int cantHabP;
private Ciudad | | reICiudades;
private int cantCiudades;

public Pais (String nom, String, id, int cant, int max)
nombreP nom;
idioma id;
cantHabP cant;
reICiudades new Ciudad|max|;
cantCiudades 0;
}

public void asociaCiudad (Ciudad c) //ingresa ciudad
reICiudades|cantCiudades| c;
cantCiudades ;
}

public String getNombreP ( )
return nombreP;
}

public int getCantCiudades( )
return cantCiudades;
}

public Ciudad getCiudad (int i )
return reICiudades|i|;
}
}


1.93
class App

public static void main(String | | args)
System.out.print('Ingrese cantidad de ciudades de Chile);
int N Lectura.getInt();

Pais p new Pais ('Chile, 'Espaol, 16000000, N);

Ior (int I 1; I N; I)
System.out.print('Ingrese nombre ciudad);
String nom Lectura.getString();
System.out.print('Ingrese Alcalde);
String alcalde Lectura.getString();
System.out.print('Ingrese cantidad de habitantes);
int cant Lectura.getInt();
Ciudad c new Ciudad(nom, alcalde, cant);
p.asociaCiudad( c );
}

// Desplegar datos en pantalla del pas y sus ciudades
System.out.println(p.getNombreP( ));
int N p.getCantCiudades();
Ior (i 0; i N ; i)
Ciudad c p.getCiudad(i);
System.out.println(c.getNombreC( );
}

}

}




1.94
Diagrama de Objetos































p: Pais

nombreP Chile
idiomaEspaol
cantHabP15000000

reICiudades

cantCiudades 3
c: Ciudad

nombreC Concepcion
alcalde Jacqueline
cantHabC 1000000


c: Ciudad

nombreC Santiago
alcalde Lavin
cantHabC 5000000


c: Ciudad

nombreC AntoIagasta
alcalde Adaro
cantHabC 400000


1.95
Otra versin del mismo problema

Diagrama de Clases










public
class Pais
private String nombreP;
private String idioma;
private int cantHabP;
private ListaCiudades reICiudades;

public Pais (String nom, String id, int cant,
int max)
nombreP nom;
idioma id;
cantHabP cant;
reICiudades new ListaCiudades(max);
}
Pais


- String nombreP
- String idioma
- int cantHabP
- ListaCiudades reICiudades

Pais( )
get y set()..
getReICiudades(): ListaCiudades

1
Ciudad

- String nombreC
- String alcalde
- int cantHabC

Ciudad( )
get y set().

ListaCiudades

- Ciudad || lc
- int cantCiudades

ListaCiudades( )
getCantCiudades(): int
insertarCiudad()
getCiudad(i): Ciudad

*
1.96
public int getCantHabP()
return cantHabP;
}
public String getIdioma()
return idioma;
}
public String getNombreP()
return nombreP;
}
public ListaCiudades getRefCiudades()
return reICiudades;
}
}

public class Ciudad
private String nombreC;
private String alcalde;
private int cantHabC;

public Ciudad (String nom, String alc, int cant)
nombreC nom;
alcalde alc;
cantHabC cant;
}
public String getAlcalde()
return alcalde;
}
public int getCantHabC()
return cantHabC;
}
public String getNombreC()
return nombreC;
}
]
1.97
public class ListaCiudades
private Ciudad || lc;
private int cantCiudades;

public ListaCiudades (int max)
lc new Ciudad |max|;
cantCiudades 0;
}

public int getCantCiudades()
return cantCiudades;
}

public Ciudad getCiudad(int i)
return lc|i|;
}

public void insertarCiudad(Ciudad c)
lc|cantCiudades| c;
cantCiudades ;
}

]




public class App1

public static void main(String|| args)

System.out.print("Ingrese cantidad de ciudades de Chile");
int N Lectura.GetInt();

1.98
Pais p new Pais ("Chile", "Espaol", 15000000, N);

ListaCiudades lc p.getReICiudades();

Ior (int I 1; I N; I)
System.out.print("Ingrese nombre ciudad");
String nom Lectura.GetString();
System.out.print("Ingrese Alcalde");
String alcalde Lectura.GetString();
System.out.print("Ingrese cantidad de habitantes");
int cant Lectura.GetInt();

Ciudad c new Ciudad(nom, alcalde, cant);
lc.insertarCiudad(c); //p.getRefCiudades().insertarCiudad(c)
}

// Desplegar datos en pantalla del pas y sus ciudades
System.out.println(p.getNombreP( ));

lc p.getReICiudades();

N lc.getCantCiudades();
Ior (int i 0; i N ; i)
Ciudad c lc.getCiudad(i);
System.out.println(c.getNombreC( ));
}

}

]

1.99
Ejercicio

Se desea construir un programa que maneje inIormacion de paises y de
ciudades. Un pais esta relacionado con varias ciudades; una ciudad esta
relacionada con un unico pais.

Datos asociados a un pas son:
Nombre del pais.
Cantidad de habitantes.
Idioma que se habla (solo uno).
Continente en que se encuentra.

Datos asociados a una ciudad son:
Nombre de la ciudad.
Cantidad de universidades que tiene la ciudad.
Cantidad de museos que tiene la ciudad.

Se pide, un programa que haga:

a) Ingreso de datos de paises y ciudades.
b) Dado el nombre del pais, encontrar el nombre de las ciudades
relacionadas.
c) Cantidad de paises europeos (Continente 'Europa).
d) Indicar el nombre del pais que tiene mayor cantidad de habitantes.
e) Dado el nombre de una ciudad encontrar los datos del pais relacionado.

La solucin debe contener:

Descripcion de las clases utilizadas en la solucion del problema.
Programa principal, que eIectue las tareas solicitadas.

1.100
Diagrama de Clases

































ListaPaises

- Pais || lp
- int cantPaises

ListaPaises()
ingresarPais()
ubicaPais(): Pais
cantPaisesEurop()int
PaisMayorCantHab(): Pais
Pais

- String nombrePais
- int cantHabit
- String idioma
- String continPais
- ListaCiudades reICiudades

Pais()
Metodos get
getReICiudades(): ListaCiudades
Ciudad

- String nombreCiudad
- int cantUniv
- int cantMuseos
- Pais reIPais

Ciudad()
Metodos get
asociaPais()//setReIPais()
1
*
ListaCiudades

- Ciudad || lc
- int cantCiudades

ListaCiudades()
ingresarCiudad()
ubicaCiudad(): Ciudad
*
1
1.101
public class Ciudad
private String nombreCiudad;
private int cantMuseos;
private int cantUniv;
private Pais reIPais;

public Ciudad(String nc,int cm, int cu)
nombreCiudad nc;
cantMuseos cm;
cantUniv cu;
reIPais null;
}

public void asociaPais(Pais p)
reIPais p;
}

public int getCantMuseos()
return cantMuseos;
}

public int getCantUniv()
return cantUniv;
}

public String getNombreCiudad()
return nombreCiudad;
}

public Pais getRefPais()
return reIPais;
}
}

1.102
public class Pais
private String nombrePais;
private int cantHabit;
private String idioma;
private String continPais;
private ListaCiudades reICiudades;

public Pais(String np, int ch, String i, String cp, int N)
nombrePais np;
cantHabit ch;
idioma i;
continPais cp;
reICiudades new ListaCiudades(N);
}

public int getCantHabit()
return cantHabit;
}

public String getContinPais()
return continPais;
}

public String getIdioma()
return idioma;
}

public String getNombrePais()
return nombrePais;
}

public ListaCiudades getRefCiudades()
return reICiudades;
}
}
1.103
public class ListaPaises
private Pais ||lp;
private int cantPaises;

public ListaPaises(int N)
lp new Pais |N|;
cantPaises 0;
}

public void ingresarPais(Pais p)
lp|cantPaises| p;
cantPaises ;
}

public int getCantPaises()
return cantPaises;
}

public Pais getPais(int i)
return lp|i|;
}

public Pais ubicaPais(String np)
int i;
Ior(i 0; i cantPaises; i)
iI (lp|i|.getNombrePais().equals(np))
break;
}
iI (i cantPaises)
return null;
else
return lp|i|;
}

1.104
public int cantPaisesEuropeos()
int contPaisesEuropeos 0;
Ior (int i 0; i cantPaises; i)
iI (lp|i|.getContinPais().equals("Europa"))
contPaisesEuropeos;
}
return contPaisesEuropeos;
}

public Pais paisMayorCantHabit()
int mayor 0;
Pais p null;
Ior (int i 0; i cantPaises; i)
iI (lp|i|.getCantHabit()~ mayor)
mayor lp|i|.getCantHabit();
p lp|i|;
}
}
return p;
}
}

public class ListaCiudades
private Ciudad ||lc;
private int cantCiudades;

public ListaCiudades(int N)
lc new Ciudad |N|;
cantCiudades 0;
}

public void ingresarCiudad(Ciudad c)
lc|cantCiudades| c;
cantCiudades ;
}
1.105
public int getCantCiudades()
return cantCiudades;
}

public Ciudad getCiudad(int i)
return lc|i|;
}

public Ciudad ubicaCiudad(String nc)
int i;
Ior(i 0; i cantCiudades; i)
iI (lc|i|.getNombreCiudad().equals(nc))
break;
}

iI (i cantCiudades)
return null;
else
return lc|i|;
}
}

import java.io.IOException;

public class App

public static void main(String|| args) throws IOException

System.out.print("Ingrese cantidad de paises ");
int N Lectura.GetInt();

ListaPaises lp new ListaPaises(N);
ListaCiudades lc new ListaCiudades(1000);

1.106
Ior(int i 0; i N; i)
System.out.println("Ingrese datos de un pais ");
System.out.print("Ingrese nombre pais ");
String np Lectura.GetString();
System.out.print("Ingrese idioma pais ");
String id Lectura.GetString();
System.out.print("Ingrese cantidad de habitantes pais ");
int ch Lectura.GetInt();
System.out.print("Ingrese continente ");
String con Lectura.GetString();
System.out.print("Ingrese cant. de ciudades del pais "
np);
int cc Lectura.GetInt();

Pais p new Pais(np, ch, id, con, cc);
lp.ingresarPais(p);

Ior (int j 0; j cc ; j)
System.out.println("Ingrese datos de una ciudad ");
System.out.print("Ingrese nombre ciudad ");
String nc Lectura.GetString();
System.out.print("Ingrese cantidad de
universidades ");
int cu Lectura.GetInt();
System.out.print("Ingrese cantidad de museos ");
int cm Lectura.GetInt();

Ciudad c new Ciudad(nc,cm, cu);
c.asociaPais(p);
lc.ingresarCiudad(c);

p.getReICiudades().ingresarCiudad(c);
}
}
1.107
System.out.print("Ingrese el nombre de un pais, para buscar
sus ciudades ");
String np Lectura.GetString();
Pais p lp.ubicaPais(np);
iI (p ! null)
ListaCiudades lc1 p.getReICiudades();
int cc lc1.getCantCiudades();
Ior (int i 0; i cc; i)
System.out.println("Ciudad "
lc1.getCiudad(i).getNombreCiudad());
}
else
System.out.println("No existe el pais " np);

System.out.println("cantidad de paises europeos:"
lp.cantPaisesEuropeos());

p lp.paisMayorCantHabit();
iI (p ! null)
System.out.println("Pais con mayor cantidad de
habitantes "
p.getNombrePais());
}
else
System.out.println("No existe ningun pais " );


1.108
System.out.print("Ingrese el nombre de una ciudad,
para encontrar el pais asociado");
String nc Lectura.GetString();
Ciudad c lc.ubicaCiudad(nc);

iI (c ! null)
System.out.println("pais asociado a la ciudad " nc
"es " c.getReIPais().getNombrePais());
}
else
System.out.println("No existe la ciudad " nc);
}

}


1.109
Otra versin

Diagrama de clases







ListaPaises

- Pais || lp
- int cantPaises

ListaPaises()
ingresarPais()
ubicaPais()
cantPaisesEurop(): int
PaisMayorCantHab():Pais
Pais

- String nombrePais
- int cantHabit
- String idioma
- String continPais
- Ciudad || reICiudad
- int cantCiudad

Pais()
Metodos get
asociaCiudad() //ingresarCiudad()
Ciudad

- String nombreCiudad
- int cantUniv
- int cantMuseos
- Pais reIPais

Ciudad()
Metodos get
getReIPais(): Pais
asociaPais() //setReIPais()
1..N 1
*
ListaCiudades

- Ciudad || lc
- int cantCiudades

ListaCiudades()
ingresarCiudad()
ubicaCiudad(): Ciudad
*
1.110
class Pais
private String nombrePais;
private int cantHabit;
private String idiomaPais;
private String continPais;
private Ciudad | |reICiudad;
private int cantCiudad;

// constructor
public Pais (String _nombrePais, int _cantHabit, String
_idiomaPais, String _continPais, int max)
nombrePais nombrePais;
cantHabit cantHabit;
continPais continPais;
idiomaPais idiomaPais;
cantCiudad 0;
reICiudad new Ciudad |max|;
] // fin del constructor

public void asociaCiudad (Ciudad c)
reICiudad |cantCiudad| c;
cantCiudad;
]

public String getNombrePais ( )
return (nombrePais);
]

]//fin class Pais


1.111
class Ciudad
private String nombreCiudad;
private int cantUniv;
private int cantMuseos;
private Pais reIPais;

// constructor
public Ciudad (String nombreCiudad, int cantUniv,
int cantMuseos)
nombreCiudad nombreCiudad;
cantUniv cantUniv;
cantMuseos cantMuseos;
reIPais null;
]//fin rutina constructora

public void asociaPais (Pais p) //setRefPais(Pais p)
reIPais p;
]
]// Fin clase Ciudad

class ListaPaises
private Pais | | lp;
private int cantPaises;

// constructor
public ListaPaises (int max)
lp new Pais |max|;
cantPaises 0;
] // fin del contructor

public void ingresaPais (Pais p)
lp |cantPaises| p;
cantPaises ;
]
1.112
public Pais ubicaPais(string _nombrePais)
int j;
Ior (j 0; j cant paises; j)
Pais p lp| j|;
iI (p. getNombrePais ( ). equals (nombrePais))
return(p);
};
return (null);
]
]// Fin clase ListaPaises

// Programa Principal
public static void main (String ]args)
ListaPaises lp new ListaPaises(10);
ListaCiudades lc new ListaCiudades (30);
Pais p;
Ciudad c;

//para cada pas
p new Pais (nombrePais,cantHabit,
idiomaPais, contPais, 5);

lp.ingresaPais(p);
//para cada Ciudad del pas

c new Ciudad (nombreCiudad,
cantUniv,
cantMuseos);
lc. ingresaCiudad(c);

// asociacion pais - ciudad
p. asociaCiudad (c);
// asociacion ciudad - pais
c. asociaPais(p):
En un
Ciclo
Interno
En un
Ciclo
Externo
1.113
Nota
Respecto a la implementacion de las asociaciones, M. Fowler, M. en su libro
'UML DISTILLED. Applying The Standard Object Modeling Language,
1997, pag. 157, recomienda que en el caso de un relacionamiento
bidireccional, sea una de las clases que participan en el relacionamiento, la que
tenga la responsabilidad de actualizar los enlaces.

Esta clase, es asistida en esta tarea por un 'Iriend metodo.

Modificaciones al cdigo anterior:

En la clase Pas:
//friend mtodo
void asociaCiudad (Ciudad c)
reI Ciudad |cantCiudad|c;
cantCiudad ;
}

En la clase Ciudad
public Ciudad (String nombreCiudad, int cantUniv, int
cantMuseos, Pais p)
nombreCiudad nombreCiudad;
cantUniv cantUniv;
cantMuseos cantMuseos;
refPais p;
p. asociaCiudad (this);
}

En el Programa Principal:
p new Pais ( nombrePais,cantHabit,idomaPais,cantPais, 5);
c new Ciudad (nombreCiudad, cantUniv, cantMuseos, p)

No se eIectua en Iorma explicita la asociacion en el programa principal!
1.114
Stack implementado mediante un arreglo
El stack es una lista en la que todas las inserciones y eliminaciones son
realizadas por un extremo de la lista

Listas Lifo Last-in, First-
out~~
Lista: Es un conjunto de n ~ 0
item de datos.




Descripcin formal del tipo de dato STACK





















D
C
B
A
Insertar
o
Eliminar
Tope
Stack
Tipo de Dato Stack(item)
Declare Create( )stack
ADD(item,stck) stack
DELETE(item,stack) stack
TOP(item,stack) item
ISEMTS(item,stack) boolean;

Ior all S stack, i item sea

ISEMTS(Create) :: true
ISEMTS(ADD(i,S)) :: Ialse
DELETE(Create) :: error
DELETE(ADD(i,S)) :: S
TOP(Create) :: error
TOP(ADD(i,S)) :: i
end
end STACK

StackX
- int maxSize
- double | | satckArray
- int top

StackX()
push()
pop(): double
peek(): double
isEmpty(): boolean
isFull(): boolean
1.115

// stack.java
// demostracin de un stack
// para correr este programa: C>java StackApp

import java.io.`; //para E/S

class StackX
private int maxSize; //tamao del arreglo stack
private double|| stackArray;
private int top; //tope del stack

//-----------------------------------------------------
public StackX(int s) //constructor
maxSize s;
stackArray new double|maxSize|; //crea el arreglo
top -1; // no hay items aun
}

//-----------------------------------------------------
public void push(double j)//inserta el item en el tope del stack
stackArray|top| j; // incrementa el tope e inserta el item
}

//-----------------------------------------------------
public double pop() //toma el item desde el tope del stack
return stackArray|top--|; //accesa el item y decrementa el tope
}

//-----------------------------------------------------
public double peek()//obtiene el elemento del tope del stack
return stackArray|top|;
}

1.116
//-----------------------------------------------------
public boolean isEmpty() //verdadero si el stack est vaco
return(top -1);
}
//-----------------------------------------------------
public boolean isFull()//verdadero si el stack est lleno
return(top maxSize-1);
}

]//fin class StackX

class SatckApp

public static void main(String|| args)

StackX theStack new StackX(10); //crea un nuevo stack
theStack.push(20); // inserta el item en el satck
theStack.push(40);
theStack.push(60);
theStack.push(80);

while(!theStack.isEmpty()) //hasta que est vaco
double value theStack.pop(); //elimina el item del stack
System.out.print(value); //lo despliega
System.out.print(');
} //fin while
System.out.print(');

} //fin main()

]// fin class StackApp

Nota: En este caso el stack contenia double. Un stack tambien podra
contener cualquier tipo de objeto, por ejemplo persona.

1.117
Ejemplo: Utilizacion de un stack para invertir un string

// Para correr este programa: C>java ReverseApp
import java.io.`; //para E/S

class StackX
private int maxSize;
private char|| stackArray;
private int tope;

//--------------------------------------
public StackX(int max) // constructor
maxSize max;
stackArray new char|maxSize|;
tope -1;
}
//--------------------------------------
public void push(char j) // coloca el item en el tope del stack
stackArray|tope| j;
}
//--------------------------------------
public char pop()//elimina el item desde el tope del satck
return stackArray|tope--|;
}
//--------------------------------------
public char peek() //obtiene el elemento del tope del satck
return stackArray|tope|;
}
//--------------------------------------
public boolean isEmpty()//es verdadero si el satck est vaco
return (tope -1);
}
] // end class StackX

1.118
class Reverser
private String entrada; // string de entrada
private String salida; // string de salida

public Reverser(String in) // constructor
entrada in;
}

//--------------------------------------
public String doRev() // revierte el string

int stackSize entrada.length(); //obtiene el tamao
//mximo del stack

StackX theStack new StackX(stackSize); //hace el stack
Ior(int j0; jentrada.length();j)
char chentrada.charAt(j); //obtiene un caracter desde
//la entrada
theStack.push(ch); // lo coloca en el satck
}

salida "";
while( !theStack.isEmpty() )
char ch theStack.pop(); // saca un caracter del stack
salida salida ch; // agrega a la salida
}
return salida;

} // end doRev()

} // end class Reverser


1.119
class ReverseApp

public static void main(String|| args) throws IOException

String entrada, salida;

while(true)
System.out.print("Entre un string: ");
System.out.Ilush();
entrada Lectura.getString();
// lee un string desde teclado

iI( entrada.equals("") ) //se ingres un string vaco? ENTER]?
break;

Reverser theReverser new Reverser(entrada);

//revierte el string
salida theReverser.doRev();

System.out.println("String revertido: " salida);

} // end while

} // end main()

} // end class ReverseApp

1.120
Ordenamientos de arreglos

A) Ordenamiento de burbujas

// BubbleSort.java
// Demostracin de ordenamiento burbuja
// Para correr este programa: C>java BubbleSortApp

//-----------------------------------------------------------
class ArrayBub
private double|| a; // referencia al arreglo a
private int nElems; // nmero de items

//-----------------------------------------------------------
public ArrayBub(int max) // constructor
a new double|max|; //crea el arreglo
nElems 0; //no hay items todava
]

//-----------------------------------------------------------
public void insertar(double valor) //inserta un elemento al arreglo
a|nElems| valor; //lo inserta
nElems; // incrementa el tamao
]

//-----------------------------------------------------------
public int getTam()
return nElems;
]

//-----------------------------------------------------------
public double getElem(int i)
return a|i|;
]
1.121
//-----------------------------------------------------------
public void bubbleSort()
int out, in;

Ior(out nElems - 1; out ~ l; out--) //loop externo
Ior(in 0; in out; in) //loop interno
iI( a|in| ~ a|in1| ) //fuera de orden?
swap(in, in1);
]//fin bubbleSort()

//-----------------------------------------------------------
private void swap(int uno, int dos)
double temp a|uno|;
a|uno| a|dos| ;
a|dos| temp;
]

] // fin class ArrayBub


class BubbleSortApp

public static void main(String] args)

int TamaoMaximo 100;
ArrayBub arr;
arr new ArrayBub(TamaoMaximo);

arr.insertar(77) ;
arr.insertar(99) ;
arr.insertar(44) ;
arr.insertar(55) ;
arr.insertar(22) ;
arr.insertar(88) ;
1.122
arr.insertar(11) ;
arr.insertar(00) ;
arr.insertar(66) ;
arr.insertar(33) ;

//Despliega los items
Ior(int i 0; i arr.getTam(); i)
System.out.println(arr.getElem(i));

arr.bubbleSort(); // ordenamiento burbuja

//Despliega los items
Ior(int i 0; i arr.getTam(); i)
System.out.println(arr.getElem(i));

] // end main()

] //end class BubbleSortApp



Nota: Se podria tener un metodo static en la clase que se encargue de la
impresion de los datos del arreglo


1.123
B) Ordenamiento por seleccin

// selectSort.java
//Muestra el ordenamiento de seleccin
//Para correr este programa: C>java SelectSortApp

//--------------------------------------------------------
class ArraySel
private double|| a; //referencia al arreglo
private int nElems; // nmero de items

//---------------------------------------------------
public ArraySel(int max) // constructor
a new double|max|; //crea el arreglo
nElems 0; // no hay items todava
]

//--------------------------------------------------------
public void insertar(double valor) // inserta elemento
//en el arreglo
a|nElems| valor; //inserta un elemento al arreglo
nElems; //incrementa el tamao
]

//-----------------------------------------------------------
public int getTam()
return nElems;
]

//-----------------------------------------------------------
public double getElem(int i)
return a|i|;
]

1.124
//-------------------------------------------------------
public void selectionSort()
int out, in, min;

Ior(out 0; out nElems - l; out) //loop exterior

min out; //mnimo
Ior(in out 1; in nElems; in) //loop interior
iI( a|in| a|min| )
min in;

swap(out, min);

] //fin del for exterior

] //fin selectionSort

//-----------------------------------------------------
private void swap(int one, int two)
double temp a|one|;
a|one| a|two|;
a|two| temp;
]


]// fin clase ArraySel


1.125
class SelectSortApp

public static void main(String] args)

int TamaoMaximo 100; //tamao del arreglo
ArraySel arr; //referencia al arreglo
Arr new ArraySel(TamaoMaximo); //crea el arreglo

//inserta 10 elementos
arr.insertar(77);
arr.insertar(99);
arr.insertar(44);
arr.insertar(55);
arr.insertar(22);
arr.insertar(88);
arr.insertar(11);
arr.insertar(00);
arr.insertar(66);
arr.insertar(33);

//Despliega los items
Ior(int i 0; i arr.getTam(); i)
System.out.println(arr.getElem(i));

arr.selectionSort();

//Despliega los items
Ior(int i 0; i arr.getTam(); i)
System.out.println(arr.getElem(i));

] // end main()

] // fin clase SelectSortApp

1.126
C) Ordenamiento por insercin

// insertSort.java
// Muestra el ordenamiento de insercin
// Para correr este programa: C>java LnsertSortApp

//------------------------------------------------------
class ArrayIns
private double|| a; //referencia al arreglo a
private int nElems; //nmero de items

//------------------------------------------------------
public ArrayIns(int max) //constructor
a new double|max|; //crear arreglo
nElems 0; //no tiene items todavia
}

//------------------------------------------------------
public void insertar(double valor) //inserta elemento al arreglo
a|nElems| valor; //lo inserta
nElems; //incrementa el tamao
}

//-----------------------------------------------------------
public int getTam()
return nElems;
}

//-----------------------------------------------------------
public double getElem(int i)
return a|i|;
}

1.127
//------------------------------------------------------
public void insertionSort()
int in, out;
Ior(out1; outnElems; out)
double temp a|out|;
in out;
while(in~0 && a|in-1| ~ temp)
a|in| a|in-1|;
--in;
}
a|in| temp;
} //fin for

} //fin insertSort()

]//fin clase ArrayIns


class InsertSortApp

public static void main(String|| args)

int TamaoMaximo 100; //tamao del arreglo
ArrayIns arr; //referencia el arreglo
arr new ArrayIns(TamaoMaximo); //crea el arreglo

//inserta 10 elementos
arr.insertar(77) ;
arr.insertar(99) ;
arr.insertar(44) ;
arr.insertar(55) ;
arr.insertar(22) ;
arr.insertar(88) ;
arr.insartar(11) ;
1.128
arr.insertar(00) ;
arr.insertar(66) ;
arr.insertar(33) ;

//Despliega los items
Ior(int i 0; i arr.getTam(); i)
System.out.println(arr.getElem(i));

arr.insertionSort();

//Despliega los items
Ior(int i 0; i arr.getTam(); i)
System.out.println(arr.getElem(i));

} // fin main()

} // fin clase InsertSortApp



D) Ordenamiento de objetos













Persona

- String apellido
- String nombre
- int edad

Persona()
Metodos get

* ArrayInOb

- Persona || a
- int nElems

ArrayInOb()
insertar()
insertionSort()
getTam(): int
getElem(i): Persona

1.129
// objectSort.java
//Muestra ordenamiento de objetos(ordenamiento de insercin)
//Para correr este programa: C<java ObjectSortApp

class Persona
private String apellido;
private String nombre;
private int edad;

//------------------------------------------------
public Persona(String ap, String nom, int ed) //constructor
apellido ap;
nombre nom;
edad ed
}

//------------------------------------------------
public String getAp() // obtiene el apellido
return apellido;
}

}//fin clase Persona


class ArrayInOb
private Persona|| a; //referencia al arreglo
private int nElems; //nmero de tems

//------------------------------------------------
public ArrayInOb(int max) //constructor
a new Persona|max|; //crea el arreglo
nElems 0; //no hay items todava
}
1.130
//------------------------------------------------
public void insertar(String ap, String nom, int ed)
a|nElems| new Persona(ap, nom, ed);
nElems; //incrementa el tamao
}

//-----------------------------------------------------------
public int getTam()
return nElems;
}

//-----------------------------------------------------------
public Persona getElem(int i)
return a|i|;
}

//------------------------------------------------
public void insertionSort()
int in, out;
Ior(outl; outnElems; out)
Persona temp a|out|;
in out;
while(in~0 &&
a|in-1|.getAp().compareTo(temp.getAp ())~0)
a|in| a|in-1|;
--in;
}
a|in| temp;
} //fin del for;

} //fin insertionSort()

} //fin clase ArrayInOd

1.131
class ObjectSortApp
public static void main(String] args)
int TamaoMaximo 100; //tamao del arreglo
arrayInOb arr; //referencia al arreglo

arr new ArrayInoOb(TamaoMaximo) // crea el arreglo

arr.insertar("Martinez", "Jose", 24);
arr.insertar("Tapia","Luis",37);
arr.insertar("Viorklumds", "Jorge", 43);
arr.insertar("Ferrada", "Cecilia", 63);
arr.insertar("Vega","Carlos",21);
arr.insertar("Salazar","Rozana", 29);
arr.insertar("Galleguillos","Ingrid",72);
arr.insertar("AlIaro","Eduardo",54);
arr.insertar("Sanchez", "Yazmin", 22);
arr.insertar("Vergara","Vladimir",18);

System.out.println('Antes de ordenar:) ;
//Despliega los items
Ior(int i 0; i arr.getTam(); i)
Persona p arr.getElem(i);
System.out.println(p.getAp());
}

arr.insertionSort();

//Despliega los items
Ior(int i 0; i arr.getTam(); i)
Persona p arr.getElem(i);
System.out.println(p.getAp());
}
]//fin main()

]//fin clase ObjectSortApp


1.132
1.8 Herencia en 1ava

1.8.1. Concepto
Se permite deIinir una nueva clase B, como una extension de una clase
previa A.
B se denomina subclase de A y A se denomina superclase de B
B es la Clase derivada y A es la Clase base
Una subclase tipicamente aumenta o redeIine la estructura existente y el
comportamiento de su superclase.

Ejemplos:













Ejemplo
Se tiene una jerarquia de clases, Iormada por una clase base (Persona) y dos
clases derivadas (Empleado y Alumno), junto a la correspondiente deIinicion de
las propiedades, variables de instancia, y metodos, de cada una de ellas.
Como las clases Empleado y Alumno heredan propiedades de la superclase
Persona, los objetos asociados a estas clases tienen las propiedades deIinidas
para la clase propiamente tal, y las heredadas de la clase Persona.
Figura


Rectngulo Tringulo Crculo

Persona


Empleado Alumno

Cuenta Bancaria


Cuenta Corriente Cuenta de Ahorro
1.133
Superclase Persona, con subclase Alumno y Empleado



Persona
Persona
- nombre
- direccion
- fecha de nacimiento
- Inic-datos-persona
- Informa-datos-persona
Empleado
- num-empleado
- sueldo
- Inic-datos-empleado
- Informa-sueldo
Empleado Alumno
Variables de instancia:
Variables de instancia:
Metodos:
Metodos:
Alumno
- Informa-carrera
- Inic-datos-alumno
- num-alumno
- carrera
Variables de instancia:
Metodos:



1.134
Herencia de propiedades en una jerarqua de clases



- sueldo
Mtodos
- direccion
- Informa-carrera
Alumno
Variables de instancia:
PERSONA
- num-alumno
- carrera
- Inic-datos-alumno
+
Empleado
Variables de instancia:
- num-empleado
Mtodos:
- Inic-datos-empleado
- Informa-sueldo
PERSONA
+
Mtodos:
- Informa-datos-persona
- direccion
Variables de instancia:
- Inic-datos-empleado
Empleado
- Informa-sueldo
- nombre
- Iecha-nacimiento
- numempleado
- sueldo

- Inic-datos-persona
- Informa-carrera
- Inic-datos-alumno
Mtodos:
Variables de instancia:
Alumno
- nombre
- fecha-nacimiento
- Informa-datos-persona
- Inic-datos-persona
- num-alumno
- carrera


La habilidad de un lenguaje para soportar la herencia, distingue a los
lenguajes orientados al objeto, de los lenguajes basados en objetos.

Las reglas de herencia, permiten que un objeto de una subclase B puede
aparecer, donde quiera que un objeto de una superclase A es esperado.

1.135
Herencia simple: Hay una unica superclase.

Herencia Mltiple: Hay varias superclases.

JAVA tiene herencia simple !
Smalltalk : Herencia Simple
C : Herencia Multiple
EiIIel : Herencia Multiple


Las reglas de herencia son:

La herencia simple genera una jerarquia. En la raiz de la jerarquia se
encuentra la clase Object.

Todas las clases, excepto la clase Object, tienen exactamente una
superclase.

Una subclase hereda variables y metodos de su superclase.

Una subclase puede declarar variables y metodos, diIerentes de aquellos
heredados.

Los metodos en la subclase, pueden redeIinir a los metodos heredados
('OVERRIDE).

Una variable heredada tambien se puede redeIinir.


1.136
Ejemplo:

class Punto

protected int x,y;

public Punto(int x, int y)
this.x x;
this.y y;
}

]

class Punto3D0 extends Punto
private int z;

public Punto3D0(int x, int y, int z)
this.x x;
this.y y;
this.z z;
]

public Punto3D0()
this(-1, -1, -1);
]

]


En JAVA, si la clausula extends es omitida en la declaracion de una clase,
esta tendra en Iorma implicita a la clase Object como su superclase
inmediata, que es la raiz de la jerarquia de clases de JAVA.

Punto
# int x
# int y
Punto()
Punto3D0
- int z

Punto3D0()
1.137
De esta manera, todas las clases son subclases directas o indirectas de la
clase Object.

En JAVA, los paquetes son recipientes con clases, que se utilizan para
mantener el espacio de nombres de clase, dividido en compartimentos.

Por ejemplo, un paquete permite que se cree una clase llamada LISTA, que
se puede almacenar en un paquete propio, sin preocuparse por conIlictos con
otra clase llamada LISTA, escrita por otra persona.

Los paquetes se almacenan de una manera jerarquica y se importan
explicitamente, en las deIiniciones de clases nuevas.

Ejemplos:
java.applet
java.awt
java.io
java.lang
java.net
java.util

Nota: El compilador importa en Iorma implicita, el paquete java.lang, para
todos los programas.

El paquete java.lang contiene:
Object
Thread
Exception
System
String
Todos los elementos esenciales.
1.138
1erarquas de Clases en 1ava

La clase raiz en Java es Object.

class java.lang.Object

class java.lang.System class java.io.OutputStream

class java.io.FilterOutputStream

class java.io.PrintStream


1.8.2 Notacin

La representacion de la herencia, de acuerdo a la notacion utilizada por
UML.

















Superclase
Subclase1
Subclase2
1.139
Ejemplos:

































Cuenta
Bancaria

Cuenta
Ahorro

Cuenta
Corriente


Equipo


Bomba
Intercambiador
de Calor
Estanque

Estanque
EsIerico
Estanque
a Presion
.......
1.140



















1.8.3. Mensajes a super

Cuando una subclase sobrescribe un metodo heredado, el nombre especial
super, permite que el metodo sobrescrito sea usado, es decir usar el metodo
del padre.

Dentro de una subclase, un mensaje a super, invoca el metodo que la
superclase deberia usar para ese mensaje.


Rectngulo

Figura

Tringulo

Crculo

Cuadrado

1.141
Ejemplo: Se deIine la subclase Punto3D, que utiliza el constructor super para
inicializar las variables x e y, despues imprime el punto en 3D resultante.

class Punto
protected int x;
protected int y;

public Punto(int x, int y)
this.x x;
this.y y;
]
public int getX()
return x;
]
public int getY()
return y;
]
]

class Punto3D extends Punto
private int z;

public Punto3D(int x, int y, int z)
//llamado al constructor Punto(x,y)
super(x, y);
this.z z;
]
public int getZ()
return x;
]
public static void main (String args])
Punto3D p new Punto3D(10,20,30);
System.out.println("x " p.getX() " y " p.getY()
" z " p.getZ());
]
]
Resultado: x 10 y 20 z 30
1.142
Ejemplo:
class Punto
protected int x, y;
public Punto(int x, int y)
this.x x;
this.y y;
}
public int getX()
return x;
}
public int getY()
return y;
}
}

class Punto3D extends Punto
private int z;
public Punto3D(int x, int y, int z)
super(x, y); //llamado al constructor Punto(x,y)
this.z z;
}
public int getZ()
return z;
}
}

class Punto3DConstruct
public static void main(String args])
Punto3D p new Punto3D(10, 20, 30);
System.out.println("x " p.getX() " y "
p.getY() " z " p.getZ());
System.out.println("p " p);
}
}
Resultado:

x 10 y 20 z 30
p Punto3D 1cc807

Clase del Direccin
Objeto

1.143
Ejemplo
La clase Punto3D hereda de su superclase Punto la implementacion del
metodo de la distancia para puntos en 2D. Necesita por lo tanto sobrescribir
esa deIinicion con una nueva para puntos en 3D.

En la clase Punto3D hay sobrecarga de la distancia en 3D y hay redeIinicion
(sobrescritura) de la distancia en 2D.

class Punto
protected int x;
protected int y;

public Punto(int x, int y)
this.xx;
this.yy;
}

public int getX()
return y;
}

public int getY()
return y;
}

public double distancia(int x, int y)
int dx this.x - x;
int dy this.y - y;
return Math.sqrt(dx*dx dy*dy);
}

public double distancia(Punto p)
return this.distancia(p.x, p.y);
}
}
Punto
# int x
# int y
Punto()
getX(): int
getY(): int
distancia(): double
Punto3D
- int z

Punto3D ()
getZ(): int
distancia(): double
1.144
class Punto3D extends Punto
private int z;

public Punto3D(int x, int y, int z)
super(x, y);
this.z z;
}

public int getZ()
return z;
}

public double distancia(int x, int y,int z)
int dx this.x - x;
int dy this.y - y;
int dz this.z - z;
return Math.sqrt(dx*dx dy*dy dz*dz);
}

public double distancia(Punto3D otro)
return this.distancia(otro.x, otro.y, otro.z);
}

public double distancia(int x, int y)
double dx (this.x / z) - x;
double dy (this.y / z) - y;
return Math.sqrt(dx*dx dy*dy);
}

}

1.145
class Punto3DDist

public static void main(String args|| )

Punto3D p1 new Punto3D(30, 40, 10);
Punto3D p2 new Punto3D(0, 0, 0);
Punto p new Punto(4, 6);

System.out.println("p1 " p1.getX() ", " p1.getY()
", " p1.getZ());

System.out.println("p2 " p2.getX() ", " p2.getY()
", " p2.getZ());

System.out.println("p " p.getX() ", " p.getY());

System.out.println("p1.distancia(p2) " p1.distancia(p2));
//invoca al segundo mtodo distancia de la clase Punto3D

System.out.println("p1. distancia(4, 6) " p1.distancia(4, 6));
//invoca al tercer mtodo distancia de la clase Punto3D

System.out.println("p1. distancia(p) " p1.distancia(p));
//invoca al segundo mtodo distancia de la clase Punto
}
}




Nota: Svstem.out.println(p1.super.distancia(4,6)),
Invocaria al primer metodo distancia de la clase Punto
Resultado:
p1 30, 40, 10
p2 0, 0, 0
p 4, 6
p1.distancia(p2) 50.9902
p1.distancia(4,6) 2.23607
p1.distancia(p) 42.8
p1: Punto3D
x 30
y 40
z 10
p2: Punto3D
x 0
y 0
z 0
p: Punto
x 4
y 6

1.146
Notas:
Hay una tension importante, entre la herencia y el encapsulamiento.

El uso de la herencia expone alguno de los secretos de la clase
heredada.

En la practica, esto signiIica que para comprender el signiIicado de una
clase particular, a menudo se deben estudiar todas sus superclases,
incluyendo a veces su vista interna.


1.8.4. Seleccin de mtodo dinmica (Polimorfismo)

Cuando se aplica un metodo a un objeto, el tipo del objeto se comprueba
durante la compilacion, para asegurarse de que el metodo llamado existe en
la clase declarada.

Durante la ejecucion, el objeto puede corresponder a alguna subclase del
objeto declarado. En esos casos, se utiliza la instancia real, para decidir a que
metodo llamar, en el caso de que la subclase sobrescriba el metodo al que se
llama.

Polimorfismo 'LATE BINDING
(enlace tardio)

Polimorfismo en 1ava:

En Java todas las variables son polimorIicas.

Una variable declarada de una cierta clase, puede mantener valores de
cualquiera de sus subclases.

1.147
Ejemplo: Dos clases tienen una relacion subclase/superclase, con un
unico metodo que se sobrescribe en la subclase.

class A
void callme()
System.out.println("Inside A's callme method");
}
}

class B extends A
void callme()
System.out.println("Inside B's callme method");
}
}

class Dispatch
public static void main(String args||)
A a new B(); //a pertenece a la clase A.
// Se ha almacenado una referencia a una
//instancia de la clase B en ella.
a.callme(); //invoca a callme de la clase B.
}
}



El polimorIismo, es uno de los mecanismos mas poderosos que oIrece la
orientacion al objeto, para soportar la reutilizacion del codigo y la
robustez.

El ambiente de programacion, proporciona un gran numero de clases, las
que pueden ser adaptadas, mediante la herencia, a las necesidades de una
aplicacion en particular.

Resultado
Inside B`s callme method
1.148
1.8.5. Clase abstractas

A) Conceptos

Algunas de las clases tendran instancias, otras no.

La clase que no tienen instancias, se denomina clases abstractas.

Una clase abstracta es escrita con el proposito de que sus subclases le
agreguen estructura y comportamiento, a traves de completar la
implementacion de sus (usualmente) metodos incompletos.

No se pueden crear instancias de dichas clases directamente, con el
operador new.

Ejemplo:
Se desea construir una aplicacion que manipula Iiguras (circulos, triangulos
y rectangulos) en un sistema graIico, en base a las siguientes operaciones:
Indicar ubicacion de una Iigura.
Dibujar una Iigura en el terminal.
Imprimir una Iigura.
Rotar una Iigura.
Indicar el color de una Iigura.

Las caracteristicas del modelo orientado al objeto para deIinir clases y
hacer explicitas las propiedades comunes de las clases mediante el
mecanismo de la herencia, permite obtener la siguiente jerarquia de clases
como solucion al problema.

1.149
Clase Abstracta
Figura
Rectngulo Tringulo Crculo

Figura
Variables de instancia:
Centro
Color
Metodos:
Ubicar
Dibufar
Imprimir
Rotar
Color
Rectngulo

Variables de instancia:
Vertices

Metodos:
Dibujar
Imprimir
Rotar

Tringulo

Variables de instancia:
Limites

Metodos:
Dibujar
Imprimir
Rotar
Circulo

Variables de instancia:
Radio

Metodos:
Dibujar
Imprimir
Rotar
Mtodos Abstractos
1.150
Debe hacerse notar, que las clases Rectangulo, Triangulo y Circulo,
sobrescriben los procedimientos Dibujar, Imprimir y Rotar, los que son
especiIicos para cada una de las clases. En esta solucion, segun sea el
tipo de la inIormacion que se esta procesando, se ejecuta el
procedimiento adecuado para la situacion que se presenta; por ejemplo, si
el metodo Rotar se aplica a un objeto de la clase Rectangulo, el metodo
asociado a esa clase es ejecutado.

Para extender o reusar el sistema, basta con crear una subclase dentro de
la jerarquia de clases mostrada anteriormente, que agregue o modiIique
propiedades de la superclase, sin necesidad de modiIicar las clases
existentes.

Por ejemplo, si se desea incorporar la clase Cuadrado al sistema, solo se
modiIica la deIinicion de clases anterior.













La nueva clase sobrescribe los metodos Dibujar y Rotar, por
procedimientos especiIicos que se aplican solamente a las instancias de la
clase Cuadrado.



Figura
Rectngulo Tringulo Crculo
Cuadrado
Rotar
Dibujar
1.151
Clase abstracta
Es una clase que nuca es instanciada. Contiene los metodos comunes a
todas las subclases.
Es usada como una base, a partir de la cual, otras clases pueden heredar.

Mtodo Abstracto
Es un metodo cuya implementacion no es deIinida en la declaracion de la
clase en que aparece. Su deIinicion se hace en una clase descendente.

Ejemplo: Se tiene una clase con un metodo abstracto, seguida de una
clase que implementa ese metodo.

abstract class A //clase abstracta
abstract void callme(); //mtodo abstracto

void metoo()
System.out.println("Inside A's metoo method");
}
}

class B extends A
void callme()
System.out.println("Inside B's callme method");
}
}

class Abstract
public static void main(String args||)
A a new B();
a.callme();
a.metoo();
}
}
Resultado
Inside B`s callme method
Inside A`s metoo method
1.152
B)Ejemplos

Ejemplo 1: Cuenta bancaria

En un banco se manejan cuentas de ahorro y cuentas corrientes. Estos dos
tipos de cuenta son identicos, excepto en las siguientes diIerencias:
Las cuentas de ahorro se numeran como 1xxxxx, empezando por 100001.

Las cuentas corrientes se numeran como 5xxxx, empezando por 500001.

Las cuentas de ahorro no tienen un cargo mensual (mantencion), si el
saldo es superior a $200.000. Si no, se cobran $5.000 por mes. Las
cuentas corrientes pagan una cuota mensual de $5.000

Las cuentas corrientes no pagan ningun interes, hasta que el saldo supera
los $500.000. A las cuentas de ahorro siempre se les paga interes.

La aplicacion muestra el resultado de ingresar $100.000 al mes, tanto en
una cuenta corriente como en una cuenta de ahorro al 8 de interes anual.
Esto se hace por 10 meses. Se debe chequear que la tasa de interes este
entre 0 y 20.
1.153






















//Cuentas Bancarias

abstract public class CuentaBancaria //clase abstracta

// porcentaje de inters
protected static tasaInteres;
//variable de clase, visible para todos los objetos de la clase.

// balance - el saldo actual de la cuenta
protected int saldo;


CuentaBancaria
# double $ tasaInteres
# int saldo
CuentaBancaria()
getNumeroCuenta(). int
$ getTasaInteres(): double
$ setTasaInteres()
Depositar()
Girar()
Saldo(): int
Mensulamente()
Mantencion()
Interes()
CuentaCorriente
- int $ corrNumero
- int numeroCuenta

CuentaCorriente()
getNumeroCuenta(): int
Interes ()
CuentaAhorro
- int $ corrNumero
- int numeroCuenta
CuentaAhorro()
getNumeroCuenta(): int
Mantencion()
1.154
// constructor - abro la cuenta con un saldo
CuentaBancaria(double saldoInicial)
saldo saldoInicial;
}

// getNumeroCuenta - devuelvo el nmero de cuenta
abstract public int getNumeroCuenta(); //Mtodo abstracto.

// getTasaInteres - consulto el porcentaje de inters
public static double getTasaInteres()
return tasaInteres;
}

public static void setTasaInteres(double nuevaTasa)
// primero una comprobacion sensata
iI (nuevaTasa ~ 0.0 && nuevaTasa 20.0)
//chequea que la tasa de inters
//est entre 0 y 20
tasaInteres nuevaTasa;
}
}

// Depositar - ingreso algo en la cuenta
public void Depositar(int cantidad)
// ningn depsito negativo!
iI (cantidad ~ 0)
saldo cantidad;
}
}

1.155
//Girar - realizo un retiro (giro)
public void Girar(int cantidad)
iI (cantidad ~ 0)
// no le permito sacar ms de lo que tiene
iI (cantidad saldo)
saldo - cantidad;
}
}
}

// Saldo - devuelvo el saldo actual
public int Saldo()
return saldo;
}

// Cada mes cargo el inters y cuotas de servicios
public void Mensualmente()
Mantencion(); // primero la mantencion!
Interes ();
}

// Mantencion - cargo la cuota mensual
public void Mantencion()
saldo - 5000; // $5.000 por mes
}

// Interes - aado el inters mensual
public void Interest()
//se convierte a inters mensual
// 1200 porque el inters normalmente se expresa
// numricamente como 20, queriendo decir 0.2, y
//porque estamos acumulando el inters mensualmente
saldo saldo * (tasaInteres / 1200.0); //(8/12)/100
}
}
1.156
class CuentaCorriente extends CuentaBancaria
private static int corrNumero 500001;
private int numeroCuenta;

// constructor
CuentaCorriente(int saldoInicial)
super(saldoInicial);
numeroCuenta corrNumero;
}
// getNumeroCuenta - devuelvo el identificador de la actual cuenta
public int getNumeroCuenta()
return numeroCuenta;
}
// Interes - no acumulo inters si el saldo es
//inferior a $500.000
public void Interes ()
iI (saldo() ~ 500000)
super.Interes();
}
}
}

class CuentaAhorro extends CuentaBancaria
private static int corrNumero 100001;
private int numeroCuenta;

// constructor
CuentaAhorro(int saldoInicial)
super(saldoInicial);
numeroCuenta corrNumero ;
}
// getNumeroCuenta - devuelvo el identificador de la actual cuenta
public int getNumeroCuenta()
return numeroCuenta;
}
1.157
// Mantencion - no cargo cuotas si el saldo es superior a $200000
public void Mantencion()
iI (saldo() 200000)
super.Mantencion ();
}
]

// Prueba las clases CuentaAhorroy CuentaCorriente.
// Acumula el inters y ejecuta giros de cuentas
// tanto de ahorro como corriente.

public class App1_7

public static void main(String args])
// Primero establezco el porcentaje de inters.
//Asumo ahora el 8
CuentaBancaria.setTasaInteres(8.0);

// Creo una cuenta de ahorro y una cuenta corriente
CuentaAhorro ca new CuentaAhorro(0);
CuentaCorriente cc new CuentaCorriente(0);

// Durante 10 meses, ingreso $100000 en cada una
// y despus acumulo intereses y cuotas mensuales
Ior (int i 0; i 10; i)
ca.Deposit(100000);
cc.Deposit(100000);
ca.Mensualmente();
cc.Mensualmente();
System.out.println (i " - ");
System.out.println(ca.getNumeroCuenta() ": " ca.Saldo());
System.out.println(cc.getNumeroCuenta() ": " cc.Saldo());
}
}
}
1.158
Ejemplo 2: Vehculos

Construir un programa que maneje inIormacion de vehiculos. Un vehiculo
tiene un numero de patente, marca y ao de Iabricacion.

Entre los vehiculos es posible distinguir los autos y las camionetas. Para los
autos se tiene ademas, la lectura del cuenta kilometros y la capacidad del
estanque de combustible. Para las camionetas se tiene ademas, su capacidad
de carga.

La siguiente Iuncionalidad debe estar disponible para el usuario del
programa:

Ingresar inIormacion de una cantidad indeterminada de autos y
camionetas (no se conoce la secuencia en que viene los datos; si primero
un auto, luego un auto, luego una camioneta, etc.; la secuencia es
cualquiera)
Listados de cada uno de los vehiculos con sus datos asociados, en la
misma secuencia en que Iueron ingresados.
Dada la patente de un vehiculo, se piden los datos de ese vehiculo.
Ademas se pide el costo asociado por reparacion. Si es camioneta el costo
es $100.000 por unidad de capacidad. Si es auto, es $20.000 por capacidad
del estanque.
Cantidad total de vehiculos, cantidad total de autos, cantidad total de
camionetas.
Datos de la camioneta con la mayor capacidad de carga.

Notas:

Suponga que ya tiene implementada la clase Lectura para leer desde
pantalla
Parta haciendo el diagrama de clases


1.159
Diagrama de clases



























abstract class Vehculo //clase base. Es abstracta

protected String patente;
protected String marca;
protected int aoFabricacion;

ListaVehiculos

- Vehiculo | | lista
- int cantVehic

listaVehiculos()
ingresa()
- ingresarVehiculo()
buscaPatente(): Vehiculo
cantAutos(): int
cantCamionetas(): int
camionetaMayCapacidad():
Camioneta
getCantVeh(): int
getVehiculo(i): Vehiculo
Camioneta

- int capCarga

Camioneta()
getCapC(): int
+ costoReparacion(): int

Auto

- int kilometraje
- int capEstanque

Auto()
getKilo(): int
getCapE(): int
costoReparacion(): int

Jehiculo

# String patente
# String marca
# int aoFabricacion

# Vehiculo()
getMarca(): String
getAo(): int
getPatente(): String
costoReparacion(). int
`
1.160
protected Vehiculo(String patente , String marca,
int aoFabricacion)
patente patente;
marca marca;
aoFabricacion aoFabricacion;
}
public String getPatente()
return (patente);
}
public String getMarca()
return marca;
}
public int getAo ()
return aoFabricacion;
}
abstract public int costoReparacion(); //Mtodo abstracto
}

class Auto extends Vehiculo //subclase de vehiculo
private int kilometraje;
private int capEstanque;

public Auto(String patente, String marca,
int aoFabricacion, int kilometraje, int capEstanque
super(patente , marca , aoFabricacion);
capEstanque capEstanque;
kilometrajekilometraje;
}
public int getKilo()
return kilometraje;
}
public int getCapE ()
return capEstanque;
}

1.161
public int costoReparacion ()
return (capEstanque * 20000);
}
}

class Camioneta extends Vehculo // subclase de vehiculo
private int capCarga;

public Camioneta (String patente, String marca,
int aoFabricacion , int capCarga)
super(patente , marca , aoFabricacion);
capCarga capCarga;
}
public int getCapC ()
return capCarga;
}
public int costoReparacion ()
return (capCarga * 100000);
}
}

class ListaVehiculos
private Vehiculo| | lista; //lista es un arreglo de objetos de
//la clase Vehiculo
private int cantVehic;

public ListaVehiculos(int max)
lista new Vehiculo |max|; //crea el arreglo con la
//capacidad mxima que va a tener
cantVehic 0;
}
public int getCantVeh ()
return cantVehic;
}

1.162
public Vehiculo getVehiculo (int i)
return lista|i|;
}

//Ingresa un auto a la lista
public void ingresa(String patente , String marca ,
int aoFabricacion, int kilometraje , int capEstanque)
Vehiculo a new Auto(patente, marca, aoFabricacion,
kilometraje, capEstanque);

this.ingresarVehiculo(a);
}

//Ingresa una camioneta a la lista
public void ingresa(String patente , String marca ,
int aoFabricacion , int capCarga)
Vehiculo c new Camioneta( patente, marca,
aoFabricacion, capCarga);
this.ingresarVehiculo(c);
}

//Ingresa un vehculo a la lista
private void ingresarVehiculo(Vehiculo v)
lista|cantVehic| v;
cantVehic;
}

//Busca una patente de un vehculo en la lista
public Vehculo buscaPatente(String patente)
int j;
Ior ( j0; j cantVehic; j)
iI(lista|j|.getPatente().equals(patente))
return lista|j|;
iI (j cantVehic)
return null
}
1.163
public int cantAutos()
//Retorna la cantidad de autos en la lista
int contAuto 0;
Ior ( int j0; j cantVehic; j)
iI(lista|j| instanceof Auto)
contAuto;
return contAuto;
}

public int cantCamionetas()
int contCamio 0;
Ior ( int j0; j cantVehic; j)
iI(lista|j| instanceof Camioneta)
contCamio;
return contCamio;
}

//Retorna la camioneta con mayor capacidad de carga
public Camioneta camionetaMayCapacidad()
int mayor 0;
Camioneta camMayor null;
Camioneta c;
Ior ( int j0; j cantVehic; j)
iI (lista|j| instanceof Camioneta)
c (Camioneta) listaj];
iI(c.getCapC () ~ mayor)
mayor c.getCapC();
camMayor c;
};
};
return camMayor;
}
}
1.164
class App

public static void desplegarCamioneta( Camioneta c)
System.out.println("TIPO Camioneta");
System.out.println("PATENTE " c.getPatente());
System.out.println("MARCA " c.getMarca());
System.out.println("AO "c.getAo());
System.out.println("Cap. Carga "c.getCapC());
System.out.println("");
}

public static void desplegarAuto( Auto a)
System.out.println("TIPO Auto");
System.out.println("PATENTE " a.getPatente());
System.out.println("MARCA " a.getMarca());
System.out.println("AO "a.getAo());
System.out.println("KILOMETRAJE "a.getKilo());
System.out.println("Cap. Estanque "a.getCapE());
System.out.println("");
}

public static void main(String|| args)throws IOException
ListaVehiculos lista new ListaVehiculos(30);
int opcion0;
String pat,mar;
int kil,cap,ao,tipo;

//Mientras el usuario no desee terminar
while(opcion !6)
System.out.println(" M E N U");
System.out.println("|1| Ingresar vehiculo ");
System.out.println("|2| Listado de vehiculos ");
System.out.println("|3| Buscar un vehiculo segun la
patente y desplegar costo de reparacion");
System.out.println("|4| Cantidad de vehiculos (autos y camionetas) ");
System.out.println("|5| Datos de la camioneta con la mayor capacidad de carga ");
1.165
Vehiculo a new Auto(..);
lista.ingresarVehiculo(a);
Vehiculo c new Camioneta();
lista.ingresarVehiculo(c);
System.out.println("|6| Salir ");
System.out.println("Indicar opcion:");
opcionLectura.getInt();
switch(opcion)
case 1:
//Ingresa datos de un vehiculo
System.out.println("Ingrese tipo de vehiculo Auto|1| Camioneta|2|");
tipo Lectura. getInt();
iI (tipo 1)
System.out.println("Ingrese patente ");
pat Lectura.getString();
System.out.println("Ingrese la marca ");
mar Lectura.getString();
System.out.println("Ingrese el ao de Iabricacion ");
ao Lectura.getInt();
System.out.println("Ingrese el kilometraje");
kil Lectura.getInt();
System.out.println("Ingrese la capacidad del estanque ");
cap Lectura.getInt();
lista.ingresa(pat,mar,ao,kil,cap);
}
else
iI (tipo 2)
System.out.println("Ingrese patente ");
pat Lectura.getString();
System.out.println("Ingrese la marca ");
mar Lectura.getString();
System.out.println("Ingrese el ao de Iabricacion ");
ao Lectura.getInt();
System.out.println("Ingrese la capacidad de carga ");
cap Lectura.getInt();
lista.ingresa(pat,mar,ao,cap);
}
}
}
break;
1.166
case 2:
// Muestra un listado de los vehiculos
Ior(int i 0; i lista.getCantVeh(); i)
Vehiculo v lista.getVehiculo(i);
iI (v instanceof Camioneta)
Camioneta c (Camioneta) v;
App.desplegarCamioneta(c);
}
else
Auto a (Auto) v;
App.desplegarAuto(a);
]
]
}
break;
case 3:
//Muestra datos de un vehiculo, dada una patente,
//incluyendo costo de reparacin
System.out.println("Ingrese la patente ");
pat Lectura.getString();
Vehiculo v lista.buscaPatente(pat);
iI (v ! null)
iI (v instanceof Camioneta)
Camioneta c (Camioneta) v;
App.desplegarCamioneta(c);
}
else
Auto a (Auto) v;
App.desplegarAuto(a);
}

System.out.println('Costo Reparacion: ' v.costoReparacion());
}
}
break;
1.167
Camioneta
- int capCarga

Camioneta()
m3()

Auto
- int kilometraje
- int capEstanque
Auto()
m4()

Jehiculo
# String patente
# String marca
# int aoFabricacion

# Vehiculo()
m1()
m2()
case 4:
//Muestra cantidad de camionetas, autos y el total
int cc lista.cantCamionetas();
int ca lista.cantAutos();
System.out.println('Total Camionetas: ' cc);
System.out.println('Total Autos: ' ca);
int total cc ca;
System.out.println('Total vehiculos: ' total);
}
break;
case 5:
//Muestra los datos de la camioneta con la
//mayor capacidad de carga
Camioneta c lista.camionetaMayCapacidad();
iI (c ! null)
App.desplegarCamioneta(c);
}
break;

} //fin switch

} //fin while

} //fin main

} //fin App



Suponga la siguiente instruccion
Java:
Vehiculo v new Camioneta()


Concepto de Casteo

1.168











Desde qu punto de vista quiero ver al objeto: como camioneta o como
vehculo?
Si se ve como vehculo, solo puedo ver los metodos m1 y m2.
Se puede achicar la interIace del objeto (Vehiculo tiene menos cosas que
camioneta)
\\ Vehiculo v1 c
\\Vehiculo v1 (Vehiculo) c;
Si se ve como camioneta, se deben ver los metodos m1, m2 y m3.
No se puede agrandar la interIace del objeto (Camioneta tiene mas cosas
que Vehiculo)

Camioneta c v
Por lo tanto: \\Camioneta c (Camioneta) v
: Camioneta

m1()
m2()
m3()
v c
v1
1.169
Ejemplo 3

Se tiene inIormacion de los Iuncionarios de la empresa de computacion
MandiosoIt Ltda. en la cual se encuentra la inIormacion de cada uno de los 3
tipos de Iuncionarios del area de desarrollo de sistemas. Estos pueden ser
Programadores, Analistas o Ingenieros.

Todos los Iuncionarios tienen inIormacion en comun, como lo es rut,
nombre, direccion, sueldo base y el tipo de Iuncionario. Ademas si es
programador interesa el lenguaje de programacion que domina (solo uno por
programador), las horas extras y el nivel de programador (4: experto, 3:
avanzado, 2: intermedio, 1: rookie). De los analistas ademas interesa saber
los aos de experiencia y Iinalmente de los ingenieros interesa el titulo y la
cantidad de cargas Iamiliares.

La empresa MandiosoIt desarrolla proyectos para otras empresas, en cada
uno de estos proyectos participa siempre 1 analista, 1 programador y 1
ingeniero. De cada proyecto interesa el nombre, el codigo, la duracion en
meses y su costo total.

El programa debe comenzar realizando la asignacion de personal a cada
proyecto, es decir el usuario debe para cada proyecto ingresar un
programador, un analista y un ingeniero (objetos).

Requerimientos
Una vez ingresada la inIormacion de los Iuncionarios a los proyectos
Listado de Proyectos con los costos involucrados (por meses y total)
Listado de Iuncionarios con sus respectivos sueldos.
Dado un proyecto entregar el listado de gente involucrada.
Dado un Iuncionario entregar el listado de proyectos en que participa.
Para cada Iuncionario ingeniero, su nombre y su titulo.
1.170
Los sueldos se calculan de la sigte Iorma, para el programador ademas de
su sueldo base, cada hora extra realizada cuesta $5000 ademas de un bono
extra de $30000 por nivel y otro bono de 20 del valor total mensual del
proyecto por cada proyecto en el que participa. En el caso del analista su
sueldo se calcula con el sueldo base mas un bono de $5000 por cada ao de
experiencia mas el 25 del valor total mensual del proyecto por cada
proyecto en el que participa. Finalmente el Ingeniero recibe un sueldo base,
mas $8000 por cada carga Iamiliar mas un 30 del valor total mensual del
proyecto por cada proyecto en el que participa.

Suponga que cada Iuncionario trabaja a lo mas en 5 proyectos.

Suponga que ya tiene en memoria la lista de Iuncionarios (con sus
correspondientes objetos Iuncionario) y la lista de proyectos (con sus
correspondientes objetos proyecto) y que las clases listados de Iuncionarios
y proyectos poseen el metodo buscar que retorna un objeto al encontrarlo o
null si no.




1.171
Lista_Funcionarios
- Iuncionario || listado
- int cantIunc
+ Lista_Funcionarios()
+ ingresar_func(): boolean
+ buscar(): funcionario
+ get_cant_func(): int
+ get_funcionario(i): funcionario


Programador
- String lenguaje
- int horasextras
- int nivel
Programador()
+ calcular_sueldo(): int
Analista
- int aosexperiencia
Analista()
calcular_sueldo(): int
Ingeniero
- String titulo
- int cantcargas

Ingeniero()
+ calcular_sueldo(): int
gettitulo(): String
funcionario
# String rut
# String nombre
# String direccion
# int sueldo_base
# String tipo
# int porc_por_proy
# ListaProyectos listadoproyectos

# funcionario()
# calcularsueldo(): int
# calcular_bono_proyectos(): int
getListadoproyectos(): ListaProyectos
+ gety set.()

`
Lista_Proyectos


- proyecto|| listado
- int cantproy



+ Lista_Proyectos()
+ ingresar_proy(): boolean
+ buscar(): proyecto
+ get_cant_proy(): int
+ get_proyecto(i): proyecto
`
proyecto
- String codigo
- int meses
- String nombre_proyecto
- int monto
- ingeniero jefe_proyecto
- analista analista_proyecto
- programador progr_proyecto
+ proyecto()
+ calcular_montos_proyecto()
+ get_codigo(): String
+ get_nombre(): String
+ get_monto(): int
+ get_meses() : int
+ asignar_jefe_proyecto()
+ asignar_analista_proyecto()
+ asignar_programador_proyecto()
+ get_ingeniero(): ingeniero
+ get_analista(): analista
+ get_programador(): programador

1

1

1


Diagrama de Clases
1
1.172
abstract class funcionario

protected string rut;
protected string nombre;
protected string direccion;
protected int sueldobase;
protected String tipo;
protected ListaProyectos listadoproyectos;
protected int porcentajeporproy;


protected funcionario(string rut, string nom, string dir,
string sueldo, string tipo, int porc)

this.rut rut;
this.nombre nom;
this.direccion dire;
this.sueldobase sueldo;
this.tipo tipo;
this.porcentajeporproy porc;

listadoproyectos new ListaProyectos (5);

}

1.173
protected int calcular_bono_proyectos ()
int suma 0;
int monto 0;
double bono;
Ior (int i0; ithis.listadoproyectos.getCantproy(); i)
proyecto p listadoproyectos.getproyecto(i);
monto p.getmonto();
meses p.getmeses();
bono (monto / meses) *
(this.porcentajeporproy / 100);
suma suma bono;
}
return suma;
}

abstract protected int calcular_sueldo() ;
}


class programador extends funcionario
private string lenguaje;
private int horasextra;
private int nivel;

public programador (string rut, string nom, string dir,
int sueldo, string lenguaje, int horasextra, int nivel)
super (rut, nom, dir, sueldo, 'programador, 20);
this. lenguaje lenguaje;
this. horasextra horasextra;
this. nivel nivel;
}

1.174
public int calcular_sueldo()
int bonoproyectos calcularbonoproyectos()
int sueldo this.sueldobase 5000*horasextra
30000*nivel bonoproyectos;
return (sueldo);
}

}


class analista extends funcionario
private string aosexperiencia;

public analista (string rut, string nom, string dir, int sueldo,
int aosexperiencia)
super (rut, nom, dir, sueldo, 'analista, 25);
this. aosexperiencia aosexperiencia;
}

public int calcular_sueldo()
int bonoproyectos calcularbonoproyectos()
int sueldo this.sueldobase 5000* aosexperiencia
bonoproyectos;
return (sueldo);
}

}


1.175
class ingeniero extends funcionario
private string titulo;
private int cantcargas;

public ingeniero(string rut,string nom, string dir,
int sueldo, string titulo, int cargas)
super (rut, nom, dir, sueldo, 'ingeniero, 30);
this. titulo titulo;
this.cargasIamiliares cargas
}

public int calcular_sueldo()
int bonoproyectos calcularbonoproyectos()
int sueldo this.sueldobase 8000 *
this.cargasIamiliares bonoproyectos;
return (sueldo);
}

public String get_titulo()
return titulo;
}
}


class proyecto
private int codigo;
private string nombreproyecto;
private int monto;
private int meses;
private ingeniero jeIeproyecto;
private analista analistaproyecto;
private programador programadorproyecto;


1.176
public proyecto (int codigo, string nombre, int monto,
int meses )
this.codigo codigo;
this.nombreproyecto nombre;
this.meses meses;
this.monto monto;
}
public void asignar_jefe_proyecto (ingeniero i)
this.jeIeproyecto i;
}
public void asignar_analista_proyecto (analista a)
this.analistaproyecto a;
}
public void asignar_programador_proyecto (programador p)
this. programador proyecto p;
}
public int get_codigo()
return codigo;
}
public int get_monto()
return monto;
}
public int get_meses()
return meses;
}
public String get_nombre()
return nombreproyecto;
}
public ingeniero getingeniero ()
return jeIeproyecto;
}
public get analista y programador .

}
1.177
class AppHerencia

public static void main(String|| args)

//asumir que la lista de funcionarios ya viene creada
//y cargada con valores
ListaFuncionarios lI new ListaFuncionarios(30);

//asumir que la lista de proyectos ya viene creada
//y cargada con valores
ListaProyectos lp new ListaProyectos(15);

//crear un nuevo proyecto
proyecto p new proyecto (1,'Mi Primer Proyecto,100000, 5);
bolean ingreso lp.ingresarproy(p);

Iuncionario elingeniero new ingeniero('111,
'Juan Perez, 'Av Arg 0123, 600000,
'Ingeniero Civil computacion, 3);
lI.ingresarIunc(elingeniero);

Iuncionario elanalista new analista ('222,
'Javier Mandiola, 'prat 03345, 450000, 30);
lI.ingresarIunc(elanalista);

Iuncionario elprogramador new programador ('333,
'Luis Castro, 'coquimbo 412, 300000,
'php, 10, 3);
lI.ingresarIunc(elprogramador);

p.asignarjeIeproyecto (elingeniero);
p.asignaranalistaproyecto (elanalista);
p.asignarprogramadorproyecto (elprogramador);

1.178
elingeniero.getListadoproyectos().ingresarproy(p);
elanalista. getListadoproyectos().ingresarproy(p);
elprogramador. getListadoproyectos().ingresarproy(p);

//Listar proyectos con su costo mensual y total
Ior (int i0; ilp.getcantproy(); i)
proyecto p lp.getproyecto(i);
double monto p.getmonto() ;
int meses p.getmeses();
system.out.print ('Nombre: ' p.getnombre()
' Monto Mensual: ' monto/meses
' Monto Total: ' monto) ;
}

//Listar funcionarios con su sueldo
Ior (int i0; ilI.getcantIunc(); i)
Iuncionario I lI.getIuncionario(i);
System.out.print ('Nombre: ' I.getnombre()
' Sueldo: ' I.calcularsueldo());
}

//Dado un proyecto entregar sus funcionarios
string cod lectura.getstring();
proyecto p lp.buscar(cod);
iI (p ! null)
ingeniero ing p.getingeniero();
programador pro p.getprogramador();
analista anl p.getanalista();
system.out.print('Ingeniero : ' ing.getnombre());
system.out.print('Programador : ' pro.getnombre());
system.out.print('Analista : ' anl.getnombre());
}
else
system.out.print('Proyecto Inexistente);
1.179
//Dado un funcionario entregar el listado de proyectos
string rut lectura.getstring();
Iuncionario I lI.buscar(rut);

iI ( I !null )
Ior (int i0; iI.getListadoproyectos().getCantproy(); i)
proyecto p I. getListadoproyectos().getproyecto(i);
system.out.print('Proyecto : ' p.getnombre());
}
else
System.out.print('Funcionario Inexistente);
}

//Nombre y ttulo de los ingenieros
Ior(int i 0; i lI.getcantIunc (); i)
Iuncionario I lI.getIuncionario(i);
iI (I instanceoI ingeniero)
ingeniero ing (ingeniero) I; //Casteo
System.out.println('Nombre: ' I.getnombre()
'titulo: ' ing.gettitulo();
//Tambin ing.get_nombre()
}
}

}


1.180
1.8.6 Modificador final, para calificar una variable, mtodo o
clase

Por deIecto todos los metodos y las variables de instancia, se pueden
sobrescribir.

En Java, si se desea declarar que ya no se quiere que las subclases
sobrescriban las variables o metodos, esto se puede declarar como final.

Ejemplo para variables:

final int NUEVO ARCHIVO 1;

Por convencion los nombres de los valores constantes estan en
mayuscula.

final asociado a un metodo, indica que este no puede ser sobrescrito por
las subclases.


final, usado como modiIicador de una clase, indica que la clase no puede
tener subclases.



public final class Integer

public final class Math


1.181
1.9 Paquetes en 1ava

El paquete es una coleccion de clases que se encuentran en el mismo
directorio.

Forma general de un archivo fuente de 1ava:
Una unica sentencia de paquete (opcional).
Las sentencias de importacion deseadas (opcional).
Una unica declaracion de clase publica.
Las clases privadas dentro del paquete que se requieran (opcional).

Formato general de la sentencia package es:
package paq1 |.paq 2|.paq 3||;

Un paquete declarado como:
package java.awt.imagen;

se debe almacenar en:
java\ awt\imagen (Windows)
o
java/ awt /imagen (UNIX)

Si no se especiIica ningun paquete, la clase se incorpora al paquete por
omision, tambien conocido como el paquete innominado, pues carece de
nombre.

Todas las clases que se encuentran en archivos de un mismo directorio
Iorman un mismo paquete.

Los paquetes se organizan a su vez en una jerarquia de paquetes.

1.182
Ejemplo de 1erarqua de paquetes

















Paquetes:
Paquete por omision.
Paquete P
Paquete R

El paquete P contiene las clases P.B y P.C.
El paquete P.R contiene la clase P.R.D.
Las clases A y B, se accesan directamente.




Paquete
por
omisin

P

A. java

B. java

B. java

C. java

R

D. java
1.183
1.10. Visibilidad de clases y control de acceso para los miembros
de una clase


A) Visibilidad de clases


Al declarar una clase se puede especiIicar que es publica usando el atributo
public. De este modo la clase podra ser usada por cualquier otra clase.


Si la clase no es publica, entonces la clase solo puede ser usada dentro del
paquete que la contiene.

public] final / abstract] class...

Solo se puede especiIicar uno de los atributos puestos en la misma llave.

B) Control de acceso para los miembros de una clase

Java soporta cuatro niveles de acceso para las variables y los metodos de una
clase:

private.
protected.
public.
package (sin modiIicador).


1.184
Control de acceso para los miembros de una clase

Clase Subclase Package Mundo
Modificador:
private X
protected X X* X
public X X X X
package X X


PRIVADO:
Es el nivel de acceso mas restrictivo. Un miembro privado es accesible slo
en la clase en la que se encuentra deIinido.

Ejemplo: private

class Alpha
private int soyPrivado;

private void metodoPrivado()
System.out.println('Metodo Privado);
}
}

class Beta
void metodoAcceso()
Alpha a new Alpha();
a.soyPrivado 10; //ilegal
a.metodoPrivado(); //ilegal
}
}
1.185
La clase Alpha contiene un metodo que compara el objeto actual (this)
con otro objeto de la misma clase:

class Alpha
private int soyPrivado;

boolean esIgualA(Alpha otraAlpha)
iI(this.soyPrivado otraAlpha.soyPrivado)
return true;
else
return Ialse;
}
}

PROTECTED:
Permite que la clase, que las subclases, y que todas las clases en el mismo
paquete tengan acceso al miembro declarado como protegido.

Ejemplo: protected

package Greek;
class Alpha
protected int soyProtegido;

protected void metodoProtegido()
System.out.println('Metodo protegido);
}
}

package Greek;
class Gamma
void metodoAcceso()
Alpha a new Alpha();
a.soyProtegido 10; //legal
a.metodoProtegido(); //legal
}
}
1.186
En el caso de una subclase A que reside en un paquete diIerente, esta
subclase A puede reIerenciar los miembros protegidos de la clase B solo en
el caso de aquellos objetos de la subclase A o de subclases de A.

import Greek.`;
package Latin;

class Delta extends Alpha
void metodoAcceso(Alpha a, Delta d)
a.soyProtegido 10; //ilegal
d.soyProtegido 10; //legal
a.metodoProtegido(); //ilegal
d.metodoProtegido(); //legal
}
}

PUBLIC:
Cualquier clase en cualquier paquete, tiene acceso a los miembros publicos
de la clase.

Ejemplo: public

package Greek;

public class Alpha
public int soyPublico;

public void metodoPublico()
System.out.println('Metodo Publico);
}
}
1.187
import Greek.`;
package Roman;
class Beta
void metodoAcceso()
Alpha a new Alpha();
a.soyPublico 10; //legal
a.metodoPublico(); //legal
}
}

PACKAGE:
Si un miembro de una clase no tiene modiIicador, entonces sera visible a
todas las clases del mismo paquete. Esto es lo establecido por deIecto.

Ejemplo: package

package Greek;
class Alpha
int soyUnPaquete;

void metodoPaquete()
System.out.println('Metodo Paquete);
}
}

package Greek
class Beta
void metodoAcceso()
Alpha a new Alpha();
a.soyUnPaquete 10;//legal
a. metodoPaquete();//legal
}
}
1.188
C) Resumen de los atributos que pueden tener variables
y mtodos


VARIABLE:

private / public / protected}

Iinal}

static}




MTODO:

private / public / protected}

Iinal / abstract}

static}



Solo se puede especiIicar uno de los atributos puestos en la misma llave.

1.189
Ejercicio
package P1;
import P2.C4;
public class C1
private int a1;
protected int a2;
private void imprimir()
System.out.print("Valor: " this.a1);
}
public int get_a1()
return this.a1;
}
protected void set_a1(int v)
this.a1 v;
}
public void aumentar_c4(C4 a)
C5 c a.getC5();

this.a1 c.geta1();
a.seta1(50*this.a1);
}
}

package P1;
public class C2
protected int a1;
public Iinal int a2 1000;
protected void imprimir()
System.out.print("Valor: " this.a1);
}
public int metodo1(C2 a, C4 b)
return a.geta1() * b.a2;
}
La clase C5, aunque es
publica, no es accesible
desde C1, ya que esta
en otro paquete. Para
usarla deberia tener:
import P2.C5;
o
P2.C5 c a.getC5();
La clase C4, aunque es
publica, no es accesible
desde C2, ya que esta en
otro paquete.
Para usarla deberia tener:
import P2.C4;
o
P2.C4 b
1.190
public int get_a1()
return this.a1;
}
}

package P1;

public final class C3
private int a1;
private int a2;
public int a3;

private int calcular(C1 a, C2 b, C3 c)
a.a2 a.a2*2;
b.a1 b.a115;
c.a1 a.a1*b.a1;

return c.a1;
}

public int metodo1(C2 a)
int base this.a1 * 100;
int multiplicador a.geta1();
int total base * multiplicador;
iI (total ~ 5000)
a.a2 total;
else
this.a2 total;
return total;
}
}



El atributo a1 de la
clase C1 es privado, por
lo tanto no lo puedo
accesar.
El atributo a2 de la
clase C2 es Iinal, por
lo tanto no puede
modiIicarse.
1.191
package P2;
import P1.`;

public class C4 extends C1
private int a1;
public int a2;
private C5 a3;

private void metodo1(C1 a, C4 b)
int temp b.a2*5;
b.a1 a.a2 * temp;
}

public C5 getC5()
return a3;
}

public void set_a1(int v)
this.a1 v;
}
}

package P2;
public class C5 extends C3
private int a1;

private void imprimir()
System.out.print("Valor: " this.a1);
}

public int get_a1()
return this.a1;
}
}
El atributo a2 de la clase
C1 no es visible, ya que es
protected y para que se
pueda usar debiera estar en
el mismo paquete de la
clase C4, lo que no es asi.
De hecho la clase C4 esta
en el paquete P2 y la clase
C1 en el P1.

Ademas, cuando residen en
paquetes distintos, la
subclase puede reIerenciar
los miembros protected
solo para los objetos de la
subclase o de
susbsubclases.
De hecho, a no es de la
subclase, es de la super
clase.
La clase C3 es Iinal,
por lo tanto no se
pueden deIinir
subclases desde C3.
1.192
Ejercicio
El siguiente codigo, Tiene algun error?, Cual es?

public class punto
protected int x;
protected int y;

punto(int x,int y)
this.xx;
this.yy;
}
public int getx()
return x;
}
}

public class punto3d extends punto
private int z;
punto3d(int x,int y)
super(x,y);
}
public void setz(int z)
this.zz;
}
}

public class principal
public static void main (String|| args)
punto mipuntonew punto3d(30,50);
mipunto.setz(40);
}

}
1.193
1.11. Interfaces en 1ava

Java admite un concepto similar a la clase, llamado interIaz.
Una interIaz es una coleccion de metodos abstractos.
Una interIaz puede ser publica o privada.
Todos los metodos dentro de la interIaz son publicos y abstractos (no se
encuentran implementados).
Las variables de clase en una interIaz, si es que existen, son
implicitamente Iinales, publicas y estaticas (en otras palabras, son
constantes).
Una interIaz permite al programador describir un conjunto de capacidades
que debe implementar una clase.

Ejemplo: InterIaz Collection

interface Collection
int MAXIMUN 500;
void add(Object obj);
void delete(Object obj);
Object Iind(Object obj);
int currentCount (Object obj);
}

class FIFOQueue implements Collection
.....
void add (Object obj)
--------------
}
void delete (Object obj)
--------------
}
Object find (Object obj)
--------------
}
int currentCount (Object obj)
--------------
}
....
}
1.194
Una clase que implementa una interIaz, no est heredando nada.
Simplemente, se compromete a implementar los metodos deIinidos en la
interIaz.

Este es el origen de la palabra clave implements.


Polimorfismo en 1AVA

Una variable declarada de una cierta interIace, puede mantener valores de
cualquier clase, que implementa la interIace.

Ejemplo de interface

public class Alumno
private int rut;
private String nombre;
private String apellido;
private String direccion;

public Alumno()
}

public String getApellido()
return this.apellido;
}

public void setApellido(String apellido)
this.apellido apellido;
}

public String getDireccion()
return this.direccion;
}
1.195
public void setDireccion(String direccion)
this.direccion direccion;
}

public String getNombre()
return this.nombre;
}

public void setNombre(String nombre)
this.nombre nombre;
}

public int getRut()
return this.rut;
}

public void setRut(int rut)
this.rut rut;
}

}

1.196
/``
` Interface que representa el comportamiento de una lista de
` Alumnos. Esta puede ser implementada de la forma que se desee,
` es decir utilizando:
` - Arreglos estaticos:
` - Arreglos dinamicos: Listas con nexo, Cursores, etc.
`/
public interface ListaAlumnos

/**
* Metodo que dada la posicion de un elemento dentro de la lista
* retorna el elemento en esa posicion.
*Si la posicion en la lista no existe retorna null.
* param posicion
* return Alumno/null
*/
public Alumno getElemento(int posicion);

/**
* Metodo que dado un elemento retorna la posicion en la cual se
* encuentra dentro de la lista. Retorna -1 si el dato no se encuentra.
* param elemento
* return int posicion del elemento dentro de la lista.
*/
public int buscarElemento(Alumno elemento);

/**
* Metodo que inserta un elemento al Iinal de la lista, retorna true si
* Iue exitosa la insercion (hay espacio para almacenarlo) o Ialse si
* la lista se encuentra llena.
* param elemento
* return boolean true/Ialse
*/
public boolean insertarElemento(Alumno elemento);
1.197
/**
* Metodo que elimina el elemento en la "posicion" de la lista.
* Si la posicion no existe, retorna Ialso. En caso contrario
* elimina el dato y retorna true.
* param posicion
* return boolean true/Ialse
*/
public boolean eliminarElemento(int posicion);

/**
* Metodo que elimina todos los datos de la lista, es decir la
* deja vacia
*/
public void limpiar();


/**
* Metodo que retorna true si y solo si no hay ningun elemento
* presente en la lista
* return boolean (true/Ialse)
*/
public boolean isVacia();


/**
* Metodo que retorna la cantidad de elementos que posee la lista,
* por ejemplo: Si la lista se encuentra vacia retorna 0;
* return int cantidad de elementos en la lista.
*/
public int getTamanio();

] //Fin interface ListaAlumnos


1.198
/``
` Clase que implementa la interface Lista que permite almacenar
` Alumnos
`/
public class ListaArregloEstatico implements ListaAlumnos

private Alumno|| arreglo;
private int posicionUltimoElemento;

/**
* Constructor de la clase ListaArregloEstatico
* param capacidadMaxima : Cantidad maxima de elementos
* que puede almacenar esta lista.
*/
public ListaArregloEstatico(int capacidadMaxima)
this.arreglo new Alumno|capacidadMaxima|;
this.posicionUltimoElemento -1;
}

public Alumno getElemento(int posicion)
iI (posicion 0 ,, posicion ~ this.arreglo.length)
return null;
}

// Si no hay un dato en esa posicion
iI (posicion ~ this.posicionUltimoElemento)
return null;
}

return this.arreglo|posicion|;
}


1.199
public int buscarElemento(Alumno elemento)
// Recorro el arreglo tratando de encontrar el elemento
Ior (int i0; i this.posicionUltimoElemento; i)
iI (this.arreglo|i|.getRut()elemento.getRut())
return i;
}
}
// Si no lo encontre, retorno -1
return -1;
}

public boolean insertarElemento(Alumno elemento)
// Si llegue justo a la capacidad maxima no puedo
// almacenar mas.
iI (this.posicionUltimoElemento arreglo.length-1)
return Ialse;
}
// Incremento el contador de elementos e ingreso el elemento.
this.posicionUltimoElemento;
this.arreglo|this.posicionUltimoElemento| elemento;
return true;
}

public void limpiar()
int tamanio this.arreglo.length;
this.arreglo new Alumno|tamanio|;
this.posicionUltimoElemento -1;
}

public boolean isVacia()
return (this.posicionUltimoElemento -1);
}


1.200
public int getTamanio()
return this.posicionUltimoElemento1;
}

public boolean eliminarElemento(int posicion)
// Si intento eliminar una posicion que no existe retorno falso
iI (posicion 0 ,, posicion ~ this.arreglo.length)
return Ialse;
}
// Si no hay un dato en esa posicion
iI (posicion ~ this.posicionUltimoElemento)
return Ialse;
}
// Se procede a realizar el corrimiento para realizar la
// eliminacion
Ior (int i posicion; i this.posicionUltimoElemento; i)
this.arreglo|i| this.arreglo|i1|;
}
this.posicionUltimoElemento--;
return true;
}
] //Fin class ListaArregloEstatico


public class TestLista

public static void main(String|| args)
// Lista que puede almacenar a lo mas 2 objetos.
ListaAlumnos lista new ListaArregloEstatico(2);

Alumno alumno1 new Alumno();
alumno1.setNombre("Javier");
alumno1.setApellido("Mandiola");

1.201
// inserto el alumno1 en la lista
iI (lista.insertarElemento(alumno1))
System.out.println("Alumno 1 insertado con exito");
else
System.out.println("Alumno 1 NO insertado");
Alumno alumno2 new Alumno();
alumno2.setNombre("Claudio");
alumno2.setApellido("Vasquez");
// inserto el alumno2 en la lista
iI (lista.insertarElemento(alumno2))
System.out.println("Alumno 2 insertado con exito");
else System.out.println("Alumno 2 NO insertado");
Alumno alumno3 new Alumno();
alumno3.setNombre("Paul");
alumno3.setApellido("Beltrand");
// inserto el alumno3 en la lista, pero como la lista
//no tiene espacio esta operacion no es exitosa.
iI (lista.insertarElemento(alumno3))
System.out.println("Alumno 3 insertado con exito");
else
System.out.println("Alumno 3 NO insertado");
//Buscar al alumno 2
System.out.println("Alumno 2 encontrado en posicion:"
lista.buscarElemento(alumno2));
// Eliminacion de elementos en la lista
int k 0;
iI (lista.eliminarElemento(k))
System.out.println("Alumno en posicion " k " eliminado!");
}
else
System.out.println("Alumno en posicion " k "No existe!!");
}
}
}
1.202
Diagrama de clases


ListaAlumnos
ListaArregloEstatico


Alumno
- int rut
- String nombre
- String apellido
- String direccion

..
`
Alumno
- int rut
- String nombre
- String apellido
- String direccion

..
<<interface>>
ListaAlumnos


ListaArregloEstatico


`

1.203
Ejercicio
Se necesita un programa que sea capaz de manejar listas FIFO y LIFO con
datos numericos. Se sabe que cada una de estas listas debe tener un maximo
de 500 elementos (constante), un metodo agregar, un metodo eliminar, un
metodo buscar y un metodo que retorne la cantidad de datos actuales en las
lista.
Utilizar interIace

public interface ListasLifoYFifo

public int MAX 500;

public boolean agregar (int dato);

public boolean eliminarPrincipio ();

public boolean eliminarFinal ();

public void borrar ();

public boolean buscar(int dato);

public int getCantDatos();
]


public class ListaLifo implements ListasLifoYFifo

// ltimo en entrar, primero en salir

private int || lista;
private int cantElems;
10

20

15

0

1

2

3

.

Insercion y
Eliminacion
1.204
public ListaLifo ()
lista new int |MAX|;
cantElems 0;
}

public int getCantDatos()
return cantElems;
}

public boolean buscar(int dato)
Ior(int i 0; i cantElems; i)
iI (lista|i| dato)
return true;
iI (i cantElems)
return Ialse;
}

public boolean agregar (int dato)
iI (cantElems MAX)
lista|cantElems| dato;
cantElems ;
}
}

public boolean eliminarFinal ()
iI (cantElems~ 1)
cantElems --;
return true;
}
else
return Ialse;
}
}
1.205
public class ListaFifo implements ListasLifoYFifo
// primero en entrar, primero en salir

private int || lista;
private int cantElems;

public ListaLifo ()
lista new int |MAX|;
cantElems 0;
}

public int getCantDatos()
return cantElems;
}

public boolean buscar(int dato)
Ior(int i 0; i cantElems; i)
iI (lista|i| dato)
return true;
iI (i cantElems)
return Ialse;
}

public boolean agregar (int dato)
iI (cantElems MAX)
lista|cantElems| dato;
cantElems ;
}
}


10

20

15

0

1

2

3

.

Insercion
Eliminacion
Lista Fifo
1.206
public boolean eliminarPrincipio ()
iI (cantElems~ 1)
Ior(int i 1; i cantElems; i--)
lista|i-1| lista|i|;
cantElems --;
return true;
}
else
return Ialse;
}
}



public class App

public static void main(String ||args)
ListaLiIoYFiIo lista1 new ListaLiIo();
...
lista1. agregar(2);
lista1.eliminarFinal();
...

ListaLiIoYFiIo lista2 new ListaFiIo();
...
lista2. agregar(20);
lista2.eliminarPrincipio ();
...

]
]
1.207
1.12 Ejercicios Propuestos

A) Ejercicio: Programa para una empresa de capacitacin.

'Soy el Director de una empresa de capacitacion que imparte cursos en el
area de tecnologia de inIormacion. Dictamos muchos cursos, cada uno de
los cuales tiene un codigo, un nombre y una tariIa.
Programacion en UNIX y Programacion SQL, son dos de nuestros cursos
mas populares. Los cursos pueden durar desde un dia a cuatro dias. Un
instructor puede ensear varios cursos. Pablo Rogers y Maria Gonzalez, son
dos de nuestros principales instructores. Para cada instructor se necesita
conocer, su nombre y su numero teleIonico. Cada curso es impartido por un
unico instructor. Primero se crea un curso, y luego se le asigna el proIesor.
Los estudiantes pueden tomar varios cursos a la vez; para cada estudiante se
necesita conocer su nombre y su numero teleIonico. Algunos de nuestros
estudiantes y proIesores en algunas ocasiones no proporcionan sus numeros
teleIonicos.
Para el enunciado anterior, se pide el diagrama de clases.

Las Operaciones que los objetos realizan, resultan de:
Consultas.
Actualizaciones.
Procesos sobre los datos.

Se deben identiIicar las entidades externas que interactuan con el sistema, y
las diIerentes maneras en que usan el sistema.

Agregar, eliminar y modiIicar alumno.
Agregar, eliminar y modiIicar curso.
Agregar, eliminar y modiIicar proIesor.
Agregar, eliminar estudiante de un curso.
Asignar, modiIicar un proIesor a un curso.
Encontrar todos los alumnos de un curso.
Encontrar todos los cursos que dicta un proIesor.
1.208
B) Ejercicio: Declaracin del problema

El programa debe manejar inIormacion relacionada con los empleados de la
empresa, y sus datos asociados. Para cada empleado se manejan datos de:
Rut
Nombre
Direccion
Fecha de contratacion
TeleIono particular

Los empleados estan asignados a un unico departamento. La empresa cuenta
con varios departamentos, para los que se tienen datos de:
Codigo
Nombre
Localizacion

Ademas, la empresa cuenta con un conjunto de vehiculos, los que pueden ser
asignados a los empleados (maximo un vehiculo por empleado). Para cada
vehiculo se registra:
Codigo
Fecha de su ultima mantencion
Fecha de expiracion de la revision tecnica
Lectura del cuenta kilometros
Capacidad del estanque de combustible

Algunos empleados trabajan con contrato por horas. A ellos se les contrata
por una cierta cantidad de horas mensuales y se acuerda con cada uno el
precio a cancelar por hora. En el momento de pagarles se veriIica la
cantidad total de horas trabajadas en el mes y si se registran horas de sobre
tiempo, se les paga 1,5 veces su precio normal por cada hora extra.

Algunos empleados trabajan con contrato a plazo indeIinido, Iijandoseles un
sueldo base a pagar por mes. Estos empleados tienen Iijada ademas, una
1.209
boniIicacion que asciende al 25 del sueldo base y un bono de
antigedad, que varia para cada trabajador.

Algunos empleados pertenecen a uno de los varios sindicatos que Iuncionan
al interior de la empresa. Cada sindicato tiene un codigo, un nombre, un
teleIono, una direccion y Iija un monto de cuota mensual a pagar por cada
uno de sus aIiliados, para ser descontada de su remuneracion. Solo los
empleados con contrato a plazo indeIinido, pueden pertenecer a un sindicato.

Se necesita:

1. Ingresar datos al programa.

2. Peticiones que el sistema debe responder:

Dado un nombre de departamento, encontrar los nombres de sus
empleados.
Dado un nombre de empleado, encontrar el nombre de su departamento.
Dado un nombre de empleado, encontrar (si existe), el vehiculo
asignado.
Dado un codigo de vehiculo, encontrar el nombre del empleado que lo
usa.
Calcular el sueldo neto mensual de un empleado horas dado.
Calcular el sueldo neto mensual de un empleado plazo indeIinido dado.
Calcular el sueldo neto mensual de un empleado dado.
Dado un codigo un codigo de sindicato, encontrar los nombres de sus
aIiliados.
Para cada sindicato, indicar la cantidad de sus aIiliados.
Total de empleados
Total de empleados horas.
Total de empleados plazo indeIinido.
Total de vehiculos.
Total de vehiculos asignados a empleados horas.
1.210
Total de vehiculos asignados a empleados plazo indeIinido.
Total de vehiculos asignados a los empleados hora.
Sueldo neto mensual mayor y menor de los empleados.
Sueldo neto mensual mayor y menor de los empleados hora.
Sueldo neto mensual mayor y menor de los empleados plazo indeIinido.
Total cancelado en remuneraciones brutas mensuales.

La solucion al problema planteado, debe incluir el diagrama de clases
correspondiente.

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