Está en la página 1de 92

Diplomado en Informática Aplicada

Asignatura: Estructuras de Datos Avanzadas

Tema 1: Programación Orientada a Objetos

Centro de Estudio de Ingeniería de Sistemas


(CEIS)
a

B ib li o g r a fí
Bibliografí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.


Contenido
Conceptos básicos
• Clase
• Objeto o instancia
• Atributos
• Métodos
• Constructores
• Visibilidad
• Implementación en C++ y Java
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.
Ejemplo: Enviar flores a una persona
de otra ciudad
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
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.
Conceptos básicos
Mensaje: Forma de solicitar una acción a un objeto.

Cliente Servidor
Mensaje
Emisor Receptor

Objeto, Objeto
Usuario,
Aplicación
Conceptos básicos
Una 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
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.
Implementación
// En Java // En C++
class Circulo { class Circulo {
} };

class TCirculo { 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.
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]
};
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.
Notación UML para
Ejemplos: representar una clase

Florista
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
Atributos o variables miembros
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
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.

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


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).
// en Java Ejemplos
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
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.


// en Java
class Circulo {
static int numCirculos = 0;
Ejemplos
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.
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.
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 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.
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).


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.
Tipos de funciones miembros

• Funciones (procedimientos)
• Constructores
• Destructores

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


procedimientos.
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.
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.
Definiendo métodos
<tipo-retorno/void> nombre ([lista de parámetros]) {
//cuerpo del método
}

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

Lista de parámetros
Conjunto 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.
Definiendo métodos
<tipo-retorno/void> nombre ([lista de parámetros]) {
//cuerpo del método
}

Lista de parámetros
Puede 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.
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


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


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 ambos
Esto 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.
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.
Ejemplo en Java
// en Java, fichero.java
class Date {
int d;
public:
int D() {
return d;
}
}
Ejemplo en C++
// en C++, fichero.h // en C++, fichero.h
class Date { class Date {
int d; int d;
public: public:
//por defecto es inline int D();
int D(){return d;} };
};
//En fichero.cpp
inline int Date::D() {
return d;
}
//otra variante
int Date::D() {
return d;
}
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.
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.
Métodos en Java
Los métodos native, son métodos que se encuentran
escritos en otro lenguaje de
programación .

Los métodos synchronized son métodos especiales


para cuando varios hilos pueden acceder
concurrentemente a los mismos datos.
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.
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.
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 {…} //ok
int Fecha::M()const{//error
return ++m;
}
Constructor
Es un tipo especial de método utilizado para crear
objetos o instancias de una clase.

Características
• 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.
Constructor
Características

• 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.
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.
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.
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.
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); //día y mes del año 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: 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) {}
};
Constructores (en C++)
// Variante 2: parte en el .h y otra en el .cpp
// en el .h
class Fecha {
private: Sólo es preciso declarar la
int d; interfaz del método

public:
Fecha(int, int, int);
};
//en .cpp
Fecha::Fecha(int pD, int pM, int pA) {
d = pD;
m = pM;
a = pA;
}
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”


válido para referirse a un objeto de la clase Circulo.

La referencia contiene la dirección de memoria donde


se encuentra el objeto.
Creando instancias en Java
En Java solo se crean instancias de manera explícita
urilizando el operador new.
constructor
Referencia al objeto

Circulo circulo = new Circulo();

Nombre de la clase

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.
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.
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.
Composición de clases
Los atributos de una clase pueden ser instancias de
otras clases.
class Circulo {
Punto punto;
float radio;
};

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


se denomina composición.

Circulo Punto

Cuando una instancia se construye deben construirse


también 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()) {}
};
Composición 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 parámetros en Java
En 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.
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.


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.
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: sólo 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 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.
Visibilidad en Java
Acceso desde:
Visibilidad
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
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.
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.
Funciones amigas (en C++)
class ClaseA {
int a;
public:
ClaseA(int pA): a(pA){}
int A(){return a;}
Las funciones amigas requieren
friend int B(ClaseA&);
int C(){return B(*this);} la especificación de objeto para
}; acceder a los miembros.

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
Clases amigas (en C++)
class ClaseB;
class ClaseA { TClaseA declara a TClaseB
friend ClaseB;
int a;
como amiga.
char AA(){return a;} Esto permite que TClaseB
public: acceda a todos los atributos y
ClaseA(int pA){a = pA;} métodos de la clase TClaseA
int A(){return a;} 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 función pertenezca o


no a la clase.
Visibilidad en C++

Privados (private)
Públicos (public)
Protegidos (protected)

Públicos Protegidos Privados

Atributos

Métodos
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.
Encapsulamiento

INTERFAZ de la CLASE

CLASE
CLAS E
Datos y
Funciones Miembros
Privadas, Protegidas y
de Paquete

Atributos Públicos Métodos Públicos

instancia1 instancia2
Encapsulamiento
El encapsulamiento permite:

• Ocultar detalles de implementación.

• 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 método 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);

Punto1: 200, 200


Punto2: 200, 200
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
Acceso a variables de instancia y método
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 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.


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.
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.
Acceso a métodos
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 círculo.
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);
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,
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ácticas
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 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.
C++ y Java
El 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.

También podría gustarte