Logo Studenta

Relaciones entre Objetos em Programação O.O.

¡Este material tiene más páginas!

Vista previa del material en texto

PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 15 
 
1.9. Relaciones entre objetos 
1.9.1. Notación UML e implementación estática en Java de relaciones (la 
simbología de los diagramas pueden cambiar de un autor a otro) 
Modelo Descripción Implementación 
Herencia o generalización: 
 
Son las relaciones donde una 
clase hereda propiedades de otra. 
 
class B extends A { 
} 
Asociación: 
 
Establecen alguna forma de 
comunicación entre dos clases. 
Cuando hay multiplicidad, 
pueden implementarse con 
arreglos o usando contenedores. 
class A { 
 public B otorga[]; 
} 
 
class B { 
 public A pide; 
} 
 
Asociación unidireccional: 
 
 
 
 
 
Similar a la anterior, pero 
califica el sentido de la 
comunicación. 
Uno a muchos 
class A { 
} 
 
class B { 
 public A cobra[]; 
} 
 
 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 16 
 
Agregación: 
 
 
 
 
Son una forma de asociación y 
se usan para representar la 
situación de que un objeto de 
una clase esté “agregado” dentro 
de otro que pertenece a otra 
clase: 
Agregación 
- Uno o más objetos están 
lógicamente contenidos dentro 
de otro/s. El objeto agregado, 
existe independientemente de 
aquel que lo “contiene”. 
Composición 
- Un objeto es físicamente 
construido a partir de otro. Esto 
implica que al destruir el objeto 
“compuesto”, también se 
destruye el objeto “interno”. 
Agregación: 
class A { 
 
} 
class B { 
 public A contenido[]; 
} 
 
Composición: 
class A { 
 public B incorporar[]; 
} 
class B { 
 public A contenido; 
} 
 
 
Dependencia o instanciación: 
 
 
Se da cuando un elemento del 
modelo, depende de modo tal 
que si el primero se modifica, el 
segundo se ve afectado o cuando 
un método de un objeto, crea un 
objeto de otra clase. 
Por ejemplo si A: Stock y B: 
OrdenDeCompra, una venta va a 
implicar la modificación del 
estado de los objetos que 
pertenecen a las dos clases. 
Se trata de una relación dinámica (no 
es estática). 
 
B x = new A(); 
... 
x.unMetodo(); 
Realización o implementación: 
 
 
Ocurre entre: 
Class e Interface 
Interface y Class 
Component e Interface 
Package e Interface 
Package y Class 
Indica que la primera 
implementa una operación u 
propiedad definida en la 
segunda. 
interface A { 
 void almacenar(); 
} 
class B implements A { 
 void almacenar(){} 
} 
 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 17 
 
Clase asociativa: 
 
Se trata de una clase que 
describe una relación de 
asociación entre otras dos clases. 
Por ejemplo los objetos de la 
clase D podrían servir como 
argumentos en la activación de 
métodos, que implementan la 
relación estática existente. 
class A { 
 public B theB; 
} 
 
class B { 
 public A graba[]; 
} 
 
class D { 
} 
? Por qué existen las clases Integer, Float, etc. si ya se cuenta con los tipos int, float, etc. 
1.9.2. Herencia 
Es la propiedad de heredar atributos y comportamientos de clases superiores en jerarquía, 
llamadas superclases o clases bases, esta característica permite aumentar el grado de reusabilidad de 
los componentes del sistema. 
En cada caso se debe analizar si lo que existe entre dos clases, es una relación de herencia, o 
una relación de “continencia” de una dentro de otra. La primera suele darse cuando se puede 
expresar que una clase "es un/a", la segunda habitualmente cuando se da la forma "tiene un/a". 
Normalmente para poder entender la utilidad de una clase, es necesario estudiar sus superclases. 
Una de las tareas más difíciles, es analizar y diseñar adecuadamente, la estructura de 
relaciones y dependencias que existen entre las clases de un sistema, y un error “grueso” en esta 
parte puede llevar a la inutilización de todo el desarrollo. Existen dos tipos de herencias, la simple y 
la múltiple. 
Herencia simple 
Se da cuando una clase hereda propiedades, solamente de una única clase de superior en 
jerarquía. Los mecanismos de herencia, son los que permiten crear las jerarquías de clases 
estructuradas en los denominados árboles de herencia, que a su vez hacen posible aplicar el 
concepto de construcción incremental de software. 
EJEMPLO 
Se quieren modelar diversas figuras geométricas. En el ejemplo, las clases, Circulo, 
Irregular y Rectángulo, heredan los atributos propiedades (atributos) y los comportamientos 
(métodos) de la clase Figura; mientras que Triangulo y Trapecio heredan de Irregulares y por lo 
tanto también de Figura en forma transitiva. 
Cada figura es fabricada con el mismo tipo de material, el cual tiene un determinado precio 
por centímetro cuadrado. El precio de una figura cualquiera se calcula multiplicando el valor del 
precio por la superficie de la figura y por el espesor del material. 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 18 
 
 
 
1. abstract class Figura { 
2. protected float espesor; 
3. public static final float precio = 5.35; 
4. public Figura(float e){ 
5. espesor = e; 
6. } 
7. public abstract double superficie(); 
8. public abstract double perimetro(); 
9. public float costo() { return superficie() * precio * espesor; } 
10. } 
11. class Rectangulo extends Figura { 
12. protected double alto, ancho; 
13. public Rectangulo(float e, double l, double n){ 
14. super(e); 
15. alto = l; 
16. ancho = n; 
17. } 
18. public double superficie(){ return alto * ancho; } 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 19 
 
19. public double perimetro(){ return alto * 2 + ancho * 2; } 
20. } 
21. abstract class Irregulares extends Figura { 
22. protected double altu; 
23. public Irregulares(float e, double h){ 
24. super(e); 
25. altu = h; 
26. } 
27. } 
28. class Triangulo extends Irregulares { 
29. private double hipot; 
30. public Triangulo(float e, double h, double t){ 
31. super(e, h); 
32. hipot = t; 
33. } 
34. public double superficie(){ 
35. return Math.sqrt(hipot * hipot - altu * altu)) * altu / 2; 
36. } 
37. public double perimetro(){ 
38. return altu + hipot + Math.sqrt(hipot * hipot - altu * altu))); 
39. } 
40. } 
41. class Trapecio extends Irregulares { 
42. private double bmayor, bmenor; 
43. public Trapecio(float e, double h, double m, double n){ 
44. super(e, h); 
45. bmayor = m; 
46. bmenor = n; 
47. } 
48. public double superficie(){ return (bmayor + bmenor) * altu * 2; } 
49. public double perimetro(){ return 0; } 
50. } 
51. class Circulo extends Figura { 
52. private final double PI = 3.14; 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 20 
 
53. protected double radio; 
54. public Circulo(float e, double r){ 
55. super(e); 
56. radio = r; 
57. } 
58. public double superficie(){ return PI * radio; } 
59. public double perimetro(){ return PI * radio * 2; } 
60. } 
 
Comentarios acerca del programa: 
1: Queuna clase sea abstracta implica que no pueden crearse objetos de la clase. Se usa cuando se 
quieren representar conceptos que no tienen instancias. En este caso el concepto de Figura es una 
generalización, que no tiene una instancia concreta a menos que se indique de que figura se trata. 
2: Si se califica protected un miembro de la clase, sólo es accesible desde esta y desde las subclases. 
3: Calificar un atributo como static especifica que se trata de una variable de clase, hacerlo como 
final especifica que se trata de una constante. 
4: No es posible crear objetos de esta clase pero el constructor se usará para construir los subobjetos 
que forman parte de los objetos que se creen de las clases derivadas. 
7, 8: Si se califican abstract implica que no se implementan en la clase, pero que sí se deben 
implementar en las subclases, sino estas también pasan a ser abstractas. 
11: El especificador extends indica la clase desde la cual se hereda. 
14: La llamada al método predefinido super, hace que se ejecute el constructor de la superclase. Esta 
llamada debe ser la primera que aparezca en el constructor de una clase derivada de otra. 
18, 19: Se implementan los métodos abstractos de la superclase, a esto se le llama sobre-escritura de 
métodos (o redefinición), no confundir con sobrecargar un método dentro de una clase. En el caso 
de la sobre-escritura de métodos, los prototipos de ambos deben ser exactamente iguales. 
29: Se califica privado, para que no se pueda acceder desde la subclase. 
35: Aquí se utiliza el método de clase sqrt(), perteneciente a la clase Math, para lo cual hay que 
importar el package java.lang.Math 
49: En este caso se ha supuesto que el modelo no requiere que se implemente este cálculo. Por lo 
tanto se ha realizado una implementación trivial del método, esto implica modelar un 
comportamiento “vacío”, de modo que se cumple con el requisito de sobre-escribir el método para 
evitar que la subclase también sea abstracta, cuando se active esta función regresará el valor 0. 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 21 
 
Supongamos que creamos la siguiente clase para probar el programa: 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
public class pruebaFiguras { 
public static void main(String [] arg){ 
Figura a; 
a = new Rectangulo(3.5, 5.0, 7.0, 9.0); 
System.out.println(a.superficie()); 
a = null; 
a = new Circulo(6.1, 3.4, 12.5); 
System.out.println(a.superficie()); 
} 
} 
3: Si bien no pueden crearse objetos de la clase Figura es posible declarar variables de ese tipo. La 
ventaja de esto es que con esas variables podemos referenciar objetos de cualquiera de las subclases 
(siempre y cuando se puedan crear esos objetos). 
4: Aquí se crea un objeto de la clase Rectangulo, que es referenciado con la variable ‘a’ que es la 
clase Figura, esto es válido ya que el objeto creado no es de la clase Figura, sino de la Rectangulo. 
Resumiendo podemos decir que con una variable del tipo de una superclase, es posible referenciar 
objetos de cualquiera de las subclases de aquella. 
5: Se activa el método superficie() del objeto Rectangulo, ya que es el que referencia la variable ‘a’. 
6: Esto anula la referencia al objeto Rectangulo y hace que quede disponible para su destrucción. 
7: Ahora se crea un objeto de la clase Circulo. En este caso si en el paso anterior no se hubiera 
asignado null, daría lo mismo ya que la referencia al objeto Rectangulo, igual se perdería, con lo que 
quedaría de todos modos disponible para su destrucción. 
8: Se activa el método superficie(), pero ahora el del objeto Circulo, ya que es el que en este 
momento referencia la variable ‘a’. 
La característica de activar el método que corresponde al objeto referenciado en un momento 
dado, se denomina polimorfismo. Esto es lo que se describe en el modelo de objetos como “la 
propiedad de los objetos de reaccionar a un mensaje con el método apropiado”. 
? Cuál es la utilidad de this y super, usadas como referencias. 
Herencia múltiple 
Se da cuando una clase hereda en forma simultánea, propiedades de más de una clase de 
jerarquía superior. En este caso puede ocurrir que una subclase, herede dos métodos con igual 
nombre pero comportamientos diferentes por dos ramas distintas. En situaciones como estas, se 
requiere especificar explícitamente la clase a la que pertenece el método o variables de instancia, 
que se desean acceder. 
En el desarrollo de un programa O.O., aunque no es lo más frecuente, a veces existe la 
necesidad de describir jerarquías de herencia múltiple, como resultado de la identificación de las 
abstracciones y sus interrelaciones, que participan en el problema. 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 22 
 
En Java la herencia múltiple está limitada, y sólo es posible utilizando interfaces, que son clases 
abstractas puras (todos los métodos abstractos y todos los atributos constantes). 
EJEMPLO 
Si analizamos el diagrama que herencia de vehículos que se muestra más abajo, veremos que 
el esquema nos permite heredar atributos y comportamientos de más de una clase superior. En este 
caso un CAMION es un VEHÍCULO de CARGA, relación expresada a través de TRANSPORTE, 
por lo tanto un objeto CAMION hereda las propiedades (atributos y métodos) de todas las clases de 
la cual hereda, aunque esto no implica que tenga acceso directo a ellos (depende de los calificadores 
-private, #protected, +public). 
 
? En qué se diferencian una interface de una clase abstracta. 
1.9.3. Agregación 
Ocurre cuando una clase no hereda propiedades de otra, sino que, está incluida en otra. En 
este caso una es la clase “continente” y la otra la “contenida”. Esta propiedad, como en la herencia, 
permite rehusar clases para construir otras. 
Las relaciones de agregación normalmente se dan cuando se pueden expresar en términos 
"está formado por" o visto desde el otro lado “forma parte de”. 
¿Podemos hablar de que un auto está compuesto por un motor? Si la respuesta es afirmativa, 
entonces estamos en presencia de una relación de agregación. Las relaciones que implican un 
vínculo más fuerte, se las denomina de composición. Por ejemplo: 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 23 
 
a) un objeto MOTOR está formado por un CARBURADOR (agregación) 
b) un objeto CUERPO_HUMANO está compuesto por CEREBRO (composición) 
Por supuesto que no siempre las relaciones surgen en forma tan evidente. Normalmente esto 
implica que se debe realizar un análisis más profundo del problema a modelar. 
? Cómo sería la implementación de las relaciones del siguiente modelo. 
 
1.9.4. Asociación 
Se da cuando un objeto de una clase está vinculado a un objeto de otra clase, de modo tal 
que existe una relación pero que no es de agregación. 
Por ejemplo en el modelo de un sistema de alumnos de la Facultad, entre un objeto 
ALUMNO y un objeto EXAMEN (ya rendido), sería difícil hablar de que uno de ellos contiene al 
otro, pero evidentemente existe un vínculo entre ambos (que podría expresarse como que un 
ALUMNO � RINDIO � EXAMEN). 
EJEMPLO 
Implementar en Java el siguiente modelo sobre el Registro de Automotores, con seis clases (una de 
ellas un actor), donde Formulario08 (que sirve también como clase asociativa para la relación de 
posesión) se utiliza para representar los datos de inscripción de un Vehículo. 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 24 
 
Así, el Propietario de un Vehículo lo inscribe en el RNA (relación inscribe), lo que implica la 
creación de un objetoFormulario08, para registrar la inscripción (relación de inscripción). 
 
 
 
 
 
 
 
 
 
 
 
 
? Cuáles son las diferentes formas de relaciones de asociación, que aparecen en el modelo anterior 
y cómo sería la implementación. 
1.10. Excepciones 
Una excepción es un tipo de error o condición anormal que aparece durante la ejecución de un 
programa. Algunas excepciones críticas hacen que se deba finalizar la ejecución del programa, por 
ejemplo un fallo a nivel del hardware. Otras en cambio sí son recuperables, como por ejemplo el no 
encontrar un archivo del cual hay que leer datos. 
Los sucesos que tienen lugar cuando se produce una excepción son: 
1. se interrumpe la ejecución del código del programa que se estaba ejecutando. 
2. se crea un objeto de la clase que maneja ese tipo de excepciones y se pasa la referencia del 
objeto creado, al método que ha provocado el error. 
3. finalmente el método puede gestionar la excepción (capturarla), o dejar que la trate el gestor 
por defecto del intérprete Java. En este último caso se mostrará un mensaje describiendo la 
excepción, la traza de la pila de llamadas desde el lugar donde se produjo la excepción y se 
finaliza el programa. 
La gestión de excepciones en Java se especifica a través de las siguientes palabras reservadas: try, 
catch, throw, throws y finally. 
Las sentencias try y catch forman una unidad. El objeto de la sentencia try es indicar que sentencia/s 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 25 
 
puede llegar a producir una excepción. El fin de la sentencia catch es indicar dónde se resuelve la 
condición que provocó la excepción, para luego continuar la ejecución del programa como si el 
error no hubiese ocurrido. 
Cuando surge una excepción el control del programa se transfiere desde el bloque try al bloque 
catch. Una vez que se ha ejecutado la sentencia catch, el control del programa continúa en la línea 
siguiente después del bloque try/catch. 
Si resulta necesario forzar la ejecución obligatoria de determinado código al procesar un bloque try, 
se indica agregando un bloque finally. 
Forma de uso: 
try { 
// bloque de código que puede producir las excepciones TipoExcepción1, TipoExcepción2 
} 
catch (TipoExcepción1 ex) { 
// gestor de excepciones para TipoExcepción1 
} 
catch (TipoExcepción2 ex) { 
// gestor de excepciones para TipoExcepción2 
} 
finally { 
// bloque de código que se ejecutará en forma obligatoria, 
// al finalizar la ejecución del bloque try o alguno de sus catch 
} 
Para especificar el lugar del programa donde se va a lanzar una excepción, se utiliza la palabra clave 
throw. Si un método lanza una excepción, esta debe ser especificada en la cabecera de la declaración 
del método mediante la palabra throws. 
EJEMPLO 
class MiExcepcion extends Exception { 
private int codigo; 
MiExcepcion(int a) { 
codigo = a; 
} 
public String toString() { 
return "MiExcepcion[" + codigo + "]"; 
} 
} 
class PruebaExcepcion { 
static void calcular(int a) throws MiExcepcion { 
System.out.println("Se llama a calcular(" + a + ")"); 
if(a > 10) throw new MiExcepcion(a); 
System.out.println("Salida normal"); 
} 
public static void main(String args[]) { 
try { 
calcular(1); 
calcular(20); 
} 
catch (MiExcepcion e) { 
System.out.println("Capturada " + e); 
} 
} 
} 
Si un método redefine un método de una superclase calificado con throws, el método de la clase 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 26 
 
derivada no tiene obligatoriamente que lanzar todas las excepciones de la clase base. Es posible en 
el método de la subclase lanzar las mismas excepciones o menos, pero no puede lanzar más. No 
puede tampoco lanzar nuevas excepciones ni excepciones de una clase más general. 
? Cómo se determina el acceso a un archivo entre los packages, suponiendo que están agrupadas 
las clases del siguiente modo en 3 paquetes (ErrorDeEvaluacion, MetodoNumerico, Simpson, 
Trapecios) (FuncionIntegral, IntegralDefinida) (el resto de las clases). 
 
 
 
El lenguaje tiene definida una jerarquía de clases de excepciones, a la cual se le pueden agregar 
nuevas clases. 
 
Throwable 
 Error 
 LinkageError 
 ClassCircularityError 
 ClassFormatError 
 ExceptionInInitializerError 
 IncompatibleClassChangeError 
 AbstractMethodError 
 IllegalAccessError 
 InstantiationError 
 NoSuchFieldError 
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional 
 Facultad Regional Mendoza 
 Guía de programación O.O. cátedra de Paradigmas de Programación 27 
 
 NoSuchMethodError 
 NoClassDefFoundError 
 UnsatisfiedLinkError 
 VerifyError 
 VirtualMachineError 
 InternalError 
 OutOfMemoryError 
 StackOverflowError 
 UnknownError 
 ThreadDeath 
 Exception 
 ClassNotFoundException 
 CloneNotSupportedException 
 IllegalAccessException 
 InstantiationException 
 InterruptedException 
 RuntimeException 
 ArithmeticException 
 ArrayStoreException 
 ClassCastException 
 IllegalArgumentException 
 IllegalThreadStateException 
 NumberFormatException 
 IllegalMonitorStateException 
 IndexOutOfBoundsException 
 NegativeArraySizeException 
 NullPointerException 
 SecurityException 
? Cómo se captura una excepción.

Continuar navegando

Contenido elegido para ti

12 pag.
Práctica 7 V2

UNAM

User badge image

Jorge Luis Tellez

23 pag.
Semana-3---Clases-en-java

UBAM

User badge image

Contenidos Muy Locos

17 pag.
25 pag.
sesion01-apuntes

SIN SIGLA

User badge image

Karen Marlene Valdez