Examen POO

26
1 Conceptos y Principios de Orientación a Objetos Rosalía Laza Fidalgo. Departamento de Informática. Universidad de Vigo Introducción al enfoque O.O Durante los últimos años, la Programación Orientada a Objetos (Object Oriented Programming, u OOP) ha tomado gran importancia. El término OOP indica más una forma de diseño y una metodología de desarrollo que un lenguaje de programación, ya que en realidad se pueden aplicar los principios del paradigma de programación orientada a objetos (encapsulación, herencia y polimorfismo) en cualquier lenguaje de programación. También es razonable pensar que todo lo programado por lenguajes orientados a objetos es OOP. Esto no es cierto, ya que incluso en un lenguaje orientado a objetos puro, es posible que un mal diseño lleve a una implementación que en realidad no siga los principios de Orientación a Objetos mencionados.

Transcript of Examen POO

1

Conceptos y Principios de Orientación a Objetos

Rosalía Laza Fidalgo.Departamento de Informática.

Universidad de Vigo

Introducción al enfoque O.O

Durante los últimos años, la Programación Orientada a Objetos (Object Oriented Programming, u OOP) ha tomado gran importancia. El término OOP indica más una forma de diseño y una metodología de desarrollo que un lenguaje de programación, ya que en realidad se pueden aplicar los principios del paradigma de programación orientada a objetos (encapsulación, herencia y polimorfismo) en cualquier lenguaje de programación.También es razonable pensar que todo lo programado por lenguajes orientados a objetos es OOP. Esto no es cierto, ya que incluso en un lenguaje orientado a objetos puro, es posible que un mal diseño lleve a una implementación que en realidad no siga los principios de Orientación a Objetos mencionados.

2

Desarrollo de software

PORTABILIDAD. El software desarrollado debe funcionar independientemente del hardware y del entorno de funcionamiento o Sistema Operativo sobre el cual se ejecute.PRODUCTIVIDAD. Uno de los principales objetivos es simplificar el proceso de desarrollo de Software, para lo cual es fundamental reutilizar componentes.MANTENIMIENTO. Constituye una de las etapas más costosas en el desarrollo de software que, por tanto, habrá que optimizar. Es fundamental estructurar bien el programa para prever futuros cambios o modificaciones.CALIDAD. A la hora de producir software, no hay que olvidar que se deben de desarrollar productos de calidad, dada a partir de una serie de aspectos como robustez, fiabilidad, eficiencia, flexibilidad, ...

Programación Estructurada vsProgramación Orientada a Objetos.

El paradigma de programación estructurado, se basa en tomar un problema, y subdividirlo sucesivamente en subproblemas, hasta llegar a unos subproblemas suficientemente sencillos de resolver.Problemas del paradigma de programación estructurada:

Creciente complejidad de las aplicaciones.Limitaciones en la modelización de problemas no estructurados: El software se estructura según la solución del problema en vez de enfocarlo directamente según el problema en sí mismo. Ésto puede conducir a una separación conceptual entre el problema del mundo real y su representación e implementación informática.Difícil reutilización del software.Mantenimiento difícil y costoso.

3

Programación Estructurada vsProgramación Orientada a Objetos.

Programación Orientada a Objetos no trata de hacer más sencillo el problema a resolver (dividiéndolo), sino que trata de simular el problema a resolver. Así, en todo problema existen una serie de entidades (físicas o no) que interaccionan para resolverlo, de manera que simulando estas entidades, y su comportamiento, es posible resolver el problema en cuestión. Cada una de estas entidades es un objeto en el sistema desarrollado mediante OOP, de ahí el nombre de programación orientada a objetos.Ventajas de OOP:

UniformidadComprensiónFlexibilidadReusabilidad

Conceptos básicos de Orientación a Objetos

ClasesObjetosEncapsulación y Ocultación de datosHerenciaAbstracciónPolimorfismo y Ligadura Dinámica

4

Clases I

Una clase permite describir objetos similares mediante la definición de sus estructuras de datos y métodos comunes. Las clases son plantillas para objetos, permitiendo la agrupación de objetos que comparten las mismas propiedades y comportamiento.

Existen rectángulos de varios tamaños, pero todos ellos pertenecen a la clase rectángulo, que define los atributos comunes para todos ancho y alto, a la vez que el método (o función miembro) calcularArea, también común para todos.

Clases II

class Empleado {private String nombre;private int edad;private int antiguedad;private float salario;

public float calcularSalario(int horasTrabajadas) {return ( ( salario * horasTrabajadas ) + ( antiguedad * 60 ) );

}}

Clase en JAVA

5

Clases III

Una superclase es una clase de más alto nivel que agrupa otras clases con propiedades y funciones comunes, por tanto, los objetos (también llamados instancias de una clase determinada) de esas otras clases son también objetos (instancias) de la superclase. Las clases que son agrupadas por una superclase son sus subclases.

Clases. Modificadores de clase en Java.

Una declaración de clase puede ir precedida de modificadores que otorgan a la clase ciertas propiedades:

public. Una clase public es públicamente accesible. abstract. Una clase abstracta se considera incompleta y no se pueden crear instancias de dicha clase. Esto sucede porque la clase contiene métodos abstract que deben ser implementados por una subclase.final. Una clase final no admite subclases.

Una clase no puede ser a la vez final y abstract.

6

Clases. Métodos y Mensajes ILos métodos no son más que funciones miembro de una clase. Se trata de funciones que, automáticamente, tratan con los atributos del objeto como si fuesen variables locales a la función.Los métodos, por tanto, son el mecanismo de acceso y manipulación de los datos del objeto.Cada método está constituido por un conjunto de instrucciones escritas en un lenguaje de programación determinado, asociadas a un objeto determinado y cuya ejecución sólo puede desencadenarse a través de un mensaje recibido por este o por sus descendientes.Los objetos se comunican a través del paso de mensajes. En la práctica, esto supone la ejecución de un método en un objeto determinado. Un mensaje le dice a un objeto lo que tiene que hacer, identificando un método y los operandos necesarios para su ejecución. Los objetos reciben, interpretan y responden a mensajes procedentes de otros objetos.Un mensaje consiste en una dirección (a cuál o cuáles objetos se envía) y una instrucción formada por un nombre de método y 0 o más parámetros:

OBJETO.metodo [parámetros]

Clases. Métodos y Mensajes II

Supongamos el conjunto de objetos de los Empleadosde una empresa. Para un empleado concreto, queremos calcular su salario mensual, pero para ello se necesita conocer el número de horas trabajadas. Se envía un mensaje al objeto, empleado23, de activar calcularSalario() con unas horasTrabajadasdeterminadas:

empleado23.calcularSalario( horasTrabajadas )

Ante este mensaje, el receptor (empleado23) ejecutarásu método calcularSalario() (siempre que el emisor tenga permiso para solicitar dicha operación), o, en caso de no poder procesar el mensaje, se devolverá un mensaje de error.

7

Clases. Métodos y Mensajes IIIclass Empleado {

private String nombre;private int edad;private int antiguedad;private float salario;

public Empleado(String n, int e, int a, float s) {

nombre = n;edad = e;antiguedad = a;salario = s;

}

public float calcularSalario(int horasTrabajadas){

return ( ( salario * horasTrabajadas ) + ( antiguedad * 60 ) );}

public String toString(){

return ( nombre + “ “ + edad );}

}

Constructor

Clases. Métodos y Mensajes III

Empleado empl1 = new Empleado( “Filemón”, 32, 10, 30 );float salarioEmpl1 = empl1.calcularSalario( 1260 );

System.out.print( empl1.toString() ); // o System.out.print( empl1 );

System.out.print( empl1 + “ “ + salarioEmpl1 ); // “Filemón 32 38400”

8

Clases. Atributos.Deben ser significativas dentro del entorno de la aplicación. Es decir, deben servir para identificar claramente y de manera única a cada uno de los objetos.

class Libro {private String editorial;private String autor;private int numEdicion;private String isbn;private int numPaginas;private int anno;

public Libro(String e, String a, int n, String i, int p, int an){

autor = a;editorial = e;numEdicion = n;isbn = i;numPaginas = p;anno = an;

}}

El número de atributos debe ser el mínimo para realizar todas las operaciones que requiere la aplicación.

Clases. Modificadores de Atributos en Java.

Los atributos de clase pueden precederse con modificadores. Pueden ser:Modificadores de acceso. Existen cuatro posibles modificadores:

predeterminado. Sólo son accesibles desde las clases del paqueteprivate. Sólo son accesibles en la propia claseprotected. Son accesibles en las subclases de la clase y en la propia clase.public. Son accesible en cualquier parte donde la clase sea accesible.

static. Se crean variables de clase. Cuando se declara un campo static en una clase sólo existe una copia de ese campo, independientemente del número de instancias de la clase que se creen.Un atributo static puede ser referido directamente dentro de su propia clase, pero cuando se accede a él externamente, hay que utlizar el nombre de la clase.

Ejemplo:static int numero;...Vehiculo.numero;

final. Un atributo final es aquel cuyo valor no puede cambiar después de ser inicializado.

Ejemplo: private static final int NUM_COCHES=10;

9

Resumen Clase.Una clase es una plantilla para objetos, permitiendo agrupar

objetos que comparten las mismas propiedades y comportamientos.

Los métodos permiten el acceso y manipulación de los datos del objeto. Al definir un método se indica la accesibilidad, lo que devuelve nombre del método y los parámetros entre paréntesis. Ejemplo: public void saltar(), private int consultarHoras().

Los atributos describen los objetos. Al definirlos se pone modificadores de acceso [static] [final] el tipo nombre. Ejemplo: private int edad; private static int numAlumnos; private static final int NUM_MAX_ALUM = 100;

Los objetos se comunican entre sí a través del paso de mensajes, en la práctica supone la ejecución de un método determinado. Obj1.metodo(); (Con o sin parámetros)

Tipos de datos en Java.

Java proporciona ocho tipos primitivos: cuatro para enteros (byte, short, int y long), dos para número en coma flotante (float, double), carácter (char) y booleano (boolean). El resto de tipos son tipos referencia. Una referencia es una variable que guarda la dirección de memoria en la que se almacena un objeto. Una referencia puede almacenar también el valor null, indicando así que no referencia a ningún objeto.Ejemplo: String nombre. La variable nombrereferencia a un objeto cadena (de tipo String). String es una clase que proporciona Java.

10

Objetos I

Smith y Tockey sugieren que “un objeto representa un elemento, unidad o entidad individual e identificable, ya sea real o abstracta, con un papel bien definido en el dominio del problema”.

En algunos lenguajes, como por ejemplo SmallTalk, la Orientación a Objetos es pura, y todos los posibles elementos del propio lenguaje son objetos. En otros lenguajes, los más habituales, algunas cosas no son objetos, sino atributos, valores o características de objetos, representado por tipos de datos como entero, flotante, etc. Algunas de ellas son simplemente atributos de los objetos como el color, el tamaño y la velocidad. Los atributos reflejan el estado de un objeto.

Objetos II

Un OBJETO es la integración de tres aspectos:

Relaciones, permiten que el objeto se integre en la organización de la que forma parte junto con otros objetos. Las relaciones pueden ser de tipo jerárquico(herencia) o semántico, como en el caso de los objetos que componen la antena parabólica.Propiedades (atributos), distinguen un objeto de los restantes (tamaño, posición, color, ...). Cada propiedad tendrá un determinado valor. Las propiedades de un objeto pueden ser heredadas por sus descendientes.Métodos (operaciones), conjunto de operaciones que puede hacer un objeto (estudiar, caminar, trabajar, rotar, volar, etc.). Un método es un procedimiento o función que altera el estado de un objeto o hace que el objeto envíe un mensaje, es decir, que devuelva valores. Los métodos pueden ser heredados por sus descendientes.

11

Objetos III

Todo objeto tiene un estado, exhibe algún comportamiento bien definido y tiene una identidadúnica. El estado de un objeto abarca todos los atributos (normalmente estáticos) del mismo, más los valores actuales (normalmente dinámicos) de cada uno de esos atributos. El comportamiento se refiere a cómo actúa y reacciona un objeto, en términos de sus cambios de estado y paso de mensajes.Ejemplo: Una máquina expendedora de refrescos puede aceptar un tipo de monedas. Esta es una propiedad estática (es decir, fija), lo que significa que es una característica esencial de la máquina. En cambio, la cantidad actual de monedas que ha aceptado en un momento dado representa el valor dinámico de esta propiedad (atributo). El mecanismo que acepta las monedas y devuelve un refresco a cambio es un conjunto de métodos: su comportamiento.

Ejemplo de Objetos en JAVApublic class Rectangulo {private int ancho;private int alto;

public Rectangulo(int n, int l){

ancho = n;alto = l;

}

public int calculaArea(){

return ( ancho * alto );}

}

class ppal {public static void main(String[] args){

Rectangulo r1 = new Rectangulo( 5, 10 );Rectangulo r2 = new Rectangulo( 6, 7 );System.out.println( “El área de r1 es “ + r1.calculaArea() ); // 50System.out.println( “El área de r2 es “ + r2.calculaArea() ); // 42

}}

¿Métodos que modifiquen el estado del objeto?

12

Objetos. Identidad.

Cada objeto existe y tiene entidad por sí mismo. La identidad expresa que aunque dos objetos sean exactamente iguales en sus atributos, son distintos entre sí. De esta forma, incluso una serie de coches recién salidos de fábrica son distintos los unos de los otros.Esto tiene importancia cuando descendemos al nivel de programación. Aquí, cada objeto tiene un controlador por el cual se identifica. Éste puede ser una variable, una estructura de datos, una cadena de caracteres, etc. El controlador será distinto para cada uno de los objetos, aunque las referencias a éstos sean uniformes e independientes del contenido, se permite crear agrupaciones de objetos con el mismo tratamiento (clases).

Ejemplo en JAVA

class A {}

class Ppal {static public void main(String[] args){

A refA = new A(); // refA es una referencia.A refB = refA; // refA y refB apuntan al

mismo objetoA refC = null; // No apunta a ningún

objeto}

}

13

Ejemplos de sintaxis en Java. Clases

public class Repaso_if{

public static void mayorEs(int x, int y, int z){

int mayor= x;if (y > x && y > z) mayor= y;else if (z > x && z > y) mayor = z;

System.out.println("El número mayor de "+x+", "+y+", "+z+" es: "+ mayor);

}}

/* Enunciado: Escribe un método que dados tres números indique cual es el mayor * (Objetivos: tipo básico int, salida por pantalla, definición de un método)*/

Encapsulación y Ocultación de datos I

Un objeto es la integración de atributos y métodos. Los datos de la programación tradicional son ahora atributos de un objeto y las funciones los métodos que se utilizan para procesar los atributos de ese objeto. Esto quiere decir que todos esos datos y funciones, en lugar de estar dispersos, como en programación estructurada, se encapsulan en una única unidad, que en la mayoría de lenguajes es la clase. A partir de esta clase, se instancian posteriormente los objetos. La organización interna de la clase es inaccesible desde el exterior (ocultamiento de la información). Las partes ocultas o encapsuladas de una clase, y por tanto de sus objetos, son su implementación privada, o lo que es lo mismo se dice que son privados. Se dice que los métodos visibles son públicos y forman la interfaz del objeto (en general se asume el ocultar los atributos como una buena técnica de programación).

14

Encapsulación y Ocultación de datos II

Cada objeto mantiene sus propios datos internos y los usuarios de un objeto pueden acceder y manipular los datos internos solamente a través de sus métodos, de tal forma que la interfaz de un objeto es su conjunto de métodos públicos. Así, detalles internos de la implementación de un objeto como algoritmos o representaciones internas de datos, no son visibles. Esto refuerza el ocultamiento de la información y permite un alto nivel de abstracción.De la misma forma que no tenemos acceso a las operaciones internas que realiza un medidor de combustible en un coche para indicarnos la cantidad de combustible disponible. No necesitamos saber, no tenemos por qué tener acceso, a las operaciones internas de un objeto que representa un altímetro de un avión en una aplicación; sólo es necesario conocer el método del objeto del cuál se obtiene esa altura, no cómo el objeto altímetro interacciona con el altímetro físico.

Encapsulación y Ocultación de datos III

Esto no quiere decir que sea imposible conocer información de un objeto, sino que las peticiones de información a un objeto deben cursarse a través de mensajes al objeto con el fin de realizar una determinada operación. La respuesta a esa petición será la información solicitada siempre que el objeto compruebe que el solicitante tiene acceso a ella.El ocultamiento de información facilita que los usuarios de un objeto no estén expuestos al peligro cuando su implementación cambia mientras no haya cambiado la interfaz. Entonces los programas que utilizaban el objeto pueden seguir funcionando sin alteración alguna. Ejemplo: Si el objeto altímetro anterior cambia su forma de interaccionar con el altímetro real del avión (por ejemplo, porque se ha cambiado de modelo), no es necesario cambiar el resto de objetos que utilizan ese objeto altímetro.

15

Ejemplo de encapsulación y ocultación de datosclass Cerradura {

private int combinacion;

public boolean abreCerradura(int c) {if ( c == combinacion )

return true;else return false;

}public Cerradura(int c) {

combinacion = c;}

}

class Ppal {public static void main(String[] args){

Cerradura candado = new Cerradura( 123 );

System.out.println( candado.abreCerradura( 456 ) ); //‘false’System.out.println( candado.abreCerradura( 123 ) ); //‘true’

}}

Herencia I

La herencia designa la facultad de los objetos de compartir propiedades y operaciones entre ellos. Como la herencia humana, existen unas determinadas clases hijo que heredan las propiedades y atributos de otras clases padres.Desde un punto de vista de implementación, se trata de crear nuevas clases de objetos a partir de otras ya existentes, es decir, de reutilizar el comportamiento de una clase en la definición de otras nuevas. Cualquier clase hereda la declaración de los atributos y los métodos de su superclase, pudiendo estas subclasesespecializarse añadiendo una declaraciones de atributos adicionales y declaraciones de métodos propios o incluso cambiando los atributos y métodos heredados.

16

Herencia II

Una de las razones para emplear la herencia es que permite la reutilización del código de proyectos anteriores, permitiendo la modificación (o especialización) de aquellos aspectos que no concuerden exactamente con las necesidades de nuestra aplicación. En las jerarquías que establecen las relaciones de herencia, a medida que descendemos de nivel, cada nivel aporta un grado más de especialización sobre el nivel inmediatamente superior.En cambio, si partimos del nivel de clases inferiores hacia los niveles superiores, cada nivel supone una generalización del nivel inmediatamente inferior.

Herencia Simple

Se produce cuando la clase que recibe la herencia tiene un sólo padre.

De atributos: Los atributos de una clase son heredadas automáticamente por todos sus descendientes. Esto quiere decir que un objeto tiene propiedades de su clase y propiedades de las clases heredadas.

Los atributos deben definirse en las clases tan cercanas a las clases terminales de la jerarquía como sea posible. En los niveles superiores de la jerarquía normalmente no existe suficiente información como para que puedan decidirse unos atributos u otros, mientras que las clases terminales ya representan entidades más concretas.

De métodos. La herencia de los métodos permite aumentar la reutilización de software y simplifica, por tanto, el diseño. Además, facilita la programación, reduce redundancias y simplifica la corrección de los programas. Los métodos deben situarse tan elevados en la jerarquía de clases como sea posible, aunque puedan ser abstractos (es decir, sin incluir código). De esta forma se facilita la abstracción, al poder establecer métodos comunes a varias clases.

17

public class Persona {private String nombre;

public Persona(String n){

nombre = n;}public String getNombre(){

return nombre;}

}

public class Estudiante extends Persona {private String titulacion;

public Estudiante(String n, String t){

super( n );// Llama al constructor de Personatitulacion = t;

}public String getTitulacion(){

return titulacion;}public String toString(){

return getNombre() + “, “ + titulacion;}

}

Un programa en Java en el que la clase estudiante hereda de la clase persona. La herencia se indica en Java con la palabra clave extends. Aquellas clases que no heredan explícitamente de ninguna clase lo hacen de Object.

public class Ppal {

public static void main(String[] args){Estudiante est1;

est1 = new Estudiante(“Paula”,”Ingeniera Informatica”);

System.out.println(est1); // llama a “toString”

System.out.println( est1.getNombre() );}}

Herencia Múltiple ISe produce cuando el objeto que hereda tiene más de un padre o alguno de sus antepasados tiene varios padres.La herencia múltiple ofrece la posibilidad de definir clases híbridas que comparten los miembros de dos o más clases predefinidas. Es difícil de encontrar en los lenguajes OO, ya que para determinar si un objeto hereda un miembro puede que haya que seguir caminos por más de un padre.Pueden darse conflictos debidos a que un objeto herede la misma propiedad o método de dos objetos situados al mismo nivel o a distinto nivel (colisión de nombres). Este tipo de situaciones se da cuando una clase hereda 2 o más versiones de un método provenientes de los distintos ancestros, y es inevitable en el caso de la herencia repetida, que se produce cuando una clase hereda de otras que a su vez heredan de una clase común.En cualquier caso, esta herencia suele producir los conflictos conocidos como colisión de nombres. Sucede cuando el nombre de un método o atributo existe en más de una clase de nivel superior.

18

Herencia Múltiple II

Java no permite herencia múltiple. La herencia siempre es simple, aunque permite la implementación de múltiples interfaces. Los interfaces son clases que sólo contienen métodos abstractos.Se pueden distinguir otros dos tipos de herencia:

Herencia selectiva (o parcial) que permite decidir qué métodos se heredan y cuáles no. Esto complica sintácticamente la definición de una clase, lo que hace que sean pocos los lenguajes que la adoptan.Herencia no selectiva que fuerza a que todos los atributos y métodos sean heredados. Esta es la más utilizada, incluyendo lenguajes como C++, Java o C#.

class Profesor {private String nombre;

public Profesor(String n){

nombre = n;}public String getNombre(){

return nombre;}

}

interface Investigador {public String getCampoInvestigacion();

}

class ProfesorUniversitario extendsProfesor implements Investigador {

private String investigacion;

public ProfesorUniversitario(String n, String i)

{super( n ); // Constructor de Profesorinvestigacion = i;

}

public String getCampoInvestigacion(){

return investigacion;}

}

19

Ejemplos de sintaxis en Java. Clases

public class Repaso_Bucle{

public static int suma(int y){ int sum= 0;

if (y <= 0) System.out.println("El número introducido es menor o igual a 0");

else for (int i = 1; i <= y; i++)sum+=i;

System.out.println("Resultado de la suma es: "+sum);return sum;

}}

/* Enunciado: Escribe un método que dado un número N mayor que 0, calcule la siguiente suma 1+2+3+...+N* Objetivos (bucles, definición del bucle for, se podría explicar el mismo ejercicio con un while)*/

Ejemplos de sintaxis en Java. Clases

public class Calculadora{ private static double suma(double x, double y){

return x + y;}

private static double producto(double x, double y){

return x * y;}

private static double resta(double x, double y){

return x - y;}

private static double division(double x, double y){

return x / y;}

/* Escribe los métodos que puede tener una calculadora, además proporciona un método calcular que selecciona la operación en función de un char.* Objetivos (definir varios métodos que ellos los identifiquen, métodos privados, swith)*/

public static double calcular(char o, double x, double y){

double result = 0;switch (o){

case '+': result= suma(x,y);break;

case '-': result = resta(x,y);break;

case '*': result = producto(x,y);break;

case '/': result = division(x,y);break;

default: System.out.println("No conozco la operacion");

}System.out.println("El resultado es: "+result);return result;

}}

20

Organización y relaciones entre objetos I

Organización jerárquica:Las clases se organizan jerárquicamente si tenemos en cuenta la relación de herencia.

RAÍZ (o SUPERCLASE): Es una clase, que suele ser único y especial, caracterizado por estar situado en el punto más elevado de la organización jerárquica. CLASES INTERMEDIAS, descienden directamente o indirectamente de la raíz y a su vez tienen descendientes. En general reciben el nombre de clases si descienden directamente de la raíz o subclases si descienden de una clase o otra subclase. Otra clasificación de los objetos intermedios se basa en si sus descendientes son también intermedios o son terminales. A los primeros se les conoce entonces como clase abstracta y a los segundos clase de objetos terminales.CLASES TERMINALES, descienden de una clase o una subclase y no tienen descendientes. Los objetos normalmente se instanciarán de estas clases.

Organización y relaciones entre objetos II

Relaciones jerárquicas entre clases:Una clase es padre de otra cuando existe una relación jerárquica directa entre ellas, según la cual la primera se encuentra situado inmediatamente encima de la segunda en el árbol jerárquico. Si una clase es padre de otra, la segunda es hija de la primera.Una organización jerárquica es simple cuando una clase sólo puede tener un padre, y compleja cuando puede tener varios padres.

A es antepasado de B, si A es padre de B o si A es padre de un antepasado de B. B es descendiente de A, si B es hija de A o si es hija de un descendiente de A.

21

Organización y relaciones entre objetos III

Relación de asociación entre clases:Las relaciones de asociación puede decirse que son de dos tipos: composición y uso. En el primer tipo, se establece una relación “es parte de” entre dos clases cuando la segunda de ellas tiene atributos que son referencias a la primera, y los objetos a los que apuntan son creados cuando un objeto de la segunda clase es creada, y destruidos cuando el mismo es destruido. En el segundo caso sucede lo mismo, a excepción de que los objetos ya existen y son pasados normalmente en el constructor del método. La eliminación de objetos de la primera clase no supone la eliminación de objetos de las clases relacionadas. La relación entre clases es del tipo “usa a”.

Un ejemplo de ésto podría ser la relación de un alumno, las materias y sus notas. Los objetos de la clase Alumno poseeno están compuestos por objetos de la clase Notas (que no tienen sentido sin el alumno), pero a la vez usan objetos de la clase Asignatura, que perviven independientemente de los objetos de la clase Alumno.

Organización y relaciones entre objetos IV

class Punto {private double x;private double y;public Punto(double a, double b){

x = a;y = b;

}

public double getX(){

return x;}public double getY(){

return y;}

}

class Linea {private Punto p1;private Punto p2;private Punto centro;

public Linea(double x1, double y1, double x2, double y2, Punto c){

p1 = new Punto( x1, y1 );p2 = new Punto( x2, y2 );centro = c;

}}

Una línea está formada por dos puntos. Los objetos de Punto forman la Línea, y no tiene sentido sin ella. La clase Línea usa o conoce el Punto que supone el centro del plano.

22

Abstracción IShaw define abstracción como “una descripción simplificada o especificación de un sistema que enfatiza algunos de los detalles o propiedades del mismo mientras suprime otros. Una buena abstracción es aquella que enfatiza detalles significativos al lector o usuario y suprime detalles que son, al menos por el momento, irrelevantes o causa de distracción”.La abstracción es una técnica de programación que permite definir nuevos tipos de datos por el usuario. La esencia de la abstracción es similar al uso de un tipo de dato de un lenguaje de programación, cuyo uso se realiza sin saber como está representado o implementado.Una abstracción se centra en la vista externa de un objeto, de modo que sirva para separar el comportamiento esencial de un objeto de su implementación. Definir una abstracción significa describir una entidad del mundo real, no importa lo compleja que pueda ser, y a continuación utilizar esta descripción en un programa.

Abstracción II

El uso de un objeto por vía de su especificación como tipo abstracto o clase abstracta significa que, si su aspecto interno experimenta modificaciones, otras partes del sistema no se verán afectadas.Un método abstracto es, como vimos, un método que declara una funcionalidad que debe ser implementada en todas las clases derivadas de la clase en que se vaya a utilizar. En otras palabras, a través de un método indicamos lo que deberían poder hacer los objetos de dichas subclases. No se implementa en la clase base, sino que cada subclase debe tener su propia implementación.

23

abstract class Figura {abstract public float calculaArea();

}

class Rectangulo extends Figura {private float ancho;private float alto;

public float calculaArea(){

return ancho * alto; }public Rectangulo(int a, int l){

ancho = a; largo = l;}

}

class Circulo extends Figura {private float radio;

public float calculaArea(){

return radio * radio * Math.PI;}public Circulo(int r){

radio = r;}

}

class Ppal {public static void main(String[] args){Rectangulo r = new Rectangulo( 6, 10 );Circulo c = new Circulo( 5 );System.out.println( r.calculaArea() ); //

60System.out.println( c.calculaArea() ); //

78.53}}

Polimorfismo y Ligadura Dinámica I

El polimorfismo consiste en la posibilidad de aplicar una misma operación sobre distintos objetos, y que esta operación varíe según el objeto al que se le aplique. Esto sucede en tiempo de ejecución, NO en tiempo de compilación, por lo que el polimorfismo está íntimamente ligado al enlace dinámico, como se verá a continuación. La operación suele ser un método. Los objetos a los que se les puede aplicar este método están limitados por herencia: ese método se define en una clase y es aplicable, con los refinamientos subsiguientes, a todas sus subclases.Al proceso de seleccionar el método apropiado según la clase del objeto se llama ligadura o enlace. Si ésta tiene que aplazarse obligatoriamente hasta el tiempo de ejecución, el mensaje supone un enlace dinámico (también conocido como tardío). Es decir, si todos los objetos son asociados estáticamente a una clase, y no se tiene en cuenta los posibles cambios de referencia, el método a aplicar puede determinarse en tiempo de compilación, sin que el sistema sufra ningún tipo de sobrecarga. Sin embargo, en la mayoría de los casos, es interesante que los cambios de referencia producidos en tiempo de ejecución influyan en el cómputo.

24

Polimorfismo y Ligadura Dinámica II

La ligadura estática significa que se fijan los tipos de todas las variables y expresiones en tiempo de compilación; la ligadura (o enlace) dinámica (también llamada ligadura tardía) se produce cuando no es posible conocer la clase del objeto hasta el tiempo de ejecución.La ligadura dinámica es la capacidad de retrasar hasta el instante de la recepción del mensaje la decisión sobre la clase del objeto que lo recibe y el método concreto que debe de ejecutarse.

// ... clases Figura, Rectángulo y Círculopublic class Ppal {

public static void main(String[] args){

Figura f;int opcion = pideOpcionAlUsuario();if ( opcion == 1 )

f = new Rectangulo(5, 10);else f = new Circulo(5);

// ? (50 o 78,5)System.out.println( “Área: “ + f.calculaArea() );

}}

Polimorfismo y Ligadura Dinámica III

Esta propiedad es una poderosa herramienta para simplificar el diseño de aplicaciones, pero hay que tratarla con precaución. El error más común provocado por el uso del polimorfismo es que, en un afán de simplificar, si se utilizan siempre los mismos nombres en las operaciones, se desvirtúa realmente el nombre del operador.La gran ventaja del polimorfismo es permitir la realización de las clases que definen un programa de forma totalmente independiente al programa donde se utilizan. Sólo será necesario definir cuidadosamente las clases abstractas.El polimorfismo facilita la reutilización de software, haciendo posible implementar software genérico que se pueda aplicar no sólo a objetos existentes, sino también a objetos que sean añadidos en etapas futuras del desarrollo.

25

Conceptos erróneos sobre polimorfismo

En algunos lenguajes OOP esta propiedad es confundida, erróneamente, con otra conocida como operator overloading (sobrecarga de operadores), que permite la redefinición de operadores como “+”, “-", ...Otro concepto asociado erróneamente al polimorfismo es la method overloading o sobrecarga de métodos, es decir, varios métodos que tienen el mismo nombre, pero el número de parámetros o los tipos de la lista de parámetros es distinto.Tanto la sobrecarga de métodos como de operadores no es más que una riqueza sintáctica extra: en realidad, las llamadas a los métodos son enlazados en tiempo de compilación (ligadura o enlace estático) al método concreto que ofrece los argumentos en número y tipo igual a los de la llamada. En cualquier caso, si se desea considerar como polimorfismo, es un tipo de polimorfismo estático, y no es lo que se entiende habitualmente por este término..

Ejemplo sobrecarga de métodosclass Empleado {

// ...private float sueldo; // en Euros.// ...public void putSueldo(int pts) {

sueldo = pts * 166.386;}public void putSueldo(float euros) {

sueldo = euros;}

}

class Ppal {public static void main(String[] args){

Empleado empl = new Empleado();empl.putSueldo( 900.0 ); // El putSueldo() que acepta float.empl.putSueldo( 150000 ); // El putSueldo() que acepta int.

}}

26

Ejemplos de sintaxis en Java. Clases

public class RaizCuadrada{

public static double calculoRaiz(double y){

double raiz = 0;if (y <= 0) System.out.println("No se puede calcular la raiz de un número negativo");else raiz= Math.sqrt(y);

System.out.println("La raiz de "+y+" es "+raiz);return raiz;

}

public static double calculoRaiz(String z){

double y = Double.parseDouble(z);double raiz = 0;

if (y <= 0) System.out.println("No se puede calcular la raiz de un número negativo");else raiz= Math.sqrt(y);

System.out.println("La raiz de "+y+" es "+raiz);return raiz;

}}

/* Enunciado: Calcula la raiz cuadrada de un entero, escribe el mismo método pero pasándole un String* Objetivos (tipo básico int, clase contenedora Integer, métodos de Integer, return, clase final Math, métodos static) */