Sunteți pe pagina 1din 92

Asignatura: Estructuras de Datos Avanzadas

Tema 1: Programacin Orientada a Objetos


Diplomado en Informtica Aplicada
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.
Ejemplo: Enviar flores a una persona
de otra ciudad
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.

Objeto
Mensaje
Cliente
Servidor
Emisor Receptor
Objeto,
Usuario,
Aplicacin
Mensaje: Forma de solicitar una accin a un objeto.
Conceptos bsicos
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 {
}

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.
// En C++
class Circulo {
};

class TCirculo {
};

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.
Variables Miembros

Funciones miembros
Florista
Nombre
Salario
Edad
Vender flores
Enviar flores a otra ciudad
Ejemplos:
Variables Miembros

Funciones miembros
Bombillo
Consumo
Enceder
Apagar
Aumentar Brillo
Disminuir brillo
Notacin UML para
representar una clase
Los atributos son caractersticas, 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
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.


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).

Ejemplos // en Java
class 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
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.
Ejemplos
// 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;
};

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 o funciones miembros
El comportamiento de una clase se implementa a
travs de sus mtodos o funciones miembros.

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

Es posible definir:
Mtodos de instancia: aplican a cada objeto de la
clase.

Mtodos de clase (en Java).
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.

Tipos de funciones miembros
Funciones (procedimientos)
Constructores
Destructores
En C++ y en Java todas son funciones, no existen
procedimientos.
Definiendo mtodos
Cada objeto puede satisfacer slo ciertos
requerimientos.

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.

Parmetros-Valores por defecto
Una funcin 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
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;
}
Funciones inline (C++)
til para funciones pequeas y frecuentemente
usadas.

El llamado a la funcin se sustituye por el cdigo.

Su definicin se replica en cada unit que incluya la
unit en que fue definida.

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.
Mtodos constantes (C++)
Una funcin miembro se declara constante (usando
const) para indicar que no altera el estado de la
clase.

Un parmetro tambin puede ser declarado
constante.

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.

Mtodos constantes (C++)
Si el mtodo se implementa fuera de la clase debe
llevar el sufijo const en su interfaz.

Una funcin miembro const puede ser invocada por
objetos constantes y no constantes.

Una funcin miembro no constante solo puede ser
llamada por objetos no constantes.
Mtodos 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 {} //ok
int Fecha::M()const{//error
return ++m;
}
Constructor
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.
Es un tipo especial de mtodo utilizado para crear
objetos o instancias de una clase.
Caractersticas
Constructor
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.
Caractersticas
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.
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 funcin miembro, el cdigo oculto
genera el this con la direccin del objeto y lo pasa
como parmetro.

Uso del this
En el cuerpo de mtodo se puede referir al objeto
actual, desde donde fue llamado el mtodo,
utilizando el this.

En Java, slo se puede usar this dentro del cuerpo
de la definicin de un mtodo de instancia, nunca en
el cuerpo de un mtodo de clase.
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;}
}
Uso del this
public 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.
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
};
Uso del this
// en Java
public 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 .cpp
Fecha& Fecha::IncD(int pInc) {
d += pInc;
return *this;
}
Constructores (en C++)
// Variante 1: inicializacin 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) {}
};
Constructores (en C++)
// Variante 2: parte en el .h y otra en el .cpp
// en el .h
class Fecha {
private:
int d;

public:
Fecha(int, int, int);
};
//en .cpp
Fecha::Fecha(int pD, int pM, int pA) {
d = pD;
m = pM;
a = pA;
}
Slo es preciso declarar la
interfaz del mtodo
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;
}
Creando una instancia en Java
Circulo c = new Circulo();
// equivale a
Circulo 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
vlido para referirse a un objeto de la clase Circulo.

La referencia contiene la direccin de memoria donde
se encuentra el objeto.
Creando instancias en Java
En Java solo se crean instancias de manera explcita
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 instruccin anterior adems asigna a la referencia
circulo el objeto creado.
Nombre de la clase
Referencia al objeto
constructor
Creando una instancia en C++
Hay dos formas de crear instancias en C++.
Objetos locales (Esttica)
Objetos arbitrarios (Dinmica)

Los objetos locales se crean y se destruyen
automticamente.

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 parmetro.
Creando una instancia en C++
Los arbitrarios (dinmicos) tienen duracin 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 tamao del
objeto, devuelve el tipo correcto de puntero, invoca
al constructor de la clase y asigna la direccin al
puntero.
Composicin de clases
Cuando una instancia se construye deben construirse
tambin todas sus instancias miembros.
Circulo
Punto
class Circulo {
Punto punto;
float radio;
};
Los atributos de una clase pueden ser instancias de
otras clases.
La relacin tiene-un que se estable entre las clases
se denomina composicin.
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);
Paso de parmetros en Java
En Java, los parmetros pasan como siguen:

Los tipos bsicos 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 mtodo al
salir su valor queda alterado.
Paso de parmetros en C++
Los parmetros se pueden pasar por:
Valor.
Referencia.
Puntero.

En los dos ltimos casos si se modifican en el cuerpo
del mtodo 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 ms eficiente.
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

Visibilidad
Acceso desde:
Propia clase subclases paquete Todas las clases
private X No No No
protected X segn X No
public X X X X
por defecto X No X No
Funciones amigas (en C++)
No son miembros de la clase (disminuye el tamao
del objeto).
Una funcin 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
definicin de la clase.
Coloque la palabra friend antes de la declaracin
de la funcin.
Las funciones amigas pueden definirse inline.
La amistad no es simtrica.
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 pblicos
Una funcin amiga para ms de una clase.

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=3
i = claseA.B(claseA); // error, B no es miembro de TClaseA
i = claseA.C(); // i=8
Las funciones amigas requieren
la especificacin de objeto para
acceder a los miembros.

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
mtodos de la clase TClaseA
aunque sean privados.
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)

Pblicos Privados
Mtodos

Atributos
Protegidos
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
instancia1
instancia2
CLASE
INTERFAZ de la CLASE
CLASE
Datos y
Funciones Miembros
Privadas, Protegidas y
de Paquete
Atributos Pblicos Mtodos Pblicos

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;
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, 200
Punto2: 200, 200
Referencias en Java
Punto1: 200, 200
Punto2: 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);

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, 200
Punto2: 100, 100
Hay que probar esto
Acceso a variables de instancia y mtodo
En Java
Circulo 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 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.
Acceso a variables de clase
Circulo c = new Circulo(2.0, 2.0, 4.0);
System.out.println(c.numCirculos + crculos
creados.");
Circulo.numCirculos = 5; // se cambia el valor

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.
Acceso a variables y mtodos en C++
En funcin de como se cree el objeto hay dos formas
de acceder a los atributos y funciones miembros.

1- objeto.<atributo o funcin miembro>

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

2- objeto-><atributo o funcin miembro>

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

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
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.

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.

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