Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en...

92
Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de Sistemas (CEIS) Instituto Superior Politécnico “José

Transcript of Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en...

Page 1: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Asignatura: Estructuras de Datos Avanzadas

Tema 1: Programación Orientada a Objetos

Diplomado en Informática Aplicada

Centro de Estudio de Ingeniería de Sistemas (CEIS)

Instituto Superior Politécnico “José Antonio Echeverría” (CUJAE)

Page 2: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

BibliografíaBibliografía

• An introduction to Object-Oriented Programming. Timothy Budd. Addison Wesley, 1991.

• The C++ Programming Language. Third Edition. Bjarne Stroustrup. Addison Wesley, 1997.

• Thinking in Java. Third Edition. Bruce Eckel, 2002.

Page 3: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Contenido

Conceptos básicos • Clase• Objeto o instancia• Atributos • Métodos• Constructores• Visibilidad• Implementación en C++ y Java

Page 4: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Paradigma OO

Resultado de la evolución natural de la programación, devenido en metodología de programación de propósito general que simula la forma en que el hombre trabaja y cuya idea básica es que percibimos al mundo que nos rodea como una variedad de objetos.

Page 5: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo: Enviar flores a una persona de otra ciudad

Page 6: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Conceptos básicos

Un Objeto es una entidad con una estructura de datos interna bien definida, junto a un conjunto de acciones que describen su comportamiento. Es la unidad básica de la POO.

Ejemplo:

María la florista

Perla la florista

José el florista

Page 7: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Conceptos básicos

•Un objeto o instancia es una variable concreta de una clase con su propia copia de variables miembros.

Un objeto tiene estado, comportamiento e identidad.

• Tiene datos internos que le dan el estado.• Tiene métodos para producir comportamiento.• Cada objeto tiene una dirección única en memoria lo que le da identidad.

Page 8: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Objeto

MensajeCliente Servidor

Emisor Receptor

Objeto,Usuario,Aplicación

Mensaje: Forma de solicitar una acción a un objeto.

Conceptos básicos

Page 9: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Conceptos básicosUna clase es:• una categoría de objetos con características comunes.• una plantilla que se usa para crear múltiples objetos con características similares.

Las clases engloban las características de un conjunto particular de objetos.

Cuando se escribe un programa en un lenguaje orientado a objetos no se definen objetos individuales sino clases de objetos.

Ejemplo: Florista

Page 10: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Conceptos básicos

• Las clases son tipos de variables o tipos de datos creados por el usuario.

• Se puede extender un lenguaje de programación adicionando nuevos tipos de datos específicos acorde a las necesidades del problema a resolver.

• Las clases pueden estar formadas por variables miembros y funciones miembros.

Page 11: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Implementación

// En Javaclass Circulo {}

class TCirculo {}

Buenas Prácticas:• Nombrar las clases utilizando la notación Camell, comenzando o no con la letra T para indicar que es un tipo de datos.• Colocar la apertura de ambiente en la misma línea o en una línea aparte.

// En C++class Circulo {};

class TCirculo {};

Page 12: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Implementación

// Sintaxis en Java[<visibilidad>]class Circulo { [<miembros>]}

// Sintaxis en C++

class <nombre de la clase>

{

private: [lista de miembros]

protected: [lista de miembros]

public: [lista de miembros]

};

Page 13: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Conceptos básicos

Cada clase puede estar compuesta por:

• Atributos: definen el estado de la clase.• atributos pasivos,• variables miembros,• campos.

• Métodos: definen el comportamiento de la clase. • funciones miembros, • atributos activos, • operaciones,• comportamiento,• responsabilidades.

Page 14: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Variables Miembros

Funciones miembros

FloristaNombreSalarioEdad

Vender flores

Enviar flores a otra ciudad

Ejemplos:

Variables Miembros

Funciones miembros

BombilloConsumo

Enceder

Apagar

Aumentar Brillo

Disminuir brillo

Notación UML para representar una clase

Page 15: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Los atributos son características, propiedades que hacen que un objeto se diferencie del otro. Pueden determinar apariencia, cualidades, estado, etc.

Los atributos se definen por variables.

Para cada variable se define su tipo.

Tanto en Java como en C++ es posible definir:• Variables o atributos de clase• Variables o atributos de objeto o de instancia

Atributos o variables miembros

Page 16: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Sintaxis

//en Java

[visibilidad] [static] [final] [transient] [volatile]

<Tipo> <nombreAtributo>;

//en C++Tipo nombreAtributo;

Page 17: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Variables de clases

• Define un atributo para toda la clase.

• Aplica para la clase y para todas sus instancias.

• Sólo almacena una copia con independencia de la cantidad de objetos.

• Existe aunque no se haya creado ningún objeto de la clase.

• Debe ser definida como static.

Page 18: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Variables de objetos o de instancia

• Define un atributo de un objeto en particular. • Cada instancia u objeto almacena su propia copia de variables de objeto.

• Los atributos son por defecto de objetos o de instancia a menos que se califiquen como static (de clase).

Page 19: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplos// en Javaclass Circulo { static int numCirculos = 0; double x, y, r;} // en C++class Circulo { static int numCirculos = 0; double x, y, r;};

Las variables de clases son buenas para la comunicación entre diferentes objetos de la clase o para llevar un registro de información relativa a toda la clase.

Ejemplo: el número total de círculos creados.

Page 20: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplos// en Javaclass Circulo { static int numCirculos = 0; double x; // coordenada x double y; // coordenada y double r; // radio} // en C++class Fecha { int d; int m; int a; static TDate defaultDate;};

Buenas prácticas Definir cada atributo en una línea independiente aunque sean del mismo tipo.Hace el código más legible y permite comentar mejor.

Page 21: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Modificadores de atributos

La palabra reservada final calificando a un atributo o variable sirve para declarar constantes. Si además es static, sólo se puede acceder a dicha constante anteponiendo el nombre de la clase, sin instanciarla.

El valor de un atributo final tiene ser asignado en su declaración y no se puede modificar.

Page 22: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Modificadores de atributos

Los atributos de un objeto se consideran, por defecto, persistentes. Esto significa que al almacenar objetos en un fichero, los valores de dichos atributos deben almacenarse.

Aquellos atributos que no forman parte del estado persistente del objeto porque almacenan estados transitorios o puntuales del objeto, se declaran comotransient (transitorios).

Page 23: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Modificadores de atributos

Si una clase contiene atributos de objeto que son modificados asíncronamente por distintos threads (hilos) que se ejecutan concurrentemente, puede utilizar atributos volatile.

Esto le indica a la máquina virtual Java que debe cargar el atributo desde memoria antes de utilizarlo y volver a almacenarlo en memoria después, para que cada hilo pueda “verlo” en un estado coherente.

Page 24: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Métodos o funciones miembros

El comportamiento de una clase se implementa a través de sus métodos o funciones miembros.

Una clase o un objeto puede llamar métodos de otras clases para:• Indicar a otro objeto que cambie• Pedir a otro objeto que haga algo

Es posible definir: • Métodos de instancia: aplican a cada objeto de la clase.

• Métodos de clase (en Java).

Page 25: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Métodos de clase

• Están disponibles para cualquier instancia de la clase y para otras clases.

• No se requiere una instancia de la clase para poder invocar a un método de clase.

• Para definir los métodos de clase hay que anteponer a la definición del método la cláusula static.

Page 26: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Tipos de funciones miembros

• Funciones (procedimientos)• Constructores• Destructores

En C++ y en Java todas son funciones, no existen procedimientos.

Page 27: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Definiendo métodos

• Cada objeto puede satisfacer sólo ciertos requerimientos.

• Los requerimientos que puede resolver el objeto están definidos por su interfaz y los tipos que hay en ella.

• Cuando se hace un requerimiento a un objeto un método es llamado.

Page 28: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Definiendo métodos

La definición básica de un método cuenta de:• Tipo de retorno (tipo de objeto o tipo primitivo)• Nombre del método• Lista de parámetros• Cuerpo del método

<tipo-retorno/void> nombre([parámetros]) { //cuerpo del método}//en Java[<visibilidad>]<tipo-retorno/void> nombre([parámetros]) { //cuerpo del método}

Las tres primeras partes se conocen como interfaz o firma del método.

Page 29: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Definiendo métodos

<tipo-retorno/void> nombre ([lista de parámetros]) { //cuerpo del método}

Tipo-retornoEs el tipo primitivo o la clase del valor devuelto. void indica que no hay valor de retorno.

NombreDebe expresar claramente lo que se hace en el cuerpo del método.

Page 30: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Definiendo métodos<tipo-retorno/void> nombre ([lista de parámetros]) { //cuerpo del método}

Lista de parámetrosConjunto de declaraciones de variables (tipo-variables) separadas por coma que reciben valor al invocar al método. Aunque dos parámetros tengan el mismo tipo no se puede abreviar.Los párametros se convierten en variables locales en el cuerpo del método. Si un parámetro se declara const (en C++) o final (en Java) no se puede variar en el cuerpo del método.

Page 31: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Definiendo métodos<tipo-retorno/void> nombre ([lista de parámetros]) { //cuerpo del método}

Lista de parámetrosPuede que un método no tenga parámetros.Los parámetros se inicializan en cada llamada al método al cual pertenecen con los valores especificados al llamarlos.En C++ se permite que los parámetros tengan valores por defecto.

Page 32: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Parámetros-Valores por defecto

• Una función miembro puede tener o no valores por defecto.

• Si los tiene, a partir del primero que sea por defecto, el resto tiene que ser por defecto.

• Los valores por defecto no pueden redeclararse.

class Clase { void f(int = 1); void h(int); //error, 2do tiene que ser por defecto void g(int = 1, int, int =2); void m(int, int, int =2); // ok};

void Clase::f(int pP = 2) //error, no puede redeclararse

Page 33: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Definiendo métodos<tipo-retorno/void> nombre ( [lista de parámetros] ) { //cuerpo del método}

En el cuerpo del método se pueden definir:• Expresiones• Condicionales• Ciclos• Llamadas a métodos de otras clases, etc.

A menos que aparezca como tipo de retorno void en el cuerpo del método hay que devolver la variable del tipo indicado en cualquier punto mediante la clásula return.

Page 34: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo en Java

public class Circulo { static int numCirculos = 0; double x, y, r; //método de objeto para comparar círculos public Circulo elMayor(Circulo c) { if (r >= c.r) return this; else return c; }

// método de clase para comparar círculos public static Circulo elMayor(Circulo c, Circulo d) { if (c.r >= d.r) return c; else return d; }}

Page 35: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo

Utilizando los métodos de clase, Java ofrece entre otras la clase Math, donde define un conjunto de operaciones matemáticas.

Así, desde cualquier método de una clase se puede invocar al método de clase sqrt definido en la clase Math:

float raiz = Math.sqrt(345);

Page 36: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Sobrecarga de métodos

Tanto en Java como en C++ es posible definir varios métodos para la misma clase con el mismo nombre pero con diferencias en:

En la lista de argumentos:• el número• el tipo de los argumentos• o ambosEsto se conoce como sobrecarga de métodos.

Si se tratan de crear dos métodos con la misma interfaz y diferentes tipos de retorno, la clase no se compila.

Page 37: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Definiendo clases

En Java:• todo es una clase. No se pueden definir variables o funciones que no pertenezcan a una clase.

• las clases se declaran y se implementan en el mismo fichero (<nombre>.java).

En C++:• es posible definir variables y funciones que no pertenezcan a una clase.

• las clases se declaran en un fichero <nombre>.h y se implementan sus métodos en un fichero <nombre>.cpp a menos que la función sea inline.

Page 38: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo en Java

// en Java, fichero.javaclass Date { int d;public: int D() { return d; }}

Page 39: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo en C++

// en C++, fichero.hclass Date { int d;public: //por defecto es inline int D(){return d;}};

// en C++, fichero.hclass Date { int d;public: int D();};

//En fichero.cppinline int Date::D() { return d;}//otra varianteint Date::D() { return d;}

Page 40: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Funciones inline (C++)

• Útil para funciones pequeñas y frecuentemente usadas.

• El llamado a la función se sustituye por el código.

• Su definición se replica en cada unit que incluya la unit en que fue definida.

Page 41: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Métodos en Java

[Visibilidad] [static] [abstract] [final] [native] [synchronized]TipoDevuelto NombreMétodo ([ ListaParámetros])[throws ListaExcepciones]

Los métodos abstract se declaran en las clases abstract y no se implementa su cuerpo.

Un método declarado final no puede ser redefinido. Se comporta como una función inline en C++. Donde se llama se carga el código completo del método. El compilador puede decidir no cargarlo si el método es muy grande.

Page 42: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Métodos en Java

Los métodos native, son métodos que se encuentran escritos en otro lenguaje deprogramación .

Los métodos synchronized son métodos especiales para cuando varios hilos pueden acceder concurrentemente a los mismos datos.

Page 43: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Métodos constantes (C++)

Una función miembro se declara constante (usando const) para indicar que no altera el estado de la clase.

• Un parámetro también puede ser declarado constante.

• El compilador alerta si la función fue declarada const y en su definición se trata de cambiar el estado de la clase.

• El compilador alerta si el objeto fue declarado const y se trata de invocar un método no constante.

Page 44: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Métodos constantes (C++)

• Si el método se implementa fuera de la clase debe llevar el sufijo const en su interfaz.

• Una función miembro const puede ser invocada por objetos constantes y no constantes.

• Una función miembro no constante solo puede ser llamada por objetos no constantes.

Page 45: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Métodos constantes (C++)

class Fecha{private: int d; int m;public: int D() const {return d;} void IncDia(int); int M() const;};

int Fecha::M(){…} // error, falta const int Fecha::M() const {…} //okint Fecha::M()const{//error return ++m;}

Page 46: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Constructor

• Su nombre coincide con el de la clase.• No tiene valor de retorno (ni void)• Una clase puede tener varios constructores (ejemplo

típico de sobrecarga de funciones), pero la lista de parámetros tiene que variar.

• Los constructores deben diferir en tipo y/o cantidad de parámetro.

Es un tipo especial de método utilizado para crear objetos o instancias de una clase.

Características

Page 47: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Constructor

• Si la clase tiene un constructor, todos los objetos de la clase deben ser inicializados invocándolo.

• Si el constructor tiene parámetros al invocarlo hay que suministrarlos.

• De no definirse un constructor para la clase, el compilador genera un constructor por defecto.

• El constructor por defecto, no tiene parámetros e inicializa cada atributo con el valor nulo por defecto.

• Si un constructor no tiene parámetros se considera el constructor por defecto.

Características

Page 48: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Constructores en C++

• Existe un tipo especial de constructor llamado constructor copia, cuyo parámetro es una referencia a una instancia de la clase.

• El constructor copia debe copiar cada miembro de la clase.

• No hay constructores virtuales ya que al construir se debe conocer el tipo exacto del objeto.

Page 49: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Uso del this

El this es un puntero (C++) o referencia (Java) al objeto.

El programador no lo crea ni lo inicializa. Cuando se llama a una función miembro, el código oculto genera el this con la dirección del objeto y lo pasa como parámetro.

Page 50: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Uso del this

En el cuerpo de método se puede referir al objeto actual, desde donde fue llamado el método, utilizando el this.

En Java, sólo se puede usar this dentro del cuerpo de la definición de un método de instancia, nunca en el cuerpo de un método de clase.

Page 51: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo en Java

public class Circulo { static int numCirculos = 0; public static final double PI=3.14159265358979323846; public double x, y, r; public Circulo(double x, double y, double r) { this.x = x; this.y = y; this.r = r; numCirculos++; } public Circulo(double r) { this(0.0, 0.0, r); } public Circulo(Circulo c) { this(c.x, c.y, c.r); } public Circulo() { this(0.0, 0.0, 1.0); } public double Perimetro() {return 2.0 * PI * r;} public double Area() {return PI * r * r;}}

Page 52: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Uso del thispublic class Rectangulo {

private static int numRectangulos = 0;

protected double x1, y1, x2, y2;

public Rectangulo(double p1x, double p1y,

double p2x, double p2y) {

x1 = p1x;

x2 = p2x;

y1 = p1y;

y2 = p2y;

numRectangulos++;

}

public Rectangulo(){ this(0, 0, 1.0, 1.0); }}

En Java, con this se invoca al constructor general desde otro constructor.

Page 53: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo en C++

class Fecha {private: int d; int m; int y;public: Fecha(); //constructor por defecto Fecha(int, int); //día y mes del año actual Fecha(int, int, int); Fecha(const TDate&) //constructor copia};

Page 54: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Uso del this// en Javapublic Circulo(double pX, double pY, double pR) { this.x = pX; // x es un atributo this.y = pY; this.r = pR; numCirculos++;}// en C++class Fecha { int d;…public: Fecha(int, int, int); Fecha& IncD(int);}; // en .cppFecha& Fecha::IncD(int pInc) { d += pInc; return *this;}

Page 55: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Constructores (en C++)

// Variante 1: inicialización de miembros // todo en el fichero .h class Fecha { private: int d; int m; int a;public: Fecha(int pD, int pM, int pY) : d(pD), m(pM), a(pA) {}};

Page 56: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Constructores (en C++)

// Variante 2: parte en el .h y otra en el .cpp // en el .hclass Fecha { private: int d; …public: Fecha(int, int, int);};//en .cppFecha::Fecha(int pD, int pM, int pA) { d = pD; m = pM; a = pA;}

Sólo es preciso declarar la interfaz del método

Page 57: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Constructor copia (en C++)

<Nombre clase>(<Nombre clase>&<variable>)

TDate(TDate&)

Tiene que ser por referencia (&), porque si se pasa por valor se hace una copia en la pila y con ello se invoca al constructor copia recursivamente.

Fecha::Fecha(Fecha& pFecha) { d = pFecha.d; m = pFecha.m; a = pFecha.a;}

Page 58: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Creando una instancia en Java

Circulo c = new Circulo();// equivale aCirculo c;c = new Circulo();

Se crea una referencia llamada c a un objeto de la clase Circulo.

Crear una referencia es como crear un “nombre” válido para referirse a un objeto de la clase Circulo.

La referencia contiene la dirección de memoria donde se encuentra el objeto.

Page 59: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Creando instancias en Java

En Java solo se crean instancias de manera explícita urilizando el operador new.

Circulo circulo = new Circulo();

El operador new crea una nueva instancia de la clase, reserva memoria para ella e invoca al constructor.

La instrucción anterior además asigna a la referencia circulo el objeto creado.

Nombre de la clase

Referencia al objetoconstructor

Page 60: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Creando una instancia en C++

Hay dos formas de crear instancias en C++.• Objetos locales (Estática)• Objetos arbitrarios (Dinámica)

Los objetos locales se crean y se destruyen automáticamente.

TDate date(30,9,2000);

Declara la variable date de tipo TDate (objeto) e invoca al constructor quien inicializa sus atributos con los valores pasados por parámetro.

Page 61: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Creando una instancia en C++

Los arbitrarios (dinámicos) tienen duración arbitraria, los crea y los destruye el usuario con new y delete respectivamente.

TDate* myBirthday = new TDate (30,9,2000);

Se declara un puntero a la clase TDate (myBirthday) y se llama al operador new que calcula el tamaño del objeto, devuelve el tipo correcto de puntero, invoca al constructor de la clase y asigna la dirección al puntero.

Page 62: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Composición de clases

Cuando una instancia se construye deben construirse también todas sus instancias miembros.

Circulo Punto

class Circulo { Punto punto; float radio;};

Los atributos de una clase pueden ser instancias de otras clases.

La relación tiene-un que se estable entre las clases se denomina composición.

Page 63: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Ejemplo en C++

class Punto {

private:

int x;

int y;

public:

int X() const {return x;}

int Y() const {return y;}

Punto(int pX = 0,int pY = 0): x(pX),y(pY) {}

Punto(Punto& pPunto):

x(pPunto.X()), y(pPunto.Y()) {}

};

Page 64: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Composición de clasesclass Circulo {

Punto punto;

float radio;

public:

Circulo(int pX=0,int pY=0,float pRadio=1):

radio(pRadio), punto(pX,pY){}

Circulo(Punto pPunto, float pRadio=1):

radio(pRadio), punto(pPunto){}

};

Circulo* circulo = new Circulo(1,2,3);

Punto punto = Punto(2,4);

Circulo* circulo2 = new Circulo(punto,8);

Page 65: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Paso de parámetros en JavaEn Java, los parámetros pasan como siguen:

• Los tipos básicos o primitivos se pasan por valor.

• Los arreglos y los objetos se pasan por referencia por lo que si se modifican en el cuerpo del método al salir su valor queda alterado.

Page 66: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Paso de parámetros en C++

Los parámetros se pueden pasar por:• Valor.• Referencia.• Puntero.

En los dos últimos casos si se modifican en el cuerpo del método al salir su valor queda alterado.

Cuando se pasa un objeto por referencia o por puntero y se quiere evitar lo anterior, se declara const.

El pase por referencia o por puntero es más eficiente.

Page 67: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Visibilidad en Java

Controla el acceso a los miembros, tanto a atributos como a métodos.

El acceso en C++ puede ser:• private, protected y public• El acceso es por defecto private.

El acceso en Java puede ser:• private, protected, package y public• El acceso es por defecto package.

Page 68: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Visibilidad en Java

public: puede ser usada por cualquier clase.

protected: puede ser usada por:• funciones miembros de la clase, • funciones miembros de las subclases.• funciones miembros de las clases del propio

paquete.

package: puede ser utilizada por todas las clases delpaquete.

private: sólo puede ser usado por las funciones miembros de la clase.

Page 69: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Visibilidad en Java

Cuando no se especifican permisos de acceso (public, private o protected) se supone la opción por defecto, que es package.

Si no se ha definido ningún paquete, se utiliza el package por defecto que es el directorio donde están definidas las clases.

Es preciso especificar la visibilidad de cada miembro ya sea atributo o método de forma independiente.

Page 70: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Visibilidad en Java

Visibilidad

Acceso desde:

Propia clase subclases paquete Todas las clases

private X No No No

protected X según X No

public X X X X

por defecto X No X No

Page 71: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Funciones amigas (en C++)

• No son miembros de la clase (disminuye el tamaño del objeto).

• Una función amiga se define fuera del alcance de la clase pero tienen acceso a los miembros privados de la clase.

• La amistad es independiente del control de acceso, por lo que se coloca en cualquier parte de la definición de la clase.

• Coloque la palabra friend antes de la declaración de la función.

• Las funciones amigas pueden definirse inline.• La amistad no es simétrica.

Page 72: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Funciones amigas (en C++)

• No funciona el this porque no es miembro de la clase.• No se puede declarar como amiga ni: - Constructor, - Destructor, - Funciones virtuales

Stroutrup, sugiere usarlas:• Para evitar miembros de datos públicos• Una función amiga para más de una clase.

Page 73: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Funciones amigas (en C++)class ClaseA { int a;public: ClaseA(int pA): a(pA){} int A(){return a;} friend int B(ClaseA&); int C(){return B(*this);} };

int B(ClaseA& pClaseA){ return pClaseA.a + 5; // ok, puede acceder a lo privado}

ClaseA claseA(3);int i = claseA.A(); // i=3i = claseA.B(claseA); // error, B no es miembro de TClaseA i = claseA.C(); // i=8

Las funciones amigas requieren la especificación de objeto para acceder a los miembros.

Page 74: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Clases amigas (en C++)

class ClaseB { int b;public: ClaseB(int pB){b = pB;} int B(ClaseA& pClaseA){return pClaseA.a;} char BB(ClaseA& pClaseA){return pClaseA.AA();} };

class ClaseB;class ClaseA { friend ClaseB; int a; char AA(){return a;}public: ClaseA(int pA){a = pA;} int A(){return a;}};

TClaseA declara a TClaseB como amiga.Esto permite que TClaseB acceda a todos los atributos y métodos de la clase TClaseA aunque sean privados.

Page 75: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Visibilidad en C++class TExample{private: [lista de miembros]protected: [lista de miembros]public: [lista de miembros]};

private: Utilizados por funciones miembros de la propia clase o por amigas de la clase.

protected: Utilizados por funciones miembros o amigas de la propia clase y por funciones miembros y amigas de cualquier clase derivada.

public: Utilizados por cualquier función pertenezca o no a la clase.

Page 76: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Visibilidad en C++

Privados (private)

Públicos (public)

Protegidos (protected)

Públicos Privados

Métodos

Atributos

Protegidos

Page 77: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Encapsulamiento

Es una de las propiedades de la POO que define que el objeto debe ser una cápsula o caja negra que encapsula su funcionamiento y estructura interna.

Sólo se ven desde afuera los miembros (la interfaz para el caso de los métodos) con visibilidad pública.

Buenas Prácticas: los atributos deben ser privados o protegidos y se debe acceder a ellos a través de los métodos que pueden ser públicos.

Page 78: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Encapsulamiento

instancia1 instancia2

CLASE

INTERFAZ de la CLASE

CLASEDatos y

Funciones Miembros Privadas, Protegidas y

de Paquete

Atributos Públicos Métodos Públicos

Page 79: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Encapsulamiento

El encapsulamiento permite:

• Ocultar detalles de implementación.

• Simplificar el programa.

• Minimizar el impacto del cambio.

• Garantizar integridad de los datos.

Page 80: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Referencias en JavaUna referencia es un apuntador que se usa para indicar el valor de un objeto.

Cuando se asigna un objeto a una variable o se pasa un objeto a un método como argumento no se usan objeto, ni copias de objetos sino referencias a los objetos.

Ejemplo:Point pt1, pt2;pt1 = new Point (100, 100);pt2 = pt1;pt1.x= 200;pt1.x= 200;System.out.println(“Punto1: = ” + pt1.x + ”, “ + pt1.y);System.out.println(“Punto2: = ” + pt2.x + ”, “ + pt2.y);

Punto1: 200, 200Punto2: 200, 200

Page 81: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Referencias en Java

Punto1: 200, 200Punto2: 200, 200

Punto p1;Punto p2;p1 = new Punto(100, 100);p2 = p1;p1.x = 200;p1.x = 200;System.out.println(“Punto1: = ” + p1.x + “, ” + p1.y);System.out.println(“Punto2: = ” + p2.x + “, ” + p2.y);

Page 82: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Referencias en Java

Punto p1;Punto p2;p1 = new Punto(100, 100);p2 = new Punto(300, 300);p2 = p1;p1.x = 200;p1.x = 200;System.out.println(“Punto1: = ” + p1.x + “, ” + p1.y);System.out.println(“Punto2: = ” + p2.x + “, ” + p2.y);

Punto1: 200, 200Punto2: 100, 100

Hay que probar esto

Page 83: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Acceso a variables de instancia y método

En JavaCirculo c = new Circulo(2.0, 2.0, 4.0);

System.out.println("Radio = “ + c.r +

"unidades.");

c.r = 5; // se cambia el valor del radio

Para referirse a variables de instancias y métodos de objetos se puede usar la notación de punto:

c: referencia al objeto + operador . + nombre de la variable miembro r (c.r).

Estas expresiones de evalúan de izquierda a derecha.

Page 84: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Acceso a variables de clase

Circulo c = new Circulo(2.0, 2.0, 4.0);

System.out.println(c.numCirculos + “ círculos

creados.");

Circulo.numCirculos = 5; // se cambia el valor

Para accesar y cambiar las variables de clases se puede usar la notación de punto utilizando tanto el nombre de la instancia como de la clase a la izquierda del punto.

Se sugiere usar el nombre de la clase, ya que el nombre de la instancia puede resultar confuso.

Page 85: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Acceso a métodos

Se pueden combinar llamadas de métodos anidados y referencias a variables de instancia.

System.out.println();

Systems describe el comportamiento para el sistema en que se está ejecutando Java

System.out es una variable de clase que contiene una instancia de la clase PrintStream.

Este objeto de PrintStream representa la salida estándar del sistema.

Los objetos PrintStream tienen un método println que envía una cadema al flujo de salida.

Page 86: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Acceso a métodospublic Circulo elMayor(Circulo c) { if (this.r>=c.r) return this; else return c;}public static Circulo elMayor(Circulo c, Circulo d) { if (c.r>=d.r) return c; else return d;}

Circulo c = c1.elMayor(c2);Circulo c = Circulo.elMayor(c1, c2);

Ambas funciones (sobrecargadas) retornan una referencia al objeto que constituye el mayor círculo.

Page 87: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Acceso a variables y métodos en C++

En función de como se cree el objeto hay dos formas de acceder a los atributos y funciones miembros.

1- objeto.<atributo o función miembro>

Fecha fecha(5,1,2000);fecha.IncA(4);

2- objeto-><atributo o función miembro>

Fecha* miCumple = new Fecha(5,1,2000);miCumple->IncA(4);

Page 88: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Alcance de variables

En C++, existen variables:•Globales•Locales•Variables de instancia •Variables de clase

En Java, existen variables:•Locales•Variables de instancia •Variables de clase En Java no existen variables globales.

Page 89: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Alcance de variablesJava busca primero una variable en el bloque actual, después en el método. Si la variable no es local, la busca como variable de instancia o variable de clase. Si no la encuentra, la busca en las superclases.

Si una variable de instancia tiene el mismo nombre de una variable local (sum) y es preciso trabajar en el método con ambas:

this.sum // se refiere a la variable de instancia

sum // se refiere a la variable local

Buenas prácticasHay que ser muy cauteloso al nombrar todos los tipos de variables

Page 90: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

Alcance de variables

int a = 1; // variable global

class TClase { int a;public: TClase(int); };

TClase clase(5);TClase.a; // error, trata de encontrala en el // ámbito de TClase y es privada.

En C++, las clases tienen su propio ámbito.

Page 91: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

C++ y JavaLa pila: Se ubica en el área de la memoria RAM y el almacenamiento en ella es extremadamente rápido y eficiente. El compilador de Java debe saber mientras crea el programa, el tamaño exacto y el tiempo de vida de todos los datos que se almacenan en la pila.

Esto limita la flexibilidad de los programas, así que aun cuando algunos almacenamientos en Java son en la pila, en particular las referencias y los objetos en Java no son puestos en la pila.

Page 92: Asignatura: Estructuras de Datos Avanzadas Tema 1: Programación Orientada a Objetos Diplomado en Informática Aplicada Centro de Estudio de Ingeniería de.

C++ y JavaEl heap: Es un área de propósito general ubicada en la memoria RAM y donde se almacenan todos los objetos en Java. El compilador no necesita saber cuanto espacio debe reservar en el heap, ni por cuanto tiempo. Sin embargo asignar espacio en el heap toma más tiempo que asignar espacio en la pila.