Professional Documents
Culture Documents
Centro de Estudio de Ingeniera de Sistemas (CEIS) Instituto Superior Politcnico Jos Antonio Echeverra (CUJAE)
Bibliografa
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.
Contenido
Conceptos bsicos Clase Objeto o instancia Atributos Mtodos Constructores Visibilidad Implementacin en C++ y Java
Paradigma OO
Resultado de la evolucin natural de la programacin, devenido en metodologa de programacin de propsito general que simula la forma en que el hombre trabaja y cuya idea bsica es que percibimos al mundo que nos rodea como una variedad de objetos.
Conceptos bsicos
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 bsica de la POO. Ejemplo: Mara la florista Perla la florista Jos el florista
Conceptos bsicos
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 mtodos para producir comportamiento. Cada objeto tiene una direccin nica en memoria lo que le da identidad.
Conceptos bsicos
Mensaje: Forma de solicitar una accin a un objeto.
Cliente Emisor
Conceptos bsicos
Una clase es: una categora de objetos con caractersticas comunes. una plantilla que se usa para crear mltiples objetos con caractersticas similares. Las clases engloban las caractersticas 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
Conceptos bsicos
Las clases son tipos de variables o tipos de datos creados por el usuario. Se puede extender un lenguaje de programacin adicionando nuevos tipos de datos especficos acorde a las necesidades del problema a resolver. Las clases pueden estar formadas por variables miembros y funciones miembros.
Implementacin
// En Java class Circulo { } class TCirculo { } // En C++ class Circulo { }; class TCirculo { };
Buenas Prcticas: Nombrar las clases utilizando la notacin Camell, comenzando o no con la letra T para indicar que es un tipo de datos. Colocar la apertura de ambiente en la misma lnea o en una lnea aparte.
Implementacin
// 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] };
Conceptos bsicos
Cada clase puede estar compuesta por: Atributos: definen el estado de la clase. atributos pasivos, variables miembros, campos. Mtodos: definen el comportamiento de la clase. funciones miembros, atributos activos, operaciones, comportamiento, responsabilidades.
Ejemplos:
Nombre Variables Miembros Salario Edad Funciones miembros Vender flores Enviar flores a otra ciudad Bombillo Consumo Variables Miembros Enceder Apagar Funciones miembros Aumentar Brillo Disminuir brillo
Sintaxis
//en Java [visibilidad] [static] [final] [transient] [volatile] <Tipo> <nombreAtributo>; //en C++ Tipo nombreAtributo;
Variables de clases
Define un atributo para toda la clase. Aplica para la clase y para todas sus instancias. Slo almacena una copia con independencia de la cantidad de objetos. Existe aunque no se haya creado ningn objeto de la clase. Debe ser definida como static.
// en Java class Circulo { static int numCirculos = 0; double x, y, r; } // en C++ class Circulo { static int numCirculos = 0; double x, y, r; };
Ejemplos
Las variables de clases son buenas para la comunicacin entre diferentes objetos de la clase o para llevar un registro de informacin relativa a toda la clase. Ejemplo: el nmero total de crculos creados.
// en Java class 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; };
Ejemplos
Buenas prcticas Definir cada atributo en una lnea independiente aunque sean del mismo tipo. Hace el cdigo ms legible y permite comentar mejor.
Modificadores de atributos
La palabra reservada final calificando a un atributo o variable sirve para declarar constantes. Si adems es static, slo 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 declaracin y no se puede modificar.
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 como transient (transitorios).
Modificadores de atributos
Si una clase contiene atributos de objeto que son modificados asncronamente por distintos threads (hilos) que se ejecutan concurrentemente, puede utilizar atributos volatile. Esto le indica a la mquina virtual Java que debe cargar el atributo desde memoria antes de utilizarlo y volver a almacenarlo en memoria despus, para que cada hilo pueda verlo en un estado coherente.
Mtodos de clase
Estn disponibles para cualquier instancia de la clase y para otras clases. No se requiere una instancia de la clase para poder invocar a un mtodo de clase. Para definir los mtodos de clase hay que anteponer a la definicin del mtodo la clusula static.
Definiendo mtodos
Cada objeto requerimientos. puede satisfacer slo ciertos
Los requerimientos que puede resolver el objeto estn definidos por su interfaz y los tipos que hay en ella. Cuando se hace un requerimiento a un objeto un mtodo es llamado.
Definiendo mtodos
La definicin bsica de un mtodo cuenta de: Tipo de retorno (tipo de objeto o tipo primitivo) Nombre del mtodo Lista de parmetros Cuerpo del mtodo
<tipo-retorno/void> nombre([parmetros]) { //cuerpo del mtodo } //en Java [<visibilidad>]<tipo-retorno/void> nombre([parmetros]) { //cuerpo del mtodo }
Las tres primeras partes se conocen como interfaz o firma del mtodo.
Definiendo mtodos
<tipo-retorno/void> nombre ([lista de parmetros]) { //cuerpo del mtodo }
Tipo-retorno Es el tipo primitivo o la clase del valor devuelto. void indica que no hay valor de retorno. Nombre Debe expresar claramente lo que se hace en el cuerpo del mtodo.
Definiendo mtodos
<tipo-retorno/void> nombre ([lista de parmetros]) { //cuerpo del mtodo }
Lista de parmetros Conjunto de declaraciones de variables (tipo-variables) separadas por coma que reciben valor al invocar al mtodo. Aunque dos parmetros tengan el mismo tipo no se puede abreviar. Los prametros se convierten en variables locales en el cuerpo del mtodo. Si un parmetro se declara const (en C++) o final (en Java) no se puede variar en el cuerpo del mtodo.
Definiendo mtodos
<tipo-retorno/void> nombre ([lista de parmetros]) { //cuerpo del mtodo }
Lista de parmetros Puede que un mtodo no tenga parmetros. Los parmetros se inicializan en cada llamada al mtodo al cual pertenecen con los valores especificados al llamarlos. En C++ se permite que los parmetros tengan valores por defecto.
Definiendo mtodos
<tipo-retorno/void> nombre ( [lista de parmetros] ) { //cuerpo del mtodo }
En el cuerpo del mtodo se pueden definir: Expresiones Condicionales Ciclos Llamadas a mtodos de otras clases, etc. A menos que aparezca como tipo de retorno void en el cuerpo del mtodo hay que devolver la variable del tipo indicado en cualquier punto mediante la clsula return.
Ejemplo en Java
public class Circulo { static int numCirculos = 0; double x, y, r; //mtodo de objeto para comparar crculos public Circulo elMayor(Circulo c) { if (r >= c.r) return this; else return c; } // mtodo de clase para comparar crculos public static Circulo elMayor(Circulo c, Circulo d) { if (c.r >= d.r) return c; else return d; } }
Ejemplo
Utilizando los mtodos de clase, Java ofrece entre otras la clase Math, donde define un conjunto de operaciones matemticas. As, desde cualquier mtodo de una clase se puede invocar al mtodo de clase sqrt definido en la clase Math:
float raiz = Math.sqrt(345);
Sobrecarga de mtodos
Tanto en Java como en C++ es posible definir varios mtodos para la misma clase con el mismo nombre pero con diferencias en: En la lista de argumentos: el nmero el tipo de los argumentos o ambos Esto se conoce como sobrecarga de mtodos. Si se tratan de crear dos mtodos con la misma interfaz y diferentes tipos de retorno, la clase no se compila.
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 mtodos en un fichero <nombre>.cpp a menos que la funcin sea inline.
Ejemplo en Java
// en Java, fichero.java class Date { int d; public: int D() { return d; } }
Ejemplo en C++
// en C++, fichero.h class Date { int d; public: //por defecto es inline int D(){return d;} }; // en C++, fichero.h class Date { int d; public: int D(); }; //En fichero.cpp inline int Date::D() { return d; } //otra variante int Date::D() { return d; }
Mtodos en Java
[Visibilidad] [static] [abstract] [final] [native] [synchronized] TipoDevuelto NombreMtodo ([ ListaParmetros]) [throws ListaExcepciones]
Los mtodos abstract se declaran en las clases abstract y no se implementa su cuerpo. Un mtodo declarado final no puede ser redefinido. Se comporta como una funcin inline en C++. Donde se llama se carga el cdigo completo del mtodo. El compilador puede decidir no cargarlo si el mtodo es muy grande.
Mtodos en Java
Los mtodos native, son mtodos que se encuentran escritos en otro lenguaje de programacin . Los mtodos synchronized son mtodos especiales para cuando varios hilos pueden acceder concurrentemente a los mismos datos.
El compilador alerta si la funcin fue declarada const y en su definicin se trata de cambiar el estado de la clase. El compilador alerta si el objeto fue declarado const y se trata de invocar un mtodo no constante.
Constructor
Es un tipo especial de mtodo utilizado para crear objetos o instancias de una clase. Caractersticas Su nombre coincide con el de la clase. No tiene valor de retorno (ni void) Una clase puede tener varios constructores (ejemplo tpico de sobrecarga de funciones), pero la lista de parmetros tiene que variar. Los constructores deben diferir en tipo y/o cantidad de parmetro.
Constructor
Caractersticas Si la clase tiene un constructor, todos los objetos de la clase deben ser inicializados invocndolo. Si el constructor tiene parmetros 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 parmetros e inicializa cada atributo con el valor nulo por defecto. Si un constructor no tiene parmetros se considera el constructor por defecto.
Constructores en C++
Existe un tipo especial de constructor llamado constructor copia, cuyo parmetro 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.
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;} }
Ejemplo en C++
class Fecha { private: int d; int m; int y; public: Fecha(); //constructor por defecto Fecha(int, int); //da y mes del ao actual Fecha(int, int, int); Fecha(const TDate&) //constructor copia };
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; }
Se crea una referencia llamada c a un objeto de la clase Circulo. Crear una referencia es como crear un nombre vlido para referirse a un objeto de la clase Circulo. La referencia contiene la direccin de memoria donde se encuentra el objeto.
El operador new crea una nueva instancia de la clase, reserva memoria para ella e invoca al constructor. La instruccin anterior adems asigna a la referencia circulo el objeto creado.
Declara la variable date de tipo TDate (objeto) e invoca al constructor quien inicializa sus atributos con los valores pasados por parmetro.
Se declara un puntero a la clase TDate (myBirthday) y se llama al operador new que calcula el tamao del objeto, devuelve el tipo correcto de puntero, invoca al constructor de la clase y asigna la direccin al puntero.
Composicin de clases
Los atributos de una clase pueden ser instancias de otras clases.
class Circulo { Punto punto; float radio; };
La relacin tiene-un que se estable entre las clases se denomina composicin. Circulo Punto
Cuando una instancia se construye deben construirse tambin todas sus instancias miembros.
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()) {} };
Composicin de clases
class 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);
Visibilidad en Java
Controla el acceso a los miembros, tanto a atributos como a mtodos. 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.
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 del paquete. private: slo puede ser usado por las funciones miembros de la clase.
Visibilidad en Java
Cuando no se especifican permisos de acceso (public, private o protected) se supone la opcin por defecto, que es package. Si no se ha definido ningn paquete, se utiliza el package por defecto que es el directorio donde estn definidas las clases. Es preciso especificar la visibilidad de cada miembro ya sea atributo o mtodo de forma independiente.
Visibilidad en Java
Acceso desde: Visibilidad private protected public por defecto Propia clase X X X X subclases No segn X No paquete No X X X Todas las clases No No X No
como amiga. Esto permite que TClaseB acceda a todos los atributos y mtodos de la clase TClaseA aunque sean privados.
class ClaseB { int b; public: ClaseB(int pB){b = pB;} int B(ClaseA& pClaseA){return pClaseA.a;} char BB(ClaseA& pClaseA){return pClaseA.AA();} };
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 funcin pertenezca o no a la clase.
Visibilidad en C++
Privados (private) Pblicos (public) Protegidos (protected)
Mtodos
Encapsulamiento
Es una de las propiedades de la POO que define que el objeto debe ser una cpsula o caja negra que encapsula su funcionamiento y estructura interna. Slo se ven desde afuera los miembros (la interfaz para el caso de los mtodos) con visibilidad pblica.
Buenas Prcticas: los atributos deben ser privados o protegidos y se debe acceder a ellos a travs de los mtodos que pueden ser pblicos.
Encapsulamiento
INTERFAZ de la CLASE
CLASE
CLASE Datos y Funciones Miembros Privadas, Protegidas y de Paquete Atributos Pblicos Mtodos Pblicos
instancia1
instancia2
Encapsulamiento
El encapsulamiento permite: Ocultar detalles de implementacin. Simplificar el programa. Minimizar el impacto del cambio. Garantizar integridad de los datos.
Referencias en Java
Una 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 mtodo como argumento no se usan objeto, ni copias de objetos sino referencias a los objetos. Ejemplo: Point pt1, pt2; Punto1: 200, 200 pt1 = new Point (100, 100); Punto2: 200, 200 pt2 = pt1; pt1.x= 200; pt1.x= 200; System.out.println(Punto1: = + pt1.x + , + pt1.y); System.out.println(Punto2: = + pt2.x + , + pt2.y);
Referencias en Java
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);
Referencias en Java
Punto p1; Punto p2; p1 = new Punto(100, 100); Punto1: 200, 200 p2 = new Punto(300, 300); Punto2: 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); Hay que probar esto
Para referirse a variables de instancias y mtodos de objetos se puede usar la notacin de punto: c: referencia al objeto + operador . + nombre de la variable miembro r (c.r). Estas expresiones de evalan de izquierda a derecha.
Para accesar y cambiar las variables de clases se puede usar la notacin 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.
Acceso a mtodos
Se pueden combinar llamadas de mtodos 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 estndar del sistema. Los objetos PrintStream tienen un mtodo println que enva una cadema al flujo de salida.
Acceso a mtodos
public 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 crculo.
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.
Alcance de variables
Java busca primero una variable en el bloque actual, despus en el mtodo. 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 mtodo con ambas:
this.sum // se refiere a la variable de instancia sum // se refiere a la variable local
Buenas prcticas Hay que ser muy cauteloso al nombrar todos los tipos de variables
Alcance de variables
En C++, las clases tienen su propio mbito.
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.
C++ y Java
La pila: Se ubica en el rea de la memoria RAM y el almacenamiento en ella es extremadamente rpido y eficiente. El compilador de Java debe saber mientras crea el programa, el tamao 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.
C++ y Java
El heap: Es un rea de propsito 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 ms tiempo que asignar espacio en la pila.